سؤال

أريد أن أعرف ما إذا كان هناك حل فعال لرصد استهلاك موارد العملية (وحدة المعالجة المركزية والذاكرة وعرض النطاق الترددي الشبكي) في Linux. أريد أن أكتب الخفي في C ++ الذي يقوم بهذا المراقبة لبعض PIDs المعطى. من ما أعرفه، فإن الحل الكلاسيكي هو قراءة المعلومات من / proc بشكل دوري، ولكن هذا لا يبدو أن الطريقة الأكثر كفاءة (تنطوي على العديد من مكالمات النظام). على سبيل المثال لمراقبة استخدام الذاكرة كل ثانية لمدة 50 عملية، يجب أن أفتح، وقراءة وإغلاق 50 ملفات (تعني 150 مكالمات نظام) كل ثانية من / بروك. ناهيك عن التحليل المعني عند قراءة هذه الملفات.

مشكلة أخرى هي استهلاك الشبكة النطاق الترددي: لا يمكن حساب ذلك بسهولة حساب كل عملية أريد مراقبةها. ينطوي الحل الذي تم اعتماده من قبل Nethogs مرتفعا كبيرا في رأيي: إنه يلتقط وتحليلات كل حزمة باستخدام libpcap، ثم لكل حزمة يتم تحديد المنفذ المحلي وتفتيشها في / بروك للعثور على العملية المقابلة.

هل تعرف ما إذا كان هناك بدائل أكثر كفاءة لهذه الطرق المقدمة أو أي مكتبات تتعامل مع هذه المشاكل؟

هل كانت مفيدة؟

المحلول

/usr/src/linux/documentation/accounting/taskstats.txt.

محلات المهام هي واجهة NETLINK القائمة على إرسال إحصائيات لكل مهمة وعدم العملية من Kernel إلى مساحة المستثمار.

تم تصميم ملاسمات المهام للحصول على الفوائد التالية:

  • توفير إحصاءات بكفاءة أثناء حياة مهمة وعلى الخروج
  • واجهة موحدة للنظم الفرعية المحاسبية المتعددة
  • تسهيل الاستخدام من خلال بقع المحاسبة المستقبلية

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

هذا لا يفرق (على سبيل المثال) القرص I / O مقابل الشبكة I / O. إذا كان هذا مهم بالنسبة لك، فقد تذهب مع LD_PRELOAD مكتبة الاعتراض التي تعقب عمليات المقبس. على افتراض أنه يمكنك التحكم في بدء تشغيل البرامج التي ترغب في ملاحظتها وأنها لن تقوم بالتراضي خلف ظهرك، بالطبع.

لا أستطيع التفكير في أي حلول خفيفة الوزن إذا كانت تلك لا تزال تفشل، ولكن Linux- التدقيق يمكن أن تتبع على مستوى العالم syscalls، والتي تبدو أكثر عرضة قليلا من إعادة التقاط وتحليل حركة مرور الشبكة الخاصة بك.

نصائح أخرى

إلقاء نظرة على مجموعة أدوات Trace Linux (LTTNG). يقوم بإدراج Tracepoints في Kernel ولديه بعض معالجة النشر للحصول على بعض أنواع الإحصاءات التي تسأل عنها. تصبح ملفات التتبع كبيرة إذا كنت تلتقط كل شيء، ولكن يمكنك الاحتفاظ بالأشياء التي يمكن التحكم فيها إذا كنت تحد من أنواع الأحداث التي تقوم بها ذراعها.

http://lttng.org. لمزيد من المعلومات...

فيما يتعلق بنطاق النطاق الترددي: هذا الجواب الخارق يصف معالجة / PROC / NET / TCP لجمع استخدام النطاق الترددي الشبكي.

أعلم أن iPtables يمكن استخدامها للقيام بمحاسبة الشبكة (انظر، على سبيل المثال، LWN's, Linux.com, ، أو shorewall المقالات)، لكنني لا أرى أي طريقة عملية للقيام بمحاسبة ذلك على أساس لكل عملية.

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

كما هو الحال مع استخدام عرض النطاق الترددي للشبكة، هناك العديد من الأساليب، والتي تغلي أكثر أو أقل لالتقاط جميع حركة مرور الشبكة داخل وخارج الصندوق. يمكنك أيضا التفكير في كتابة وحدة نمطية خاصة (iPtables) التي تعمل بالضبط نوع العد الذي تحتاجه دون التقاط مرفقات المرور.

لقد صادفت هذا كما كنت أبحث عن إجابات لنفس الشيء. مجرد ملاحظة - عند استخدام / Proc FileSystem، لا يتعين عليك إغلاق الملف بعد كل قراءة. يمكنك الاحتفاظ بالملف مفتوح وفي كل مرة تقوم فيها بقراءة، وستحصل على إحصائيات جديدة ... لذلك، يجب أن لا يكون لديك النفقات العامة للفتح وإغلاق في كل مرة تريد فيها الحصول على الإحصائيات ... لدي هذا العمل في جافا سكريبت على node.js إذا كنت تريد مثالا ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top