OS X Server: تقييم الأداء

تتناول هذه المقالة كيفية استخدام برنامج نصي لبدء تقييم أداء خادم مثبَّت عليه Mac OS X Server الإصدار 10.4 أو أحدث. وينصب التركيز الرئيسي على تحديد نسبة استخدام الموارد الأساسية: وحدة CPU، ومساحة التخزين على القرص، والشبكات.

لقد تمت أرشفة هذا المقال ولم تعد Apple تحدثه.

نسبة استخدام الموارد

يمكنك استخدام برنامج perl النصي هذا (المسمى "top_guide.pl") لتقييم نسبة استخدام الموارد الأساسية على الخادم بمرور الوقت. يعمل البرنامج النصي هذا مع Mac OS X Server الإصدار 10.4 والأحدث.

يُشغل البرنامج النصي top -d، ولكن يستخرج استخدام الموارد الأساسية بمرور الوقت ويُلخصه. دون وسيطات، يبدو إخراج top_guide.pl كما يلي:

--------  -----------  ------------  -------------  -------------  -------------  -------------  ------
          CPU usage:          300-s  Reads/sec:     Writes/sec:    Net in/sec:    Net out/sec:   kernel
Time:     user  sys    Idle   avg.   number MB      number MB      pkts   Mb      pkts   Mb      CPU%
--------  ----- -----  -----  -----  ------ ------  ------ ------  ------ ------  ------ ------  ------
08:44:36    0.1   0.1   99.8   99.8       0    0.0       0    0.0      11    0.0       0    0.0     0.4
08:44:46    0.1   0.3   99.6   99.8       0    0.0       0    0.1      12    0.0       0    0.0     0.4
08:44:56    0.0   0.2   99.8   99.8       0    0.0       0    0.0      17    0.0       0    0.0     0.4
08:45:06    0.0   0.2   99.8   99.8       0    0.0       0    0.0       6    0.0       0    0.0     0.4
08:45:16    0.0   0.2   99.8   99.8       0    0.0       0    0.0       9    0.0       0    0.0     0.4
08:45:26    8.7  24.6   66.7   98.6      43    0.8      98    0.6     803    1.0    1399    1.1     5.0
08:45:37    5.7  83.6   10.7   95.7      48    0.4    1085  116.9   95366 1053.1   61830   35.4    72.4
08:45:47   11.5  88.5    0.0   92.4      23    0.2    3228  426.9  337955 3843.6  207872  114.0   284.8
08:45:58    4.6  95.4    0.0   89.0       4    0.0     594  596.7  447499 5215.5  266449  140.9   370.0

يمكنك رؤية المناطق الأساسية الثلاثة المحددة: وحدة CPU، إدخال/إخراج القرص، والشبكات. الأعمدة هي:

  • Time (الوقت): الوقت النهائي لسطر الملخص الأخير. يبلغ بشكل افتراضي 10 ثوان بين العينات.
  • CPU usage (استخدام وحدة CPU): عنصر user (المستخدِم): نسبة استخدام وحدة المعالجة المركزية في وضع المستخدم. القيمة هي النسبة المئوية لإجمالي موارد وحدة CPU المتوفرة على هذا النظام. على سبيل المثال، في نظام من 8 معالجات، ستعني نسبة 50% من وحدة المعالجة المركزية للمستخدم أن الاستخدام الإجمالي لوحدة المعالجة المركزية لجميع التطبيقات الجاري تشغيلها يكافئ أربعة معالجات.
  • CPU usage (استخدام وحدة CPU): عنصر sys (نظام): نسبة استخدام وحدة المعالجة المركزية في وضع Kernel كنسبة مئوية لإجمالي وحدة المعالجة المركزية المتوفرة.
  • Idle (الخاملة): وحدة CPU الخاملة، كنسبة مئوية من إجمالي الموارد المتوفرة.
  • 300-s avg (متوسط خلال 300 ث)‏: المتوسط المتجانس للنسبة المئوية لوحدة المعالجة المركزية غير المستخدمة على مدى آخر 300 ثانية. (لاحظ أن هذا يتغير إذا كنت تستخدم -roption لتعديل الفاصل الزمني للمتوسط؛ حيث يتم تغيير عنوان العمود بما يلائم ذلك.)
  • Reads/sec - number‏ (عدد القراءات/ث - العدد): عدد عمليات تشغيل قراءة القرص الفريدة التي أُصدِرت أثناء الفترة العينة.
  • Reads/sec - MB‏ (عدد القراءات/ث - م.ب): إجمالي مرات قراءة عدد الميجابايت من الأقراص أثناء الفترة العينة.
  • Writes/sec - number‏ (عدد الكتابات/ث - العدد): عدد عمليات تشغيل كتابة القرص الفريدة أثناء الفترة العينة.
  • Writes/sec - MB‏ (عدد الكتابات/ث - م.ب): إجمالي عدد الميجابايت المكتوبة أثناء الفترة العينة.
  • Net in/sec - pkts (إجمالي إدخال/ث - حزم):إجمالي الحزم المستلمة أثناء الفترة العينة.
  • Net in/sec - Mb (إجمالي إدخال/ث - م.ب.): إجمالي إدخال الشبكة بالميجابايت لكل ثانية أثناء الفترة العينة.
  • Net out/sec - pkts (إجمالي إخراج/ث - حزم): إجمالي حزم الشبكة المرسلة أثناء الفترة العينة.
  • Net out/sec - Mb (إجمالي إخراج/ث - م.ب.): إجمالي إخراج الشبكة بالميجابايت لكل ثانية أثناء الفترة العينة.

من الخيارات الأخرى التي يوفرها البرنامج النصي:

  • -h: عرض معلومات الاستخدام الكلي.
  • -o filename: وضع نسخة مفصولة بعلامة تبويب من الإخراج في ملف. يصلُح نموذج الإخراج هذا للاستيراد إلى جدول بيانات أو برامج نصية أخرى لتحليل البيانات. يشمل السطر الأول رؤوس الأعمدة للتأكد من أن الإخراج موضِّح لمعناه دائمًا.
  • -d: يعرض طابع التاريخ والوقت. يفيد ذلك على وجه الخصوص في تسجيل الدخول طويل الأمد على خادم يرغب المسؤول في الحصول على سجل تاريخي عليه.
  • -S processNames: مراقبة عمليات المثيل المفرد. يفيد ذلك إذا كانت خدمة معينة لديها معرّف عملية مفرد فقط مثير للاهتمام بشكل خاص على أحد الخوادم. يمكن أن يكون خادم يُستخدم في الأساس كخادم AFP مثالاً على ذلك. في هذه الحالة، استخدم الوسيطات -S AppleFileServer‏ لإضافة عمود منفصل لاستخدام وحدة CPU للمستخدِم فيما يخص عملية AppleFileServer. يمكن إدراج أكثر من عملية بالفصل بين أسماء العمليات بفواصل.
  • -M processNames‏: مثل‏-S‏، باستثناء الاستخدام عندما يستخدم التطبيق عدة عمليات. مثال على ذلك هو smbd، الذي لدينا له عملية لكل اتصال. على نظام يُستخدم بكثافة مع Samba، استخدم -M smbd للحصول على عمود يُلخص استخدام وحدة CPU للمستخدِم فيما يخص نشاط Samba بأكمله.

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

نسبة استخدام CPU

في حالة ارتفاع استخدام وحدة CPU، فإن الطريقة الأساسية للفحص هي تحسين كفاءة التطبيق. لا تندرج هذه النقطة ضمن نطاق هذه المقالة؛ ومع ذلك، لا تتم الاستعانة بوحدة CP في بعض الأحيان. تتوفر العديد من الأدوات التي تساعدك في التحري عن حالة وجود موارد كافية من الأقراص والشبكات لحِمل أعلى، ولكن يظل قدر كبير من وحدة CPU في حالة خمول.

توجد طريقتان قد يتم من خلالهما استخدام وحدة CPU دون المعدل المحدد، وهما:

  • تأمين سلسلة عملية التطبيق
  • تأمين مورد Kernel

يمكن استخدام الأمر plockstat(1)، الذي طُرح لأول مرة في Mac OS X 10.5 Leopard، مقابل تطبيق معين لفحص المنافسة على اتصال تأمين pthread. يمكنك تحديد العمليات التي قد تكون لديها منافسة على اتصال تأمين pthread عن طريق فحص إخراج top -d للعمليات التي تتضمن عددًا كبيرًا من مبدلات السياق (عمود CSW). عند تحديد عملية تريد التحري عنها بالنسبة للمنافسة على اتصال تأمين pthread، استخدم: # plockstat -C -e 10 -p <pid>.

 Mutex block
   
   Count     nsec Lock                       Caller
   -------------------------------------------------------------------------------
  8540    29622 0x805eb0                     a.out`process_request+0x3d1
  8361    28284 0x805eb0                     a.out`release_block+0xac
  
 R/W reader block
 
 Count     nsec Lock                         Caller
 -------------------------------------------------------------------------------
     1  3014987 0xa781e8                     a.out`key_find+0x121
     5    78831 0xa3d158                     a.out`key_find+0x121
     2   120532 0xa3d158                     a.out`key_delete+0x137
 
 R/W writer block
 
 Count     nsec Lock                         Caller
 -------------------------------------------------------------------------------
    10  5336318 0xa781e8                     a.out`key_replace+0x80
    13  3827632 0xa75fe8                     a.out`key_replace+0x80
     3  3644946 0xa5fde8                     a.out`key_create+0x37
     6   161055 0xa3d158                     a.out`key_replace+0x80
     1   785267 0xa37758                     a.out`key_create+0x37

يمكنك فحص هذا الإخراج ومراجعة القدر الإجمالي من nsec المحظور خلف مختلف عمليات التأمين. وإذا كانت هذه القيمة مرتفعة نسبيًا مقارنة بالإجمالي، فسيتأثر وقت التنفيذ بالمنافسة على اتصال التأمين. يمكن أن تُفيد هذه المعلومات كاتب التطبيق من ناحية عزل أداء التطبيق وتحسينه. إذا كانت الرموز متاحة، فسيحتوي حقل Caller (المتصل) على الاسم الرمزي للوظيفة التي تم حظرها. أيضًا، إذا كان إجمالي عدد الكتل كبيرًا، بحيث يتجاوز 250 في الثانية، فقد تفقد قدرًا من كفاءة التشغيل مقابل إعادة الجدولة بين سلاسل العمليات. على الرغم من عدم كفاية اعتبار المعدلات العالية من الكتل كعامل مقيِّد في الأداء، إلا أنها تعطي مبررًا للاستقصاء؛ حيث تُشير في معظم الحالات إلى عدم كفاءة التطبيق بالشكل الذي يمكن أن يكون عليه.

تظهر مشاكل المنافسة على اتصال الموارد في بعض الأحيان للموارد التي ضمن kernel. يُدير Mac OS X kernel معظم الموارد ذات العديد من سلاسل العمليات مع كائنات مزامنة kernel وعمليات تأمين القارئ-الكاتب. لا يمكن تقييم المنافسة على اتصال كائن المزامنة عبر برامج dtrace‏(1M) النصية، مثل:

lockstat:::adaptive-block

{

        @often[arg0, stack(5)] = count();

}


profile:::tick-5sec

{

        normalize(@often, 5);

        printa(@often);

}

فهو يطبع قائمة مفروزة، تتضمن معظم عمليات التأمين ذات المنافسة على الاتصال والمسارات بالجزء السفلي لكل كتلة إخراج مطبوعة بعد 5 ثوانٍ من أخذ العينة. فيما يلي نموذج للإخراج:

        375517140

              mach_kernel`lck_mtx_lock_wait_x86+0x1c7

              mach_kernel`lck_mtx_lock+0x217

              mach_kernel`ip_output_list+0xd34

              mach_kernel`tcp_setpersist+0x18b

              mach_kernel`tcp_output+0x17a0

                0

        375571960

              mach_kernel`lck_mtx_lock_wait_x86+0x1c7

              mach_kernel`lck_mtx_lock+0x217

              mach_kernel`vnode_ref+0x32

              mach_kernel`fcntl_nocancel+0x4b3

              mach_kernel`unix_syscall64+0x26d

                0

في هذه الحالة، يقوم البرنامج النصي بالإبلاغ عن أن كائن المزامنة kernel على 375517140 يتم حظره عبر أحد المسارات، حيث يستدعي الكائن tcp_output() الكائن tcp_setpersist()، الذي يستدعي بدوره ip_output_list(). يبلغ عدد الكتل في الثانية 0 على كلتا عمليتي التأمين هاتين، وبالتالي فإن المنافسة على اتصال التأمين ليس مشكلة. لاحظ أن هذا النموذج للبرنامج النصي لا يُحصي إجمالي المثيلات مقابل أي عملية تأمين مفردة. إذا تم تغيير البرنامج النصي إلى:

lockstat:::adaptive-block

{

        @often[arg0] = count();

}


profile:::tick-5sec

{

        normalize(@often, 5);

        printa(@often);

}

فقد يتغير الإخراج إلى:

       1301055072                9

       1417504384                9

        353318336               10

        359381776               10

       1301055088               11

          5387344              165

وهذا يُشير إلى أن التأمين الذي ضمن عنوان kernel المعين بـ 5387344 فقط هو الذي لديه منافسة على الاتصال يمكن تقديرها، وبالتالي فهو دون مستوى الاهتمام، لأنه أقل من 250.

وفي النهاية، يمكن أن يركز البرنامج النصي على عملية تأمين الكاتب-القارئ لـ kernel عبر تغيير البرنامج النصي بشكل محدود إلى:

lockstat:::rw-block

{

    @often[arg0, stack(4)] = count();

}


profile:::tick-5sec

{

    normalize(@often, 5);

    printa(@often);

    clear(@often);

}

فيما يلي بعض الأشياء التي ينبغي تذكرها عن استخدام البرامج النصية dtrace(1M) lockstat وplockstat(1):

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

ستكون لتلك المثيلات أوقات انتظار طويلة تقلل الأداء بشكل فعلي.

نسبة استخدام القرص

iopending(1) يعطي إشارة عن عمق قوائم انتظار الإدخال/الإخراج، مثل المدرج التكراري لعمق قائمة الانتظار.  على سبيل المثال:

2008 May 21 10:35:26,  load: 0.99,  disk_r:      0 KB,  disk_w:    392 KB
           value  ------------- Distribution ------------- count   
             < 0 |                                         0       
               0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9298    
               1 |                                         12      
               2 |                                         5       
               3 |                                         4       
               4 |                                         2       
               5 |                                         3       
               6 |                                         2       
               7 |                                         2       
               8 |                                         3       
               9 |                                         2       
              10 |                                         3       
              11 |                                         2       
              12 |                                         2       
              13 |                                         2       
              14 |                                         2       
              15 |                                         0       

يُشير هذا إلى بعض نشاط القرص، ومع ذلك لا يمثل مشكلة حيث إن قائمة الانتظار الإدخال/الإخراج بأكملها يبلغ عمقها 0. إضافة إلى ذلك، يمكنك استخدام iopending للتركيز على قرص معين أو وحدة تخزين نظام ملفات معينة. على سبيل المثال، للتركيز على /Volumes/MyRAID، استخدم iopending -m MyRAID.

في النهاية، يمكنك إسناد الإدخال/الإخراج إلى عمليات معينة وتقييم زمن الانتقال باستخدام fs_usage(1). يمكنك معرفة المزيد عن استخدام Shark وfs_usage(1) في مستند المنافسة على اتصال المطوِّر هذا.

نسبة استخدام الشبكة

توجد للعديد من الخوادم عدة واجهات وأجهزة عميلة للشبكة على مسافات مختلفة عبر الشبكة. ويمكن أن يكون تحليل الأداء أمرًا معقدًا. على الرغم من ذلك، في حالات LAN، التي يتم فيها توصيل الأجهزة العميلة بشكل مباشر عبر شبكة نسيجية معروفة السرعة، ستوفر القياسات التي يتم الإبلاغ عنها عن طريق top_guide.pl وأيضًا netstat -i معلومات عن مدى نسبة السعة المستخدمة. وعند تفسير هذه الأرقام، يُرجى مراعاة هذه الإرشادات:

Gigabit Networks (شبكات جيجابت) - ازدواج كامل، 1500 بايت MTU
الحد الأقصى للمعدلات - حزم صغيرة: 1488 كيلوبت/ثانية   762 ميجابت/ثانية
الحد الأقصى لمعدل الحزمة - حزم بمعدل 1500 بايت: 81 كيلوبت/ثانية   987 ميجابت/ثانية
(كيلوبت/ثانية = آلاف الحزم في الثانية)

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

تعرّف على المزيد

يتم تقديم المعلومات حول المنتجات التي لم تُصنّعها Apple أو مواقع الويب المستقلة التي لا تخضع للمراقبة أو الاختبار من جانب Apple بدون توصيات أو موافقة. ولا تتحمّل Apple أية مسؤولية فيما يتعلق باختيار مواقع الويب والمنتجات التابعة لجهات خارجية أو أدائها أو استخدامها. ولا تُقدّم Apple أية ضمانات فيما يتعلق بدقة أو موثوقية مواقع الويب التابعة لجهات خارجية. اتصل بالبائع للحصول على المزيد من المعلومات.

تاريخ النشر: