مئات/آلاف tcp معقولة مع أعطها?
-
21-08-2019 - |
سؤال
أنا باستخدام Merb::مخبأ لتخزين txt/xml و قد لاحظت أن يعد أترك بلدي merbs تشغيل أكبر كمية من فتح مأخذ توصيل tcp لقد فتح -- وأعتقد أن هذا هو الذي يسبب بعض مشاكل الأداء.
lsof | grep 11211 | wc -l 494
merb 27206 root 71u IPv4 13759908 TCP localhost.localdomain:59756->localhost.localdomain:11211 (ESTABLISHED) merb 27206 root 72u IPv4 13759969 TCP localhost.localdomain:59779->localhost.localdomain:11211 (ESTABLISHED) merb 27206 root 73u IPv4 13760039 TCP localhost.localdomain:59805->localhost.localdomain:11211 (ESTABLISHED) merb 27206 root 74u IPv4 13760052 TCP localhost.localdomain:59810->localhost.localdomain:11211 (ESTABLISHED) merb 27206 root 75u IPv4 13760135 TCP localhost.localdomain:59841->localhost.localdomain:11211 (ESTABLISHED) merb 27206 root 76u IPv4 13760823 TCP localhost.localdomain:59866->localhost.localdomain:11211 (ESTABLISHED) merb 27206 root 77u IPv4 13760951 TCP localhost.localdomain:52095->localhost.localdomain:11211 (ESTABLISHED)
الخ...
بلدي ذات الصلة رمز :
if !exists?(:memcached) then register(:memcached, Merb::Cache::MemcachedStore, :namespace => 'mynamespace', :servers => ['127.0.0.1:11211']) end
&&
when :xml unless @hand_xml = Merb::Cache[:memcached].read("/hands/#{@hand.id}.xml") @hand_xml = display(@hand) Merb::Cache[:memcached].write("/hands/#{@hand.id}.xml", @hand_xml) end return @hand_xml
هذا الكود مباشرة خطأ أو أنا باستخدام إصدار خاطئ من memcache??
لدي أعطها 1.2.8 ويكون التالية:
libmemcached-0.25.14.tar.gz أعطها-0.13.جوهرة
هذا هو نوع من يقود لي مجنون..
المحلول
ك فكنت أحسب بعض الاشياء ..
1) يمكن أن يكون من المعقول أن يكون مئات / آلاف مآخذ توصيل أعطها على افتراض انك تستخدم مكتبة التي تستخدم epoll أو أي شيء آخر - ولكن، إذا كنت تستخدم روبي مثلي أنا لست على علم ليب التي تستخدم شيئا آخر غير تحديد () أو استطلاع () - ولهذا يضرب هذا السؤال / يريدون الخروج فورا
2) إذا كنت مثلي لديك فقط 1 الخادم أعطها تشغيل في الوقت الحالي واثنين من النغول / يخفف يركض رعاية requests..therefore اتصالات memcache الخاصة بك ينبغي أن غالبا. أن يكون هناك أكثر من عدد النغول / يخفف لديك على التوالي (على افتراض انك فقط التخزين المؤقت 1 أو مجموعتين من الأشياء) - التي كانت حالتي
وهنا الإصلاح:
والإعداد memcache من خلال جوهرة أعطها بدلا من merb :: ذاكرة التخزين المؤقت (الذي يلتف الواقع مهما memcache ليب كنت تستخدم
MMCACHE = Memcached.new("localhost:11211")
والحصول على / مجموعة القيم الخاصة بك:
@cache = MMCACHE.clone
begin
@hand_xml = @cache.get("/hands/#{@hand.id}.xml")
rescue
@hand_xml = display(@hand)
@cache.set("/hands/#{@hand.id}.xml", @hand_xml)
end
@cache.quit
والجلوس وشرب البارد سبب واحد الآن عند القيام بذلك:
lsof | grep 11211 | wc -l
وترى شيئا مثل 2 أو 3 بدلا من 2036!
والدعائم لالشعاب لالدلالة لي لأنه ليس من غير المألوف للاتصالات memcache أن تكون مستمرة لتبدأ
نصائح أخرى
وأنا قد تكون قادرة على المساعدة لكن أريد أن أروي قصة للقيام بذلك.ومن هنا.
ذات مرة كان هناك مجموعة من 10 أباتشي(ssl) ملقمات تكوين بالضبط 100 كل المواضيع.هناك أيضا مجموعة من 10 أعطها خوادم (على نفس مربعات) ، وأنهم جميعا بدا إلى العيش بسلام.كل أباتشي و أعطها كانت محروسة من قبل الشر monit الخفي.
ثم ملك تثبيت 11 أباتشي(ssl) server و أعطها بدأ تشغيل بشكل عشوائي كل بضع ساعات!الملك بدأ التحقيق ماذا وجد ؟ كان هناك خلل في php memcache وحدة الوثائق التي قال أن منشئ افتراضي memcache كائن اتصال لا مستمرة, ولكن على ما يبدو كان.ما حدث هو أن كل php الخيط (و هناك مثل 1000 منهم), فتح اتصال إلى كل أعطها في المسبح عندما احتاج واحد ، كما عقدت عليه.كانت هناك 10*100 وصلات إلى كل أعطها الخادم وكان على ما يرام ، ولكن مع 11 خوادم كان 1100 و 1024<1100.أقصى عدد مفتوح من مآخذ أعطها كان 1024.عندما تكون جميع المقابس اتخذت ، monit الشيطان لا ربط لذلك هو إعادة تشغيل أعطها.
كل قصة لديها أخلاقية.ماذا الملك تفعل كل هذا ؟ هو تعطيل الاتصالات المستمرة وأنهم جميعا يعيشون في سعادة دائمة مع عدد من الاتصالات على الكتلة وتبلغ ذروتها في 5 (خمسة).تلك كانت خوادم خدمة hudge كمية البيانات ، لذلك لم نتمكن من 1000 الغيار مآخذ كان أرخص للتفاوض memcache اتصال على كل طلب.
أنا آسف ولكن أنا لا أعرف روبي, يبدو أنك سيء كمية من المواضيع أو كنت التخزين المؤقت على أنها خاطئة.
حظا سعيدا!