كيف تتعقب الحمل الزائد على خادمك Analyzing Server Overload
مفهوم متوسط الحمل Load Average
فى هذه المقالة سنوضح كيفية تعقب مصدر الحمل على خادمك باستخدام مجموعة من الأدوات المتوافرة بالفعل على أنظمة يونكس/لينكس. افضل طريقة لمعرفة تفاصيل عن العمليات التى تجرى على حاسبك -على أنظمة يونكس/لينكس- هى استخدام الأدوات المتوافرة بالفعل على النظام ومنها أمر top وأمر uptimeوهما من الأدوات الأساسية التى يتم إرفاقها بأنظمة يونكس/لينكس الان.
بداية نوضح أنه عند الحديث عن الحمل على الخادم فإننا نتحدث عن متوسط الحمل Load Average والذى يظهره لنا أمر uptime. إنظر شكل ١
$ uptime
3:22 up 15:12, 1 users, load averages: 1.13 6.10 3.08
شكل ١ – مثال توضيحى لتشغيل أمر uptime
ملحوظة هامة: يستقى أمر uptime بيانات الحمل من ملف /proc/loadavg ويمكنك الحصول على نفس الناتج بإصدار أمر cat لهذا الملف. إنظر شكل ٢
$ cat /proc/loadavg
1.13 6.10 3.08 1/122 9241
شكل ٢ – أمر cat لملف /proc/loadavg يعطى نفس بيانات الحمل التى يظهرها أمر uptime.
هذا الأمر يعطى ملخص عن عدد الساعات التى كان الخادم فيها فعالاً On وكذلك عدد المستخدمين المتواجدين عليه بالإضافة الى متوسط الحمل خلال عدد ساعات التشغيل تلك.
كما يظهر بالمثال الأول: عدد ساعات التشغيل هو خمس عشرة ساعة واثنتى عشرة دقيقة, عدد المستخدمين إثنان, ومتوسطات أحمال 1.13, 6.10, 3.08
من هذا المثال وبشكل تقنى, متوسط الحمل يمثل متوسط عدد العمليات Processes التى تضطر للإنتظار حتى يتاح لها وقت من المعالج CPU Time للتعامل معها خلال الخمسة عشرة ساعة الماضية. بمعنى: إذا كان متوسط الحمل لديك هو صفر (0) فإن المعالج فى هذه الحالة يكون خاملاً Idle أى انه ليس لديه مهام ليؤديها. أما إذا كان متوسط الحمل واحد (1) فإن ذلك يعنى أن المعالج مشغول لدرجة أن عملية واحدة مازالت بالإنتظار حتي يتاح لها وقت من المعالج للتعامل معها. تخيل لو كان متوسط الحمل خمسة وسبعين مثلاً؟
هناك أمر لابد من التنبيه اليه. متوسط الحمل وعلاقته بعدد المعالجات ليست علاقة عكسية. بمعنى أنه إذا كان لدينا جهاز ذو معالج واحد وكان متوسط الحمل عليه ١, وجهاز أخر ثُمانى المعالجات ومتوسط الحمل عليه ٨ فإن نسبة إنشغال المعالجات على كل من الجهازين متساوية تقريبا, حيث ٨ ÷ ٨ = ١.
ولتقريب مفهوم الحمل أكثر اليك المثال التالى:
جسر مكون من حارة واحدة تتسع طولاً لعشر سيارات وعرضاً لسيارة واحدة. فى حال مرور عشرة سيارات على الجسر يكون الحمل = ١ حيث الجسر ممتلئ تماما.
فى حال مرور خمس سيارات على الجسر يكون الحمل = ١/٢ حيث الجسر مستغل بنصف طاقته.
فى حال محاولة مرور خمس عشرة سيارة على الجسر يكون الحمل = ١,٥ حيث الجسر ممتلئ بالفعل, وهناك خمس سيارات بالإنتظار حتى يتاح لها مكان للعبور. إنظر شكل ٣
شكل ٣ – مثال توضيحى لمفهوم الحمل.
إذا إفترضنا أن النظام يقوم بتسجيل متوسط الأحمال كل خمس دقائق, فإنه من المثال الأول يمكننا استنتاج أنه خلال الخمس عشرة دقيقة الأخيرة كان متوسط الحمل 3.08 تغير خلال العشر دقائق الأخيرة الى 6.10 بزيادة الضعف تقريباً, ثم هبط خلال الدقائق الخمس الأخيرة الى 1.13
أما إذا كان متوسط الأحمال مثلاً 2.11, 7.78, 18.23 فإنه يمكننا استنتاج أن متوسط الحمل فى إزدياد وأنه يتجه للأسوأ
متى يكون متوسط الحمل نذير خطر على استقرار النظام؟
بعد أن تعرفنا على مفهوم متوسط الحمل, نأتى للسؤال المنطقى: متى يكون رقم متوسط الحمل جيداً ومتى يكون مقلقاً؟
والإجابة على هذا السؤال أن ذلك يتوقف على عوامل عديدة. هناك العديد من الأسباب التى تؤدى لإرتفاع الحمل وفى نفس الوقت تؤثر بشكل مختلف فى أداء النظام وسرعة إستجابته. فقد يبلغ متوسط الحمل على أحد الأجهزة 60 أو 70 ومع ذلك تكون سرعة استجابة النظام جيدة وهناك جهاز أخر متوسط الحمل عليه دون ال 20 ومع ذلك تكون استجابته بطيئة جداً! المهم هنا هو الوصول الى سبب إرتفاع الحمل.
عند البدء فى تحديد أسباب ارتفاع الحمل نجد أن معظم الأسباب تقع فى ثلاث مجموعات رئيسة:
– إرتفاع حمل مرتبط بالمعالج CPU Related
– إرتفاع حمل مرتبط بالذاكرة Memory Related
– إرتفاع حمل مرتبط بالإدخال والإخراج I/O Related
بالطبع هناك أسباب أخرى منها عيوب مكونات الخادم Hardware Malfunction وإرتفاع درجة حرارة الوسط نتيجة سوء التبريد داخل غرف مراكز البيانات وغير ذلك. لكن هذه المسببات نادرة الحدوث هذه الأيام لعدة أسباب, أهمها إرتفاع جودة المكونات المستخدمة فى تصنيع الحاسبات وزيادة معاملات الأمان فى مراكز البيانات Data centers.
فى الأسطر التالية سوف نوضح كيفية استخدام أدوات نظام لينكس w و top و iostat للوصول الى سبب المشكلة
من الأوامر المفضلة لدى عند الدخول الى الخادم أمر w. هذا الأمر يعطينى ملخصاً عن حالة الخادم, عدد الساعات التى عملها, عدد المستخدمين المتواجدين حاليا مع رقم عنوان الإنترنت الخاص بكل منهم, والعمليات التى يجريها كل منهم حاليا, بالإضافة الى متوسط الحمل للنظام. إنظر شكل ٤
$ w
22:42:13 up 1 day, 9:21, 1 user, load average: 1.13 6.10 3.08
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 XXX.XXX.XXX.XXX 22:06 0.00s 0.01s 0.00s w
شكل ٤ – مثال توضيحى لتشغيل أمر w – لاحظ أن قيمة XXX.XXX.XXX.XXX ترمز لعنوان الإنترنت الرقمى IP Address الخاص بالخادم.
ثم هناك أمر top والذى يوفر الكثير من البيانات عن حالة النظام عموما والعمليات الجارية عليه ومدى استغلال كل منها لموارده. إنظر شكل٥
top – 22:06:41 up 1 day, 8:46, 1 user, load average: 0.31, 0.44, 0.44
Tasks: 226 total, 1 running, 225 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.8%us, 0.2%sy, 0.0%ni, 96.8%id, 0.2%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 4035784k total, 3825288k used, 210496k free, 362852k buffers
Swap: 2096440k total, 84988k used, 2011452k free, 1523744k cachedPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12704 nobody 15 0 81252 7188 1852 S 0.7 0.2 0:00.17 httpd
12768 nobody 15 0 81252 7100 1800 S 0.7 0.2 0:00.02 httpd
9386 mysql 15 0 663m 264m 3172 S 0.3 6.7 452:32.80 mysqld
12201 nobody 15 0 81388 7292 1860 S 0.3 0.2 0:00.17 httpd
12211 nobody 15 0 81388 7344 1908 S 0.3 0.2 0:00.15 httpd
12637 nobody 15 0 81444 7280 1852 S 0.3 0.2 0:00.06 httpd
12641 nobody 16 0 81252 7208 1856 S 0.3 0.2 0:00.03 httpd
12767 nobody 15 0 81436 7240 1828 S 0.3 0.2 0:00.02 httpd
12776 nobody 15 0 81256 7156 1840 S 0.3 0.2 0:00.01 httpd
شكل ٥ – مثال توضيحى لتشغيل أمر top
يوضح الشكل أعلاه ناتج إجراء أمر top على أحد الخوادم ونرى فى الأسطر الأولى كيف أنه يعطى تقريبا نفس النواتج التى حصلنا علها من أمرى w و uptime. كما انه يحدث البيانات تلقائيا كل عدة ثوان. كما يظهر بالشكل فإن النظام مستقر. عند محاولة تعقب مصدر الحمل فإننا نبدأ أولا بمسببات الحمل على المعالج, ثم الذاكرة, ثم الإدخال والإخراج I/O. سنبدأ الان بالمعالج:
إرتفاع الحمل المرتبط بالمعالج CPU Related Load
إرتفاع الحمل على المعالج Processor سببه كثرة العمليات المركزة عليه والتى تعمل معا فى نفس الوقت. ولأن كل عملية تحتاج لوقت من المعالج فإن ذلك يترتب عليه أن كل منها ستنتظر دورها. لكى تعرف إذا كان ارتفاع الحمل مرتبط بالمعالج تفقد السطر التالى
Cpu(s): 2.8%us, 0.2%sy, 0.0%ni, 96.8%id, 0.2%wa, 0.0%hi, 0.1%si, 0.0%st
كل من هذه النسب المئوية هى نسبة من وقت المعالج مرتبطة بعملية معينة يتم معالجتها. واليك ملخص للقيم وكيفية قرائتها:
us = user CPU time
هذه هى النسبة المتعلقة بالتطبيقات والعمليات التى يجريها المستخدم. فى معظم الأحيان يكون إرتفاع الحمل ناتج عن عملية أو تطبيق تقوم أنت بتشغيله على النظام مثل خادم الأباتشى Apache Webserver وقواعد بيانات MySQL.
إذا كانت هذه النسبة مرتفعة فالأرجح أن أحد التطبيقات الفعالة هو السبب فى الإرتفاع.
sy = system CPU time
هذه هى النسبة المتعلقة بالتطبيقات والعمليات الخاصة بالنظام نفسه مثل نواة النظام Kernel والعمليات الأخرى الأساسية.
id = CPU idle time
هذه هى نسبة الوقت الذى يقضيه المعالج خاملاً Idle لا يؤدى أى وظائف. وكلما ارتفعت هذه النسبة كلما كان ذلك أفضل لانه يعنى أن موراد الجهاز كافية وليس هناك عمليات تستغرق وقتا طويلا للتنفيذ وأن أى ارتفاع للحمل ليس متعلقا بالمعالج -بمعنى أخر, قدرة المعالج الحالى كافية للقيام بالمهام المطلوبة ولا تحتاج لترقيته.
wa = I/O wait
نسبة انتظار الإدخال والإخراج I/O Wait توضح الوقت الذى يقضيه المعالج منتظراً اتمام إحدى عمليات الإدخال والإخراج I/O. إذا كان خادمك يعانى من إرتفاع الحمل وكانت قيمة هذه النسبة مرتفعة فالارجح أن سبب إرتفاع الحمل يرجع الىالقرص الصلب أو الذاكرة RAM وليس مرتبطاً بالمعالج. لاحظ أن القرص الصلب هو من أبطأ الأجزاء فى الحاسبات الالية عموما من ناحية سرعة القراءة/الكتابة لأنه وببساطة مكون ميكانيكي -يعتمد على أجزاء متحركة ذات سرعة محدودة, يتفوق عليه فى البطء كلاً من السواقات البصرية CD/DVD-ROMs وذاكرة USB على الرغم من كونها لاتحوى أجزاءاً ميكانيكية, لكن سرعة ال I/O لها مازالت محدودة*.
بينما تعتبر الذاكرة المؤقتة RAM من أسرع الأجزاء فى تبادل البيانات.
لكى نوضح أكثر اليك المثال التالى:
عملية بحث فى قاعدة بيانات MySQL تجريها للبحث عن بيانات مستخدم معين فى منتدى تستدعى من برنامج أو عملية mysqld أن تقرأ ملف قاعدة البيانات من على القرص الصلب ثم تستخلص منه ناتج البحث وتعطيه لك. قراءة قاعدة البيانات من على القرص الصلب تستغرق وقتا يقضيه القرص الصلب نفسه Hard Drive فى البحث عن الملف المطلوب -قاعدة البيانات نفسهاـ وقرائتها ثم ارسالها مرة أخرى للنظام. فى الوقت الذى يبحث فيه القرص الصلب عن الملف ويستخلصه يكون المعالج منتظراً Idle حتى ينتهى القرص الصلب من مهمته.
نتيجة هامة: لتحسين سرعة أداء الخادم إختر أقراصاً صلبة ذات معدل I/O مرتفع. الأجيال الجديدة من الأقراص الصلبة من فئة SATA يوجد منها انواع تدور بسرعة 10K (عشرة الاف لفة/دقيقة). يفضل إستخدام هذه الأقراص على الخوادم التى تستخدم لإستضافة قواعد بيانات كبيرة.
يمكنك أيضا ترقية الذاكرة الى نوع يدعم سرعة Bus أعلى. مثلا إذا كانت الذاكرة لديك تعمل على سرعة Bus بحد أقصى 800MHz يمكنك الترقية الى ذاكرة تعمل بسرعة 1066MHz أو أعلى. يتوقف ذلك على دعم اللوحة الأم لهذه السرعات, ويمكنك دائما استشارة مركز البيانات المتواجد به خادمك.
تعقب إرتفاع الحمل المتعلق بالمعالج
إذا كنت ترى نسبة حمل مرتفعة فى الجزء الخاص بالمستخدم أو النظام, فهناك إحتمال كبير أن يكون الحمل مرتبطاً بالمعالج. لتعقب السبب انظر الى الأسطر التى يعرض فها أمر top العمليات الجارية على النظام. بشكل اساسى يقوم أمر top بترتيب هذه العمليات تنازليا بوضع الأكثر استخداماً للمعالج بالأعلى,نقصد تحديدا العمود المسمى %CPU. إنظر شكل ٦
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12704 nobody 15 0 81252 7188 1852 S 0.7 0.2 0:00.17 httpd
12768 nobody 15 0 81252 7100 1800 S 0.7 0.2 0:00.02 httpd
9386 mysql 15 0 663m 264m 3172 S 0.3 6.7 452:32.80 mysqld
12201 nobody 15 0 81388 7292 1860 S 0.3 0.2 0:00.17 httpd
12211 nobody 15 0 81388 7344 1908 S 0.3 0.2 0:00.15 httpd
12637 nobody 15 0 81444 7280 1852 S 0.3 0.2 0:00.06 httpd
12641 nobody 16 0 81252 7208 1856 S 0.3 0.2 0:00.03 httpd
12767 nobody 15 0 81436 7240 1828 S 0.3 0.2 0:00.02 httpd
12776 nobody 15 0 81256 7156 1840 S 0.3 0.2 0:00.01 httpd
شكل ٦ - أمر top يرتب العمليات تنازليا طبقا لحدتها
يخبرنا العمود %CPU كم استغلال كل عملية من العمليات الجارية للمعالج. فى حالتنا هذه نجد أن عملية httpd -وهى خاصة بخادم الأباتشى- هى أكثر العمليات استغراقاً للمعالج, حيث تستهلك 0.7% من وقته. حين النظر الى شاشة أمر top وقت إجراءه ستجد أحد أمرين: إما عملية محددة تستهلك معظم وقت المعالج, أو عدة عمليات تتسابق فيما بينها للحصول على وقت من المعالج, وهذا ما نراه فى المثال الموضح أمامنا. فى كلا الحالتين سيكون من السهل تحديد العملية المسببة لإرتفاع الحمل.
يستخدم خادم الأباتشى خاصية التفريع Forking لتحسين أداءه. وهذه الخاصية باختصار تعتمد على تفريع العملية الرئيسة httpd الى عشرات -أحيانا الاف- العمليات الفرعية بنفس الأسم لكن بمعرف PID مختلف, وذلك لتلبية طلبات المستخدمين الذين يتصفحون الموقع. بالطبع كلما أرتفع عدد الزوار كلما زاد عدد العمليات الفرعية-علاقة طردية. على الأجهزة التى لاتدعم معالجاتها خاصية ال Multi-Threading أو التى تحتوى على معالج واحد فقط, يتسبب تفريع عملية مثل httpd فى إرتفاع الحمل الإجمالى بشكل ملحوظ على الرغم من أن كل عملية فرعية قد لا يتعدى حملها 0.3.
نتيجة هامة: للحصول على أداء جيد من الخوادم الخاصة بالأباتشى, يفضل استخدام خوادم متعددة المعالجات Multi-CPU أو أحادية المعالجات لكنها متعددة النواة Multi-Core CPU. كما أنه يمكن الجمع بين الخاصيتين باستعمال خادم متعدد المعالجات وكل معالج متعدد الأنوية.
معلومة مفيدة: يمكنك استخدام أمر kill مع معرف العملية الفرعية PID لوقف تلك العملية حال كونها تستهلك موارد النظام. كما يمكنك أيضا استخدام أمر killall مع اسم العملية لوقف العملية الرئيسة وكل العمليات المتفرعة منها. إنظر شكلى ٧ و ٨
kill 12704
شكل ٧ – استخدام أمر kill مع معرف العملية الفرعية PID لوقف العملية.
killall -9 httpd
شكل ٨ – استخدام أمر killall مع اسم العملية لوقف العملية الرئيسة وكل العمليات المتفرعة منها.
إرتفاع الحمل المرتبط بالذاكرة RAM Related Load
السبب الأخر من أسباب ارتفاع الحمل هو نفاذ الذاكرة الموقتة للخادم RAM بسبب إمتلائها عن أخرها مما يضطر النظام لإستخدام قسم ال swap على القرص الصلب كبديل للذاكرة.
قسم ال swap هو جزء من القرص الصلب خاص بالنظام ولا يمكن للمستخدم عادة الدخول عليه, حيث يستخدم كذاكرة مؤقتة للنظام حال إمتلاء الذاكرة المؤقتة الأصلية RAM. ولأن القرص الصلب -كما بينا من قبل- أبطأ بكثير من الذاكرة فإن ذلك يتسبب فى إنخفاض أداء الجهاز بشكل ملحوظ مع إرتفاع الحمل نتيجة إرتفاع نسبة ال I/O. وطبيعى أن العمليات التى يتم إجرائها من على قسم ال swap تكون ابطأ كثيرا فى التنفيذ.
ثم تحدث الكارثة عندما تستنفذ مساحة قسم ال swap بالكامل. إذ عنده لايجد النظام مكاناً لا فى الذاكرة المؤقتة ولا على قسم ال swap على القرص الصلب وهى الحالة التى إذا لم يتم تداركها فإن العمليات تتراكم بإنتظار التنفيذ النظام كله قد ينهار Crash مما قد يضطرك الى إعادة تشغيله عن طريق عمل Reset للخادم.
وهناك نقطة ماكرة بخصوص ال swap. فبسبب أن استخدام النظام له بكثافة يهبط بأداء القرص الصلب, فإنه من السهل أن يشخص سبب إرتفاع الحمل خطأ على أنه مشكلة مرتبطة بالإدخال والإخراج I/O Related فى حين أن المشكلة الحقيقية هى نفاذ الذاكرة المؤقتة.
لذا, إذا وجدت إرتفاعاً فى نسبة ال I/O wait عند تفقد سطر Cpu(s) فى معطيات أمر top, إفحص الذاكرة المؤقتة أولا وتأكد من وجود كم مناسب منها متاحاً للتطبيقات. تفقد أيضا إعدادات تطبيقاتك وتأكد من ضبطها بحيث لا تستغرق كل الحجم المتاح من الذاكرة.
مثال حى: فى أحد الأيام كان لدينا خادم أباتشى مزدوج المعالجات مع ستة عشر جيجا من الذاكرة المؤقتة ومع ذلك كان الحمل القادم من عملية mysqld مرتفعا جداً, مصحوباً بإمتلاء ال RAM مع إستخدام جزء صغير من قسم swap
من النظرة الأولى لمعطيات top اتضح لنا أن المشكلة هى إمتلاء الذاكرة المؤقتة بالرغم من الحجم الكبير المتوافر. بتفقد إعدادات ال MySQL وجدنا أن هناك خطأ بإعدادات ال buffer مما سبب أن تستهلك عملية mysqld معظم الذاكرة المتاحة, ومع امتلاء الذاكرة بدأ الحمل فى الإرتفاع. تصحيح هذا الخطأ هبط بالحمل فوراً الى منسوب معقول مع تحسن رائع فى تحميل صفحات الموقع
لتحليل وتحديد مشاكل الذاكرة إنظر الى السطرين الرابع والخامس
Mem: 4035784k total, 3825288k used, 210496k free, 362852k buffers
Swap: 2096440k total, 84988k used, 2011452k free, 1523744k cached
هذه الأسطر تخبرك بكم الذاكرة المتاحة إجمالا و الكم المشغول والمتوفر منها. كما تخبرك بنفس البيانات عن ال swap. مع ذلك يجب الحرص عند النظر الى هذه البيانات حيث أنها قد تخدع حتى بعض مديرى النظم المتمكنين. فعند النظر الى حجم الذاكرة الغير مشغولة تجد أنه 210496k أى أن الذاكرة ممتلئة تقريباً. وبالرغم من أن الرقم صحيح فأن هذه ليست الحقيقة كاملة.
الملفات المخزنة ونظام لينكس Linux File Caching
عندما تفتح ملفاً على نظام لينكس تقوم النواة بتحميل ذلك الملف فى الذاكرة المؤقتة RAM. لكن النواة لاتقوم بالضرورة بتفريغ الذاكرة من هذا الملف عند الفراغ من استخدامه. إذا كان النظام مازال به المزيد من الذاكرة الفارغة فإن النواة تحاول تخزين أكبر قدر ممكن من الملفات بها, وهو مايعرف بالملفات المخزنة File Cache. يسهم هذا الأسلوب فى تحسين أداء الأجهزة بشكل عام حيث يقلل من زمن استدعاء الملفات, فبدلا من قراءة الملف من على القرص الصلب فى كل مرة ترغب فى تشغيله, يتم جلبه مباشرة من الذاكرة المؤقته بعد تخزينه بها للمرة الأولى. وكلما طال زمن تشغيل النظام – بعض خوادم لينكس تعمل أعواما بدون إنقطاع لثانية واحدة – كلما امتلأت الذاكرة بالمزيد من الملفات المخزنة.
لذا فإنه لتحديد نسبة ال RAM الفارغة بشكل أدق, قارن بين قيم عمودى free و cached. فى حالتنا هذه لدينا 1523744k cached + 210496k free يعنى مايقرب من ٢٥٠ ميجابايت من الذاكرة فارغة مقابل ١,٥ جيجا تقريبا من الملفات المخزنة بينما إجمالى الذاكرة على الخادم هو ٤ جيجابايت. هنا يمكننى القول ببساطة أن ارتفاع الحمل غير ناتج عن نفاذ الذاكرة المؤقتة. لذا انتقل الى سطر ال swap لأعرف ماإذا كان يستخدم بكثافة.
تأكد من عدم استخدام ال RAM بكثافة
إذا كان نظامك يعانى من قلة الذاكرة المؤقتة الفارغة انظر الى عمود %MEM واضغط حرف M على لوحة مفاتحك. كما أوضحنا فإن أمر top يرتب العمليات طبقا لشدتها, لكن عند ضغط حرف M فإنه سيرتبها طبقا لما تستغله من ذاكرة RAM
يمكن هنا أن نرى أن العملية mysqld هى الأكثر استهلاكاً للذاكرة. إنظر شكل ٩
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9386 mysql 15 0 663m 264m 3172 S 0.3 6.7 452:32.80 mysqld
12704 nobody 15 0 81252 7188 1852 S 0.7 0.2 0:00.17 httpd
12768 nobody 15 0 81252 7100 1800 S 0.7 0.2 0:00.02 httpd
12201 nobody 15 0 81388 7292 1860 S 0.3 0.2 0:00.17 httpd
12211 nobody 15 0 81388 7344 1908 S 0.3 0.2 0:00.15 httpd
12637 nobody 15 0 81444 7280 1852 S 0.3 0.2 0:00.06 httpd
12641 nobody 16 0 81252 7208 1856 S 0.3 0.2 0:00.03 httpd
12767 nobody 15 0 81436 7240 1828 S 0.3 0.2 0:00.02 httpd
12776 nobody 15 0 81256 7156 1840 S 0.3 0.2 0:00.01 httpd
شكل ٩ – ترتيب العمليات وفقا لحجم الذاكرة المستغلة.
معلومة مفيدة: إذا كنت تعلم أن هناك الكثير من الملفات المخزنة بال RAM وكنت ترغب فى تنظيفها فيمكنك تحرير المزيد من الذاكرة باستخدام “drop_caches”
أصدر الأوامر التالية على الترتيب الموضح
$ free -m
$ sync
$ echo 3 > /proc/sys/vm/drop_caches
إرتفاع الحمل المرتبط بالإدخال والإخراج I/O Related Load
كما اوضحنا من قبل, يمكن أن تنخدع ببعض بيانات top وتظن أن الأمر متعلق بالإدخال والإخراج I/O Related حين يكون هناك استخدام مكثف لل swap نتيجة نفاذ ال RAM. لكن عند التأكد من أن المشكلة غير متعلقة بالذاكرة المؤقتة وكان لديك رقم I/O wait كبير, فإنه يكون عليك تحديد أى الأقراص الصلبة أو أقسامها على جهازك هى سبب المشكلة. لعمل ذلك تحتاج لإستخدام أداة iostat. إنظر شكل ١٠
$ iostat
Linux 2.6.18-164.15.1.el5xen (test.server.com) 05/25/2010
avg-cpu: %user %nice %system %iowait %steal %idle
0.05 0.00 0.02 0.03 0.01 99.90Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 2.38 20.02 46.17 25346610 58465488
sda1 0.00 0.04 0.02 53320 27720
sda2 1.14 15.71 17.85 19894167 22602992
sda3 0.53 1.74 14.47 2200759 18319288
sda4 0.00 0.00 0.00 14 0
sda5 0.41 1.81 10.42 2295634 13196336
sda6 0.00 0.00 0.00 2330 528
sda7 0.02 0.71 0.16 896024 201472
sda8 0.27 0.00 3.25 3826 4117152
sdb 71.63 1749.11 2172.62 2214969981 2751278073
sdb1 71.63 1749.11 2172.62 2214969197 2751278073
sdc 106.91 2750.96 2843.76 3483667846 3601183456
sdc1 106.91 2750.96 2843.76 3483667174 3601183456
شكل ١٠ – مثال توضيحى لتشغيل أمر iostat
وكما يفعل أمر top فإن أمر iostat يعطينا معلومات عن متوسط الحمل على المعالج. تحت ذلك تجد بيانات عن كل من
tps: transactions per second. عدد العمليات / الثانية
Blk_read/s: blocks read per second. عدد البلوكات المقروءة / الثانية
Blk_wrtn/s: blocks written per second. عدد البلوكات المكتوبة / الثانية
Blk_read: total blocks read. إجمالى عدد البلوكات المقروءة
Blk_wrtn: total blocks written. إجمالى عدد البلوكات المكتوبة
بتحليل هذه البيانات سيكون بمقدورك اكتشاف القرص الصلب/القسم المسبب للمشكلة حيث سيكون هو صاحب أعلى أرقام. كما سيمكنك تحديد ما إذا كانت غالبية البيانات داخلة أم خارجة منه-مكتوبة أم مقروءة.
مثلاً: إذا كان لديك نظام نسخ إحتياطى خارجى External Backup وكنت تشك أن عملية النسخ هى سبب إرتفاع الحمل, قارن ارقام Blk_read/s و Blk_wrtn/s فإذا كانت ارقام Blk_wrtn/s هى الأعلى فأنه بالتأكيد عملية النسخ ليست هى المشكلة لأنه من المفترض أن تقرأ من قرصك الصلب وتكتب على القرص الصلب للسيرفر الاخر. أما إذا كانت أرقام Blk_read/s هى الأعلى, فأنه يمكنك تشغيل أمر lsof وأمر grep ضد اسم عملية المنسخ لتعرف بيانات أكثر عنها.
تعقب ارتفاع الحمل بواسطة أمر iostat ليس أمرا مباشراً لكنه ليس بالعسير. فقط يتطلب الأمر بعض الممارسة حتى تتمكن من التعرف على موطن الخلل. كما أن لأمر iostat العديد من المحددات يمكنك التعرف عليها بتفقد صفحة ال man الخاصة به.
حتى وقت قريب كانت أدوات مثل iostat تمثل اقصى ما يمكن لمديرى نظم يونكس/لينكس الحصول عليه لتحرى مشاكل الإدخال والإخراج I/O. لكن مع التطور الذى حدث فى نواة النظام أُدخلت أدوات حديثة تسمح بتحرى مسببات هذه المشاكل حتى مستوى العمليات الفردية Per-Process Level . من هذه الأدوات الجديدة أداة iotop وهى مماثلة لأداة iostat لكنها تتخصص فى فحص عمليات الإدخال والإخراج I/O.
$ iotop
2010 May 25 14:48:13, load: 2.40, disk_r: 56972 KB, disk_w: 7108 KB
UID PID PPID CMD DEVICE MAJ MIN D BYTES
501 2249 132 mysqld ?? 14 3 R 20480
501 65848 132 httpd ?? 14 2 R 475136
0 0 0 kernel_task ?? 14 3 W 983040
شكل ١١ – شكل توضيحى لتنفيذ أمر iotop.
ملحوظة هامة: هناك أمر أخر لابد أن يؤخذ فى الإعتبار وهو أن تتأكد من عدم إمتلاء أقسام القرص الصلب الخاص بخادمك لما لذلك من تأثير سلبى على الأداء. يمكنك التحقق من ذلك بسهولة عن طريق إصدار أمر df -h. أمر df يظهر لك حجم إشغال الأقراص الصلبة والأقسام التى على خادمك. إنظر شكل ١٢
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 9.7G 860M 8.4G 10% /
/dev/sda8 996M 986M 9.6M 99% /tmp
/dev/sda7 101G 2.3G 93G 3% /home
/dev/sda3 9.7G 4.3G 5.0G 46% /usr
/dev/sda2 9.7G 1.3G 8.0G 14% /var
/dev/sda1 99M 55M 39M 59% /boot
شكل ١٢ – شكل توضيحى لتنفيذ أمر df.
لاحظ هنا إمتلاء قسم /tmp على القرص الصلب وهذا يسبب مشاكل مع أى عمليات تستخدم هذا القسم لتخزين ملفات أثناء عملها قد تصل أحيانا الى انهيار العملية كليا بسبب عدم قدرتها على إضافة أى ملفات لهذا القسم.
وماذا بعد؟
الأن وقد وضعت أقدامك على الطريق الصحيح لتحديد أسباب إرتفاع الحمل على الخادم, تأتى الى النقطة الأخيرة وهى كيفية التعامل مع الأسباب وحل المشكلة. هنا تتعدد الحلول المطروحة طبقا لظروف الخادم ونوع العمليات الجارية عليه. فإن إرتفاع الحمل الناتج عن عملية تجريها على الخادم ويمكنك بسهولة وأمان إنهائها يختلف عن إرتفاع الحمل الناتج عن عملية قواعد بيانات MySQL, حيث لايمكنك إنهائها فوراً لما قد يسببه ذلك من تلف لملفات قواعد البيانات الموجودة على الخادم. عندها قد تلجأ الى زيادة موارد الخادم من ذاكرة مؤقتة أو معالجات أو حتى أقراص صلبة. فى النهاية تحديد الحل المناسب يعود اليك أنت.
References مراجع
http://www.linuxjournal.com/article/9001
http://en.wikipedia.org/wiki/Load_%28computing%29
Linux Man Pages: http://man.he.net
http://luv.asn.au/overheads/NJG_LUV_2002/luvSlides.html
http://www.performancewiki.com/cpu-tuning.html#linux
http://www.linuxinsight.com/proc_filesystem.html
————————————————————————————————————————————————————————————————–
* المفترض فى الجيل الثالث من اجهزة ال USB أن تصل سرعة نقل البيانات منه الى 5 جيجابت/ثانية, وهى سرعة تقترب كثيرا من سرعة الأقراص الصلبة, بل وتتفوق على بعضها
htop و mytop هناك عدة أدوات مفتوحة المصدر تسهل متابعة وتشخيص حالة النظام, منها على سبيل المثال**
*** تمرين: ما الفارق بين إجراء أمر top بدون محددات وبين إجراءه بالمحددات top -SHM ؟[:]
Leave A Comment