كيفية التوسع بشكل أكبر (2+ مليون مشاركة، +80 ألف شهريًا)

أود الاستفادة من خبرتك حول كيفية مواصلة توسيع نطاق أجهزتنا.

هذه هي بياناتنا الأساسية:

2.2 مليون منشور تنمو حاليًا بحوالي 80 ألف شهريًا
35 ألف مستخدم، ينمون بحوالي 1.5 ألف شهريًا

نحن نعمل حاليًا على جهاز افتراضي من Hetzner بـ 8 أنوية حصرية و 32 جيجابايت من ذاكرة الوصول العشوائي. بدأنا نرى قيودًا في ديسمبر مع اتصالات عامل Nginx أولاً وزدناها من 768 افتراضيًا إلى 1536. وصلنا إلى هذا الحد مرة أخرى بالأمس وزدناها إلى 3072 الآن. بعد هذه التغييرات، تسير الأمور بسلاسة مرة أخرى ولكننا نقترب من حد استخدام الخادم بنسبة 100٪.

تم تعيين db_work_mem على 80 ميجابايت، و db_shared_buffers على 8192 ميجابايت. نحن لا نستخدم ذاكرتنا المتاحة على الإطلاق ولكنني لست متأكدًا مما إذا كانت هناك مساحة لاستخدام المزيد والاستفادة منها. أفكار؟

#~> free -m

              total        used        free      shared  buff/cache   available
Mem:          31360        6105        1241        8423       24013       16412

خيار التوسع السهل التالي مع Hetzner سيكون 16 نواة و 64 جيجابايت من ذاكرة الوصول العشوائي وهو أمر جيد بالنسبة لنا من حيث التكاليف، لكنني أتساءل عما إذا كان لا يزال من المنطقي التوسع رأسيًا. كنت أفكر فيما إذا كان فصل التطبيق وقاعدة البيانات إلى خوادم مختلفة لن يكون منطقيًا أكثر أو ما إذا كان سيؤدي إلى المزيد من الصعوبات.

من قام بذلك؟ ما هي تجاربكم؟

لماذا تتطلع إلى التوسع؟ هل مقاييس وقت استجابة واجهة برمجة التطبيقات لديك تتدهور؟

ما هي الموارد التي تشير إليها هنا؟ وحدة المعالجة المركزية؟ مساحة القرص؟ الذاكرة؟

إعجابَين (2)

كم عدد مرات مشاهدة الصفحة التي لديك؟

تجاهل كل النصائح التي تجدها على الإنترنت واضبطها على 40-50٪ من ذاكرتك.

هل يمكنك مشاركة بعض مخرجات sar؟

إعجابَين (2)

لأنني أخطط للمستقبل. قد لا نحتاج إلى التوسع الآن ولكن بالنظر إلى النمو الذي نراه والحاجة المتزايدة للموارد التي شهدناها في الماضي، فأنا فقط أخطط للمستقبل الآن للتفكير في الخطوات التالية الممكنة.

بشكل أساسي وحدة المعالجة المركزية - بعد تحديث اليوم، نعود من الحمل ~ 8-9 في ساعات الذروة إلى ما يبدو أنه ~ 6ish الآن.

12 مليون شهريًا نمت من 6.5 مليون شهريًا قبل عام.

سأعود إلى مخرجات sar في وقت لاحق، لم أكن أقوم بتشغيلها.

ستحتاج إلى التحقيق في ماهية ما يستخدم وحدة المعالجة المركزية هذه بالضبط. يمكن أن يكون:

  • عمال الويب Unicorn
  • PostgreSQL
  • Sidekiq، مثل مهام الخلفية لتحسين الصور
  • Redis
  • nginx (غير مرجح)

اعتمادًا على الجاني، يمكننا اقتراح طرق لتخفيف العبء.

5 إعجابات

بالنظر إلى وقت وحدة المعالجة المركزية، أقول إنها في الغالب عمال يونيكورن:

إعجاب واحد (1)

ربما تتخلى عن فكرة وحدة المعالجة المركزية المخصصة وتستخدم هذا العرض هنا؟

يبدو هذا شيئًا أكثر ملاءمة لاحتياجاتك.

إعجابَين (2)

كنت أفكر بالفعل في هذا الخيار. لقد استخدمنا وحدات المعالجة المركزية غير المخصصة سابقًا ولم يؤد “الترقية” إلى وحدات مخصصة إلى تقدم كبير.

إعجاب واحد (1)

لست متأكدًا مما إذا كانت وحدة المعالجة المركزية هي عنق الزجاجة لديك. هل لديك أي مخرجات sar لمشاركتها في هذه الأثناء؟

نعم، أفعل، ولكن ليس في ساعات الذروة بعد. سأحصل عليها بحلول الغد.

لقد تم تقليل استخدام وحدة المعالجة المركزية بالتأكيد منذ أن قمت بزيادة اتصالات العاملين بالأمس - لست متأكدًا من مقدارها.

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle

08:45:01 AM     all     40.22      2.21      7.44      0.27      0.00     49.86
08:55:01 AM     all     42.84      2.89      8.02      0.16      0.00     46.09
09:05:01 AM     all     38.81      0.86      7.68      0.12      0.00     52.53
09:15:01 AM     all     38.80      0.70      7.66      0.10      0.00     52.73
09:25:01 AM     all     38.71      2.14      7.88      0.12      0.00     51.16
09:35:01 AM     all     38.74      0.84      7.86      0.09      0.00     52.47
09:45:01 AM     all     40.31      1.07      7.95      0.10      0.00     50.57
09:55:01 AM     all     40.03      1.37      7.90      0.08      0.00     50.62
10:05:01 AM     all     39.00      1.29      7.90      0.09      0.00     51.72
10:15:01 AM     all     40.26      2.68      8.07      0.09      0.00     48.91
10:25:01 AM     all     41.59      0.93      8.31      0.08      0.00     49.09
10:35:01 AM     all     40.39      1.55      8.25      0.07      0.00     49.73
10:45:01 AM     all     45.44      2.37      9.08      0.08      0.00     43.03
10:55:01 AM     all     50.56      2.20      9.23      0.06      0.00     37.95
11:05:01 AM     all     41.82      1.54      8.55      0.08      0.00     48.02
11:15:01 AM     all     38.74      1.54      8.11      0.10      0.00     51.50
11:25:01 AM     all     45.41      1.59      9.27      0.19      0.00     43.55
11:35:01 AM     all     38.45      1.78      8.20      0.11      0.00     51.45
11:45:01 AM     all     41.03      1.60      8.48      0.14      0.00     48.75
11:55:01 AM     all     40.65      1.17      8.36      0.15      0.00     49.67
12:05:01 PM     all     40.03      1.29      8.40      0.13      0.00     50.15
12:15:01 PM     all     40.47      1.10      8.19      0.11      0.00     50.13
إعجاب واحد (1)

ما هي إحصائيات sar المفيدة التي يجب مراعاتها؟

كنت أشك في أن Postgres لم يكن يحصل على ذاكرة كافية، مما قد يؤدي إلى ارتفاع نسبة %iowait.
ولكن نظرًا لأن مخرجات sar أعلاه لا تشير إلى نظام مثقل بالأعباء، فسيتعين علينا انتظار إحصائيات جديدة.

أحاول مساعدة شخص آخر في مشاكل الأداء. لقد قمنا بزيادة حجم مخزن PostgreSQL المؤقت. أعتقد أن ذلك ساعد قليلاً ولكن ملف تعريف الأداء المصغر لا يزال يظهر أكثر من 300 مللي ثانية. استخدام وحدة المعالجة المركزية حوالي 30٪ لـ 16 وحدة معالجة مركزية.

إعجاب واحد (1)

يبدو أن هذا لن يتغير. راقبته لأمسيتين ولم أحصل على استخدام أعلى لوحدة المعالجة المركزية. قد يكون افتراضك بشأن Postgres صحيحًا.

فيما يتعلق بـ mini profiler: ما هي الأرقام التي نريد استهدافها هناك؟ نحن عند حوالي 300 مللي ثانية الآن. كنا عند حوالي 500 مللي ثانية من قبل.

3 إعجابات

أعتقد أنه إذا حققنا أقل من 50 مللي ثانية في جميع الحالات بغض النظر عن ساعات الذروة، فسأعتبر ذلك وقت استجابة سريع للخادم. سيكون باقي الموقع أسرع لأن كل شيء يعتمد على وقت الاستجابة الأولي للخادم.

وسيكون مثاليًا للغاية إذا ظل أقل من 50 مللي ثانية لجميع المستخدمين الجغرافيين وظل ثابتًا. في الوقت الحالي، يستمر في القفز وغالبًا ما يكون أعلى، ويبدو أن هذه هي المشكلة الكبيرة لكونه بطيئًا.

كمراجعة سريعة للأيام القليلة الماضية، استمرت الأمور بسلاسة باستثناء حوالي نصف ساعة هذا المساء. لم أكن في الخادم بنفسي في ذلك الوقت ولكننا واجهنا مهلات من الواجهة الخلفية المبلغ عنها في سجل nginx. يُظهر sar استخدامًا أعلى قليلاً للنظام ولكن لا يوجد حمل عام لوحدة المعالجة المركزية. لست متأكدًا مما كان ذلك ولكنه بدا أنه يمنع unicorn/redis/postgres من العمل بسلاسة.

03:55:01 PM     all     34.99      1.87      6.67      0.12      0.00     56.35
04:05:01 PM     all     33.99      0.35      6.52      0.31      0.00     58.82
04:15:01 PM     all     35.24      1.17      7.14      0.13      0.00     56.31
04:25:02 PM     all     36.45      0.63      7.15      0.13      0.00     55.65

> 04:35:01 PM     all     39.09      0.71     16.78      0.11      0.00     43.32
> 04:45:01 PM     all     35.53      0.95     20.16      0.08      0.00     43.27
> 04:55:01 PM     all     41.64      4.29     15.44      0.24      0.00     38.39
05:05:01 PM     all     36.75      2.47      7.78      0.13      0.00     52.87
05:15:01 PM     all     35.96      1.29      7.81      0.10      0.00     54.85
05:25:01 PM     all     38.69      1.35      8.00      0.09      0.00     51.87
05:35:01 PM     all     37.01      4.53      7.92      0.07      0.00     50.46

إنها الأسطر المميزة بعلامة “>”.

لا أرى أي حركة مرور عالية في ذلك الوقت، لذا أنا في حيرة من أمري بشأن ما كان يحدث ولكنه كان يحدث بالفعل فقط خلال تلك النصف ساعة.

بشكل عام، عند النظر إلى وقت وحدة المعالجة المركزية، يتصدر Redis ويستخدم بشكل عام جزءًا كبيرًا من وحدة المعالجة المركزية. لست متأكدًا مما إذا كان هناك أي شيء يمكن فعله حيال ذلك. عادة ما يكون عند حوالي 20-25٪ ويصل إلى 35٪ هنا وهناك.

1721566 uuidd      20   0 2035M 1458M  1952 S 16.1  4.6 16h22:37 /usr/bin/redis-server *:6379
1721578 www-data   20   0  108M 69100 12516 S  6.7  0.2  6h32:27 nginx: worker process
2853756 1000       20   0 1355M  444M 19356 R 63.7  1.4  2h38:10 unicorn worker[0] -E production -c config/unicorn.conf.rb
2854380 1000       20   0 1267M  409M 18768 S 41.6  1.3  2h19:45 unicorn worker[4] -E production -c config/unicorn.conf.rb
1721598 1000       20   0  592M  285M  5192 S  1.3  0.9  2h08:53 unicorn master -E production -c config/unicorn.conf.rb
    575 root       20   0 1747M 20468  5040 S  0.7  0.1  2h01:02 /usr/bin/containerd
2854731 1000       20   0 1280M  399M 17880 S 36.9  1.3  1h57:52 unicorn worker[7] -E production -c config/unicorn.conf.rb
1721841 1000       20   0  592M  285M  5192 S  0.7  0.9  1h49:49 unicorn master -E production -c config/unicorn.conf.rb
2855284 1000       20   0 1287M  425M 18396 S 18.8  1.4  1h35:02 unicorn worker[3] -E production -c config/unicorn.conf.rb
2856414 1000       20   0 1223M  391M 19268 S 13.4  1.2  1h14:50 unicorn worker[2] -E production -c config/unicorn.conf.rb
2856478 1000       20   0 1207M  401M 21120 S  5.4  1.3 58:42.50 unicorn worker[5] -E production -c config/unicorn.conf.rb
2856503 1000       20   0 1215M  389M 18980 S  4.7  1.2 47:22.95 unicorn worker[1] -E production -c config/unicorn.conf.rb
1721581 www-data   20   0 69888 28636 13368 S  0.0  0.1 44:49.50 nginx: worker process
2857467 1000       20   0 1199M  385M 18112 S  4.0  1.2 39:23.87 unicorn worker[6] -E production -c config/unicorn.conf.rb
1721594 _apt       20   0 8479M 20036 18128 S  1.3  0.1 32:55.29 postgres: 13/main: walwriter
    580 root       20   0 1747M 20468  5040 S  0.0  0.1 32:15.27 /usr/bin/containerd

متوسط الحمل العام هو 5 على المدى الطويل الآن ولكنني ما زلت أراه يرتفع إلى 8 أو 9 من وقت لآخر.

إعجابَين (2)

بخصوص أداة mini profiler. كنت أتحدث عن وقت التحميل الإجمالي. وقت استجابة الخادم (الطلب الأولي) عادة ما يكون أقل من 10 مللي ثانية من جانبنا. أحيانًا أعلى قليلاً ولكنني لم أرَ أكثر من 20 مللي ثانية في آخر فحوصاتي. وقت التحميل الإجمالي يصل إلى 800 مللي ثانية أحيانًا، ونادرًا ما يتجاوز 1000 مللي ثانية.

النظر فقط إلى منطقة جغرافية واحدة حيث ليس لدينا أعداد كبيرة من المستخدمين خارج تلك المنطقة.

أوصي بالاطلاع على DISCOURSE_ENABLE_PERFORMANCE_HTTP_HEADERS والذي يجب أن يمنحك أيضًا نظرة ثاقبة حول المكان الذي يمكنك فيه تحسين الأداء.

4 إعجابات