هل يستخدم pitchfork ذاكرة كبيرة جداً؟

هل يلاحظ أحد آخر نفس الشيء؟ إنه منتدى متواضع نسبيًا من حيث الحجم وحركة المرور. هناك أربعة عمليات عاملة لـ Pitchfork، ويبدو أن واحدة منها تتعامل مع الغالبية العظمى من الطلبات الواردة وتستهلك ذاكرة أكثر من غيرها. هناك الكثير من الذاكرة الافتراضية (Swap) قيد الاستخدام، وعند إعادة إنشاء Pitchfork عمدًا، ينخفض هذا الاستخدام بشكل كبير. لذلك أستنتج أن عمليات Pitchfork تحتوي حاليًا على العديد من الصفحات الباردة التي تم تبديلها إلى الذاكرة الافتراضية.

هذا بعد 20 يومًا من التشغيل، على جهاز بذاكرة عشوائية (RAM) سعتها 4 غيغابايت وذاكرة افتراضية سعتها 4 غيغابايت.

لن يكون من الجيد نفاد الذاكرة الافتراضية. ولن يكون من الجيد أيضًا أن نجد كل تلك الذاكرة الافتراضية تُعاد إلى الذاكرة الرئيسية (Paged back in)، وهو ما قد يحدث عندما يقوم Pitchfork في النهاية بجمع القمامة (Garbage Collection).

هل يلاحظ أي شخص آخر شيئًا مشابهًا؟ يرجى مشاركة تكوين الجهاز!

# ps aux | sort -n -k 4 | egrep pitchf\|MEM |tail
root     2167652  0.0  0.0   5912  1792 pts/0    S+   20:07   0:00 grep -E --color=auto pitchf|MEM
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1000       15094  0.0  0.2 497544 10988 ?        Sl   Jul28   0:17 pitchfork monitor - 
1000       15704  0.0  2.5 6799124 97836 ?       Sl   Jul28   1:00 pitchfork (gen:0) service - ready
1000       15097  0.0  4.8 6791252 189724 ?      Sl   Jul28   5:26 pitchfork (gen:0) mold - ready
1000       15959  0.0  8.1 6815508 319708 ?      Sl   Jul28  12:05 pitchfork (gen:0) worker[3] - requests: 6684, waiting
1000       15900  0.0  9.2 6864596 360696 ?      Sl   Jul28  17:43 pitchfork (gen:0) worker[2] - requests: 14756, waiting
1000       15795  0.1 10.3 6884756 405420 ?      Sl   Jul28  48:36 pitchfork (gen:0) worker[1] - requests: 97007, waiting
1000       15734  2.1 12.8 11299708 500120 ?     Sl   Jul28 637:50 pitchfork (gen:0) worker[0] - requests: 2229848, waiting

# free
               total        used        free      shared  buff/cache   available
Mem:         3904968     1874636       98840      678812     1931492     1160916
Swap:        4194288     1226600     2967688


# vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 1226600 115820  65288 1866284    1    1    20    38    0    3  3  1 97  0  0
 0  0 1226600 113208  65296 1866296    0    0     0    14  411  478  1  1 98  0  0
 0  0 1226600 112956  65304 1866336    0    0     1    23  438  528  2  1 97  0  0
 0  0 1226600 112704  65308 1866360    0    0     1    31  518  603  5  1 94  0  0
 0  0 1226600 112704  65308 1866364    0    0     0    11  347  387  1  1 98  0  0

تُظهر مخرجات vmstat أنه لا يوجد حاليًا أي ضغط على الذاكرة - لا توجد نشاطات تبديل (Paging). قلقي هو أن هناك خطرًا، وليس أن توقيعي الحالي يعمل بشكل سيء.

cpu0

على نحوٍ أكثر جدية، هل من الطبيعي أن يكون العامل الذي يقوم بكل العمل أعلى بـ 100 ميغابايت فقط من متوسط الذاكرة (RSS)؟ يبدو الأمر طبيعياً لي، أم أنني أغفل شيئاً؟

أودّ أن أرى الإحصائيات من منتديات أكثر ازدحامًا. يبدو أن العدد التراكمي للطلبات مهم، ومنتدائي ليس مزدحمًا على الإطلاق.

نعم، فروقات RSS متواضعة نسبيًا، لكن التراوح بين 300 ميغابايت و500 ميغابايت يمثل فرقًا كبيرًا نسبيًا.

الأمر الأكثر لفتًا للانتباه هو استخدام الذاكرة الافتراضية (Swap). قبل إعادة التدوير، أرى:

# free
               total        used        free      shared  buff/cache   available
Mem:         3904968     1888140       77308      679004     1939520     1147220
Swap:        4194288     1226344     2967944

وبعد إعادة التدوير:

# free
               total        used        free      shared  buff/cache   available
Mem:         3904968     1486412     1422380      640744      996176     1587908
Swap:        4194288      309892     3884396

يبدو لي أن إعادة التدوير حرّرت 1300 ميغابايت (فرق بين used+swap).

لا أعتقد أنني رأيت حاجةً لهذا القدر من الذاكرة الافتراضية عند استخدام unicorn: ومن هنا جاء العنوان.

كما ذكرت، أهتم برؤية أرقام من حالات أخرى.

من الطبيعي أن يتولى عميل واحد من عملاء Pitchfork معظم الحمل - حيث يتم اختيار العملاء الآخرين فقط عندما يكون العميل الأول مشغولًا. كما أنه من الطبيعي أن يتزايد حجم الذاكرة بمرور الوقت. على الرغم من أنه يجب أن يصل في النهاية إلى حالة مستقرة، بعد أن يتم تسخين كل شيء مثل ذاكرة التخزين المؤقت / ruby-JIT.

إليك رسم بياني من أحد عناقيد الإنتاج لدينا، على مدى فترة 7 أيام. يتتبع هذا الرسم العملية الواحدة التي لديها أعلى استخدام للذاكرة. تشير الخطوط الخضراء المنقطة إلى عمليات النشر (أي عمليات البدء الجديدة لـ Pitchfork):

لذا يمكنك أن ترى أنه يتزايد بعد الإطلاق الأولي، ثم يستقر عند أقل بقليل من 1.4 جيجابايت. يقوم هذا العنقود بخدمة مئات المواقع، لذا ربما لا يكون هذا أفضل مقارنة من حيث الأرقام… لكنني أتمنى أن يكون تصور النمو مفيدًا.

البحث في أرقام RSS لكل عملية لا يخبرك بالقصة كاملة. Pitchfork هو “خادم ويب يعتمد على التفرع”. لذا فهو يشغل عملية ‘القالب’، ثم يتم تفرع جميع العمال منها بنمط ذاكرة الكتابة عند التفرع (copy-on-write). لذا، بينما قد تظهر RSS 500 ميجابايت للعامل [0]، فإن حوالي 200 ميجابايت منها مشتركة مع القالب وجميع العمال الآخرين.

في المستقبل القريب، نأمل في تمكين ميزة “إعادة التفرع” في Pitchfork. تقوم هذه الميزة بقتل العمال دوريًا، وإعادة تفرعهم من عامل دافئ بالفعل، بحيث يتشاركون أكبر قدر ممكن من الذاكرة بمرور الوقت. ومع ذلك، هناك حاجة إلى بعض العمل للتأكد من أن جميع أكوادنا متوافقة مع هذا النوع من النمط :crossed_fingers:

تصويرة مفيدة، شكرًا. لن أقول إن الأمر قد استقر تمامًا، لكن معدل النمو ليس مرتفعًا كما كان من قبل.

إعادة التفرّع الدورية تبدو أمرًا رائعًا لإدراجه — إن أمكن، يُرجى الإشارة إلى ذلك هنا عندما يتم تنفيذه.

هل يمكنك إلقاء الضوء على الخطوط الخضراء؟ أنا مهتم بمعرفة متى (إن حدث ذلك أصلًا) تقوم عمليات التفرّع بجمع القمامة، وما الذي يسببها، وما تأثيرها أثناء حدوثها.

الخطوط الخضراء تشير إلى مواعيد نشر التحديثات. بشكل أساسي: ./launcher rebuild app.

تقوم لغتا Ruby (وJS، التي نُشغّلها داخل عمليات Ruby عبر MiniRacer/v8) باستمرار بجمع القمامة أثناء التشغيل، واستجابةً للإشارات القادمة من نظام التشغيل. لذا، لا أعتقد أن هناك أي فائدة كبيرة يمكن تحقيقها من خلال القيام بأي إجراء يدوي.

شكرًا. سأكون مهتمًا برؤية كيف تسير الأمور على المدى الطويل، وهو ما لن يكون واضحًا على خادم يتم تحديثه بشكل متكرر نسبيًا. في حالتي، كان لدي 20 يومًا، ثم اخترت استخدام pitchfork لإعادة التشغيل، وهو ما أبلغني بشيء ما، لكنه أعاد ضبط العداد أيضًا.