PDA

View Full Version : اشتراک یک آرایه برای همه کاربران روی RAM



mehdi_kamari
یک شنبه 28 بهمن 1386, 22:27 عصر
سلام دوستان .
من میخوام یه آرایه و یا متغیری رو به اشتراک بذارم روی RAM به طوری که هر کسی که SCRIPT و اجرا میکنه بتونه از مقدار اون آرایه مطلع بشه و یا تغییرش بده .
یعنی یه متغیر GLOBAL با این تفاوت که برای همه قابل دسترس باشه .

tabib_m
دوشنبه 29 بهمن 1386, 14:25 عصر
کجا میخوای به اشتراک (!) بذاری؟
بین چه دستگاه هایی؟
هر کسی هر اسکریپتی رو اجرا کنه، اگر آرایه ای توی این اسکریپت استفاده شده باشه، از رم همون دستگاهی استفاده میشه که اسکریپت روش اجرا شده!

مگر این که منظورت این باشه که بخوای همه روی این آرایه کنترل داشته باشن (تغییرات برای همه اعمال بشه)، که میتونی از دیتابیس (یا فایل یا ...) استفاده کنی.

mehdi_kamari
دوشنبه 29 بهمن 1386, 21:44 عصر
راستش حرف آخرت رو میخوام . یعنی میخوام همه روزش کنترل داشته باشند ولی نمی تونم تو فایل یا DataBase بریزم و باید حتما رو RAM باشه . به خاطر سرعتش میگم

majoran
دوشنبه 29 بهمن 1386, 23:31 عصر
خوب اگه بخوای همچین کاری رو بکنی نتایج نا پایدار میشه و هیچ تغییری ذخیره نخواهد شد دوست عزیز بهتره از یه فایل استفاده کنی که همه کاربرا اونو داشته باشن یا به یه نحوی روی سیستم کاربرت پیاده بشه و برای نگه داری نتیجه باید حاصل کار روی فایل رو تو دیتابیست ذخیره کنی

tabib_m
سه شنبه 30 بهمن 1386, 22:27 عصر
به خاطر سرعتش میگم
از فایل استفاده کن.
سرعت رو اونقدری که فکر میکنی، پایین نمیاره.

mehdi_kamari
چهارشنبه 01 اسفند 1386, 03:21 صبح
حتی اگه 1000000 نفر همزمان بخوان اون و بخونن ؟
با این حساب فکر کنم DataBase گزینه بهتر باشه .
در هر صورت ممنونم ازت . باید تست بگیرم ببینم کدوم بهتر جواب میده .

vahid4134
چهارشنبه 01 اسفند 1386, 03:46 صبح
اگه حجم اطلاعاتت کمه (البته باید کم باشه که می خواستی روی رم بندازیش) و می خوای از دیتابیس استفاده کنی و سرعت برات مهم هست حتما از sqllite استفاده کن.

vahid4134
چهارشنبه 01 اسفند 1386, 03:51 صبح
یه چیز دیگه اگه 1000000 بخوان از سرور همزمان اطلاعات بگیرن که دیگه فاتحه سرور خوندست

mehdi_kamari
چهارشنبه 01 اسفند 1386, 15:28 عصر
راستش حجم اطلاعاتم زیاده . چیزی حدود 10MB ولی همرو نمی خوام به یکباره به RAM تزریق کنم . برای این هم میخوام رو رم بریزم چون بانکها امکان اتصال همزمان این تعداد کاربر رو نمی دن و برای انجام عملیت خودشون از صف استفاده می کنند . که نتیجه اون این هست که سرور میخوابه . در مورد سرور اصلا نگران نیستم و اینکه سرورم و قویتر بکنم دستم بازه . ولی میخوام به صورت آنلاین اصلاعات رو به یکباره برای چند دقیقه به RAM بفرستم تا همه بخونن ولی بعد اون و از روی RAM بر دارم .

کار بانک تو این حالت امکان نداره . یا شاید هم داره و من اطلاعاتم کمه .
دز هر صورت کل قضیه این بود . اگه پیشنهاد بهتری دارید بفرمایید . ممنون میشم .

تعداد هم روی یک میلیون درخواست همزمان حساب کنید . روی سرور هم هیچ مشکلی ندارم . چه تعداد و چه قدرتش .

vahid4134
چهارشنبه 01 اسفند 1386, 16:57 عصر
این برمی گرده به اکسشن نویسی برای php با زبان c .خود php همچین امکانی رو نمیده
اما می خوام تو رو با یه اکسشن pecl که معروفه و خیلی هم کم در موردش صحبت میشه آشنات کنم و اون هم apc هست. من هم اطلاعات درستی ازش ندارم و تازه می خوام بفهمم چیه.
یه چیز دیگه اطلاعات 10mb که اطلاعاتی نیست آخه عزیز
و اینکه چه تعداد کاربر همزنان بتونن کانکت بشن به کانفیگ برمی گرده که دست مدیر سرور هست (و فکر کنم همه چیز سرور دستت هست و می تونی زیادش کنی).
پیشنهاد من هم این هست که از sqllite استفاده کن یا از apc استفاده کن. فکر کنم apc میتونه اطلاعات رو روی ram کش کنه. بهتره منوال php رو ر این مورد بخونی
البته اگه یکم پروژت رو بازتر کنی که می خوای چیکار کنی شاید بهتر بتونم کمکت کنم
اما در مورد اینکه واقعا یک میلیون نفر می خوان همزمان کانکت بشن واقعا نمیشه. مگه اینکه ابر کامپیوتر باشه. اصلا کارت شبکه سرورها نمی تونه پاسخگو باشه و حتی cpu اونها هم نمی تونه پاسخگوی این همه درخواست باشه. برای این درخواستها از کلاستر کردن استفاده میشه (که هزینه های اضافی و سنگینی رو داره)

mehdi_kamari
چهارشنبه 01 اسفند 1386, 23:14 عصر
سلام وحید جان
خیلی محبت کردی دوست من .
راستش من بنا به دلایلی باید یه آرایه رو با طول دو میلیون تولید کنم و کاربران هر کدوم بیان و هر کدوم یکی از این و بر دارن تا آرایه تموم بشه . دلیل این کار من هم فقط به خاطر این هست که سمت DataBase کسی نره و کمی هم امنیت .
ولی اینکه گفتم یک میلیون نفر همزمان یکم زیاده روی کردم . راستش چیزی حدود صد و پنجاه هزار نفر همزمان هستند که به طور همزمان کارهای یکسانی انجام میدن . حتی توی یک لحظه مقداری رو به یک جدول خاص از DataBase میریزن که خیلی سنگین هست و من برای کم شدن این باز سنگین سعی می کنم بیشتر عملیات خودم و روی RAM تموم کنم .

حالا اگه تنظیمات خاصی برای بانک اطلاعاتی و یا سرور و یا هر چیزی که فکر میکنید به دردم میخوره بهم بدین ممنون میشم . راستش من مشکل سرور ندارم ولی مشکل اینکه تا حالا چنین چیزی رو تجربه نکردم دارم .


از همه مهمتر اینکه تعداد Connection به MySQL محدود هست و یا Apache نمیذاره تعداد Request ها بیشتر از یه تعدادی باشه .
در صورتی که در خواستهای موازی من خیلی بالاست و تاخیر توی کارش یعنی مرگ کل پروژه .

Farhadi
پنج شنبه 02 اسفند 1386, 02:03 صبح
سلام

به این کاری که شما میخوای انجام بدی میگن IPC مخفف InterProcess Communication
برای اطلاعات بیشتر اینجا رو ببین:
http://www.php.net/sem

Farhadi
پنج شنبه 02 اسفند 1386, 09:44 صبح
البته من خودم تا حالا از این توابع استفاده نکردم ولی اونطور که توی manual توضیح داده این توابع روی ویندوز کار نمیکنند و در میزان حافظه مصرفی هم محدودیت دارند.

یه سرچ کردم اینهم پیدا شد:
http://www.php.net/shmop

این دومی توی ویندوز ۲۰۰۰ به بعد هم ساپورت میشه و چیزی هم در مورد محدودیت مصرف حافظه ننوشته. اما ظاهرا این توابع و توابع قبلی به صورت پیش فرض غیر فعالند ولی اگر از سرور اختصاصی استفاده کنید مشکلی نخواهید داشت.

یک راه حل دیگه هم هست و اون اینه که یک socket server با php بنویسید که اجرا بشه و در حافظه باقی بمونه. این طوری سایر برنامه ها میتونند با استفاده از socket connection به این برنامه وصل شن و اطلاعات share شده را دریافت کنند. این روش مزیتش اینه که حافظه‌ی share شده محدود به همان سرور نیست و از هر جای دیگه‌ی دنیا میشه ازش استفاده کرد. و ضمنا مهم نیست که کلاینت ها به چه زبانی نوشته شده باشند. البته برای استفاده از این روش باید حتما یک پورت باز و آزاد روی سرور داشته باشید.

البته همه‌ی اینها در حد تئوری بود و باید در عمل تست کنید و ببینید کدامیک از این روش ها بهترین performance و کارایی رو برای شما داره.

vahid4134
پنج شنبه 02 اسفند 1386, 10:00 صبح
به نظر من دارید اشتباه فکر می کنید . به هرحال این چیزی که شما دارید فکر می کنید هیچگاه همزمان نیست. استفاده از ram کاری اشتباه هست. (مگر اینکه با دقت خاصی انجام بشه) چون ram خودش داره توسط apace و mysql , موارد دیگه استفاده میشه. (اطمینان ram هم کمتر هست و ممکنه اطلاعاتی از بین بره) سرعت سرورها به گونه ای هست که می تونن به سرعت به پاسخ ها جواب بده . البته شما باید روش رو عوض کنید. برای خواندن اطلاعات میشه از LDAP استفاده کرد. بسیاری از سایتها بزرگ که دارای چندین فاز می باشند برای سیستم auth خودشون از ldap استفاده می کنند که سرعت فوق العاده ای رو داره. فکرش رو کنید همزمان 10 تا سایت به این سرور درخواست میدن تا کاربر خودشون رو تعیین هویت کنند. بنابراین نگرانی شما با روی کار آمدن این موارد برطرف میشه.
از نظر من چونکه می خواهید اطلاعاتی رو هم ذخیره کنید به هر حال باید این اطلاعات جایی ذخیره بشه یا روی فایل یا روی دیتابیس. قرار نیست که روی ram ذخیره بشه. چون روی ram پاک خواهد شد. شما ببینید سایتهای دیگه برای این کار چه کرده اند.
شما دیتابیسها را دست کم نگیرید مخصوصا mysql رو. سرعت اونها واقعا بی نظیر هست. من یه تست وقتی که روی تیبل که 3000 رکورد داشت و اون رو با سه تا تیبل دیگه که اونها هم همین حدود تیبل رو داشتند جوین کردن و نتیجه رو گرفتم جوابی که به من داده بود 2 میلی ثانیه بود اون هم روی سروری که حدود ۱۰ تا vps روش داشت اجرا میشد.
به نظر من نباید نگران این موارد بود. برای این کار شما اصلا چرا از ab استفاده نمی کنید و مورد خودتون رو تست کنید همزمان 20000 هزار تا رکورد بفرستید اون هم از 1000 تا کاربر . جوابهای خوبی بهتون میده.
یه چیز دیگه به تنظیمان mysql هم توجه کنید . خود mysql از ram برای کش کردن استفاده می کنه می تونید این مورد رو بالا ببرید تا خود mysql این کار رو انجام بده (البته تنظیمش الان یادم نیست کدومش بود ولی می تونی خودت پیداش کنی)
نکته ای که هست اینه که اول با ab تست کن شاید واقعا این همه دردسر لازم نباشه

mehdi_kamari
پنج شنبه 02 اسفند 1386, 13:27 عصر
خوب اگه همزمان 20000 اتصال و جواب بده !!! (توی Config خودش 500 تا هست) س مشکل من با تقسیم و دسترسی زمانی حل میشه ولی این و واقعا نمی دونم .

یعنی اگه من مستقیم با بانک بخوام کار کنم و همزمان و بدون تاخیر اتصال و پاسخگویی بهم بده کمشکلم حل میشه . حتی اگه 20000 تا باشه که به 7 ثانیه تقسیمش میکنم و درخواستها رو با زمانهای مختبف میفرستم . ولی متاسفانه یه آمار دقیق از این اعداد و ارقام میخوام ارقامی مثل :

تعداد اتصال همزمان کاربران به MySQL
تعداد اتصال همزمان کاربران به Apache
تعداد زمان انتظار برای اینکه 150000 Request برای INSERT به MySQL ارسال میشه - روی یک جدول معمولی
اگه اینها OK بشه میتونم کارای دیگه رو به جای RAM جایگزین کنم و کارامو سمت DataBase انجام بدم . هرچند که کار با RAM فقط توی حرف ساده به نظر میرسه ولی خیلی درده سره !


راستش من تمام اتصال به بانک و توی پرو‍ژه خودم قطع کردم به جز یکی که همه درخواستها به طور همزمان روی اون فشار میاره .

vahid4134
پنج شنبه 02 اسفند 1386, 13:35 عصر
مهدی جان همه اینهایی که گفتی توی تنظیم های mysql و apache وجود داره. بهتره یه نگاهی به فایلهای کانفیگشون بندازی

mehdi_kamari
پنج شنبه 02 اسفند 1386, 13:55 عصر
وجود داره ولی اگه جواب بده . من میتونم عدد 500 و به مثلا 50000 هم تغییر بدم ولی آیا کشش داره ؟

مثل این میمونه که یه LOOP پر از INSERT بندازم توی یه جدول .
ولی باز ممنون . خیلی محبت کردی وحید جان پیگیر شدی .




خودم جبران میکنم :)

vahid4134
پنج شنبه 02 اسفند 1386, 14:17 عصر
خواهش می کنم
در صورتی که مقدار کش رو هم زیاد کنی و سرور هم جوابگو باشه مشکلی نداره