.\" -*- coding: UTF-8 -*- .\" Copyright 2012, Vincent Weaver .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH perf_event_open 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم perf_event_open \- إعداد مراقبة الأداء .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP /* تعريف ثوابت \fBPERF_*\fP */ \fB#include \fP /* تعريف ثوابت \fBHW_*\fP */ \fB#include \fP /* تعريف ثوابت \fBSYS_*\fP */ \fB#include \fP .P \fBint syscall(SYS_perf_event_open, struct perf_event_attr *\fP\fIattr\fP\fB,\fP \fB pid_t \fP\fIpid\fP\fB, int \fP\fIcpu\fP\fB, int \fP\fIgroup_fd\fP\fB, unsigned long \fP\fIflags\fP\fB);\fP .fi .P \fIملاحظة\fP: لا توفر glibc غلافاً للدالة \fBperf_event_open\fP()، مما يستوجب استخدام \fBsyscall\fP(2). .SH الوصف بناءً على قائمة من المعلمات، تعيد \fBperf_event_open\fP() واصف ملف لاستخدامه في استدعاءات النظام اللاحقة (\fBread\fP(2)، و\fBmmap\fP(2)، و\fBprctl\fP(2)، و\fBfcntl\fP(2)، وغيرها). .PP يُنشئ استدعاء \fBperf_event_open\fP() واصف ملف يتيح قياس معلومات الأداء. يقابل كل واصف ملف حدثاً واحداً يُقاس؛ ويمكن تجميع هذه الواصفات معاً لقياس أحداث متعددة في وقت واحد. .P يمكن تفعيل الأحداث وتعطيلها بطريقتين: عبر \fBioctl\fP(2) وعبر \fBprctl\fP(2). عندما يُعطّل الحدث، فإنه لا يحسب أو يولد حالات طفح، ولكنه يستمر في الوجود ويحافظ على قيمة عداده. .P تأتي الأحداث بنوعين: معدودة وأخذ عينات. الحدث \fIالمعدود\fP هو الذي يُستخدم لعد العدد الإجمالي للأحداث التي تقع. بصفة عامة، تُجمع نتائج الأحداث المعدودة باستدعاء \fBread\fP(2). أما حدث \fIأخذ العينات\fP فيكتب القياسات بصفة دورية إلى مخبأ يمكن الوصول إليه عبر \fBmmap\fP(2). .SS المعطيات تسمح المعطيات \fIpid\fP و\fIcpu\fP بتحديد العملية ووحدة المعالجة المركزية المراد مراقبتها: .TP \fBpid == 0\fP و\fBcpu == \-1\fP يقيس هذا العملية/الخيط المستدعي على أي وحدة معالجة مركزية. .TP \fBpid == 0\fP و\fBcpu >= 0\fP يقيس هذا العملية/الخيط المستدعي فقط عند تشغيلها على وحدة المعالجة المركزية المحددة. .TP \fBpid > 0\fP و\fBcpu == \-1\fP يقيس هذا العملية/الخيط المحدد على أي وحدة معالجة مركزية. .TP \fBpid > 0\fP و\fBcpu >= 0\fP يقيس هذا العملية/الخيط المحدد فقط عند تشغيلها على وحدة المعالجة المركزية المحددة. .TP \fBpid == \-1\fP و\fBcpu >= 0\fP يقيس هذا جميع العمليات/الخيوط على وحدة المعالجة المركزية المحددة. يتطلب هذا صلاحية \fBCAP_PERFMON\fP (منذ لينكس 5.8) أو \fBCAP_SYS_ADMIN\fP أو قيمة أقل من 1 في الملف \fI/proc/sys/kernel/perf_event_paranoid\fP. .TP \fBpid == \-1\fP و\fBcpu == \-1\fP هذا الإعداد غير صالح وسيعيد خطأ. .P عندما تكون قيمة \fIpid\fP أكبر من الصفر، فإن الإذن بإجراء هذا الاستدعاء للنظام تحكمه صلاحية \fBCAP_PERFMON\fP (منذ لينكس 5.9) وفحص وضع وصول ptrace \fBPTRACE_MODE_READ_REALCREDS\fP في إصدارات لينكس القديمة؛ انظر \fBptrace\fP(2). .P يسمح المعطى \fIgroup_fd\fP بإنشاء مجموعات أحداث. تحتوي مجموعة الأحداث على حدث واحد يكون هو قائد المجموعة. يُنشأ القائد أولاً مع تعيين \fIgroup_fd\fP = \-1. تُنشأ بقية أعضاء المجموعة باستدعاءات \fBperf_event_open\fP() لاحقة مع تعيين \fIgroup_fd\fP ليكون واصف الملف لقائد المجموعة. (يُنشأ الحدث المنفرد مع تعيين \fIgroup_fd\fP = \-1 ويُعد مجموعة من عضو واحد فقط.) تُجدول مجموعة الأحداث على وحدة المعالجة المركزية كوحدة واحدة: لن توضع على وحدة المعالجة إلا إذا أمكن وضع جميع أحداث المجموعة عليها. وهذا يعني أن قيم الأحداث الأعضاء يمكن مقارنتها بشكل ذي معنى \[em]جمعها، أو قسمتها (للحصول على نسب)، وما إلى ذلك\[em] مع بعضها البعض، لأنها عدت أحداثاً لنفس المجموعة من التعليمات المنفذة. .P يُشكَّل المعطى \fIflags\fP بدمج صفر أو أكثر من القيم التالية باستخدام معامل OR المنطقي: .TP \fBPERF_FLAG_FD_CLOEXEC\fP (منذ لينكس 3.14) .\" commit a21b0b354d4ac39be691f51c53562e2c24443d9e يُفعل هذا العلم خاصية الغلق عند التنفيذ (close\-on\-exec) لواصف ملف الحدث المنشأ، بحيث يُغلق واصف الملف آلياً عند استدعاء \fBexecve\fP(2). إن ضبط أعلام الغلق عند التنفيذ وقت الإنشاء، بدلاً من القيام بذلك لاحقًا عبر \fBfcntl\fP(2)، يتجنب ظروف السباق المحتملة حيث يستدعي خيط الاستدعاء \fBperf_event_open\fP() و \fBfcntl\fP(2) في نفس الوقت الذي يستدعي فيه خيط آخر \fBfork\fP(2) ثم \fBexecve\fP(2). .TP \fBPERF_FLAG_FD_NO_GROUP\fP يخبر هذا العلم الحدث بتجاهل معلمة \fIgroup_fd\fP باستثناء غرض إعداد إعادة توجيه المخرجات باستخدام علم \fBPERF_FLAG_FD_OUTPUT\fP. .TP \fBPERF_FLAG_FD_OUTPUT\fP (معطل منذ لينكس 2.6.35) .\" commit ac9721f3f54b27a16c7e1afb2481e7ee95a70318 يعيد هذا العلم توجيه مخرجات العينات للحدث ليتم تضمينها بدلاً من ذلك في مخبأ mmap للحدث المحدد بواسطة \fIgroup_fd\fP. .TP \fBPERF_FLAG_PID_CGROUP\fP (منذ لينكس 2.6.39) .\" commit e5d1367f17ba6a6fed5fd8b74e4d5720923e0c25 يفعل هذا العلم مراقبة النظام بالكامل لكل حاوية. الحاوية هي تجريد يعزل مجموعة من الموارد للتحكم الدقيق (وحدات المعالجة، والذاكرة، إلخ). في هذا الوضع، يُقاس الحدث فقط إذا كان الخيط الذي يعمل على وحدة المعالجة المراقبة ينتمي إلى الحاوية المخصصة (cgroup). تُحدد cgroup بتمرير واصف ملف مفتوح على دليلها في نظام ملفات cgroupfs. على سبيل المثال، إذا كانت cgroup المراد مراقبتها تسمى \fItest\fP، فيجب تمرير واصف ملف مفتوح على \fI/dev/cgroup/test\fP (بافتراض أن cgroupfs موصول على \fI/dev/cgroup\fP) كمعلمة \fIpid\fP. تتوفر مراقبة cgroup فقط لأحداث النظام بالكامل، وبالتالي قد تتطلب صلاحيات إضافية. .P توفر بنية \fIperf_event_attr\fP معلومات ضبط مفصلة للحدث الجاري إنشاؤه. .P .in +4n .EX struct perf_event_attr { __u32 type; /* نوع الحدث */ __u32 size; /* حجم بنية السمات */ __u64 config; /* الضبط الخاص بالنوع */ \& union { __u64 sample_period; /* فترة أخذ العينات */ __u64 sample_freq; /* تردد أخذ العينات */ }; \& __u64 sample_type; /* يحدد القيم المضمنة في العينة */ __u64 read_format; /* يحدد القيم المعادة في القراءة */ \& __u64 disabled : 1, /* معطل مبدئياً */ inherit : 1, /* يرثه الأبناء */ pinned : 1, /* يجب أن يكون دائماً على وحدة مراقبة الأداء (PMU) */ exclusive : 1, /* المجموعة الوحيدة على PMU */ exclude_user : 1, /* لا تحسب المستخدم */ exclude_kernel : 1, /* لا تحسب النواة */ exclude_hv : 1, /* لا تحسب المراقب الفائق */ exclude_idle : 1, /* لا تحسب عند الخمول */ mmap : 1, /* تضمين بيانات mmap */ comm : 1, /* تضمين بيانات comm */ freq : 1, /* استخدام التردد وليس الفترة */ inherit_stat : 1, /* عد لكل مهمة */ enable_on_exec : 1, /* التنفيذ التالي يفعله */ task : 1, /* تتبع التفريع/الخروج */ watermark : 1, /* علامة الاستيقاظ المائية */ precise_ip : 2, /* قيد الانزلاق */ mmap_data : 1, /* بيانات mmap غير التنفيذية */ sample_id_all : 1, /* معرف العينة لجميع الأحداث */ exclude_host : 1, /* لا تحسب في المضيف */ exclude_guest : 1, /* لا تحسب في الضيف */ exclude_callchain_kernel : 1, /* استثناء سلاسل استدعاء النواة */ exclude_callchain_user : 1, /* استثناء سلاسل استدعاء المستخدم */ mmap2 : 1, /* تضمين mmap مع بيانات inode */ comm_exec : 1, /* وسم أحداث comm الناتجة عن التنفيذ */ use_clockid : 1, /* استخدام clockid لحقول الوقت */ context_switch : 1, /* بيانات تبديل السياق */ write_backward : 1, /* كتابة المخبأ الحلقي من النهاية إلى البداية */ namespaces : 1, /* تضمين بيانات مساحات الأسماء */ ksymbol : 1, /* تضمين أحداث ksymbol */ bpf_event : 1, /* تضمين أحداث bpf */ aux_output : 1, /* توليد سجلات AUX بدلاً من الأحداث */ cgroup : 1, /* تضمين أحداث cgroup */ text_poke : 1, /* تضمين أحداث تعديل النص */ build_id : 1, /* استخدام معرف البناء في أحداث mmap2 */ inherit_thread : 1, /* يرث الأبناء فقط إذا استُخدم CLONE_THREAD */ remove_on_exec : 1, /* يُزال الحدث من المهمة عند التنفيذ */ sigtrap : 1, /* إرسال SIGTRAP متزامن عند الحدث */ \& __reserved_1 : 26; \& union { __u32 wakeup_events; /* الاستيقاظ كل n حدث */ __u32 wakeup_watermark; /* البايتات قبل الاستيقاظ */ }; \& __u32 bp_type; /* نوع نقطة التوقف */ \& union { __u64 bp_addr; /* عنوان نقطة التوقف */ __u64 kprobe_func; /* لـ perf_kprobe */ __u64 uprobe_path; /* لـ perf_uprobe */ __u64 config1; /* امتداد لـ config */ }; \& union { __u64 bp_len; /* حجم نقطة التوقف */ __u64 kprobe_addr; /* مع kprobe_func == NULL */ __u64 probe_offset; /* لـ perf_[k,u]probe */ __u64 config2; /* امتداد لـ config1 */ }; __u64 branch_sample_type; /* نوع عينة التفرع */ __u64 sample_regs_user; /* سجلات المستخدم لتفريغها عند العينات */ __u32 sample_stack_user; /* حجم المكدس لتفريغه عند العينات */ __s32 clockid; /* الساعة المستخدمة لحقول الوقت */ __u64 sample_regs_intr; /* السجلات لتفريغها عند العينات */ __u32 aux_watermark; /* بايتات aux قبل الاستيقاظ */ __u16 sample_max_stack; /* أقصى عدد من الإطارات في سلسلة الاستدعاء */ __u16 __reserved_2; /* موازاة إلى u64 */ __u32 aux_sample_size; /* أقصى حجم لعينة aux */ __u32 __reserved_3; /* موازاة إلى u64 */ __u64 sig_data; /* بيانات المستخدم لـ sigtrap */ \& }; .EE .in .P وُصفت حقول بنية \fIperf_event_attr\fP بمزيد من التفصيل أدناه: .TP \fItype\fP يحدد هذا الحقل نوع الحدث العام. ويأخذ إحدى القيم التالية: .RS .TP \fBPERF_TYPE_HARDWARE\fP يشير هذا إلى أحد أحداث العتاد "المعممة" التي توفرها النواة. انظر تعريف حقل \fIconfig\fP لمزيد من التفاصيل. .TP \fBPERF_TYPE_SOFTWARE\fP يشير هذا إلى أحد الأحداث المعرفة برمجياً التي توفرها النواة (حتى لو لم يتوفر دعم عتادي). .TP \fBPERF_TYPE_TRACEPOINT\fP يشير هذا إلى نقطة تتبع توفرها البنية التحتية لنقاط تتبع النواة. .TP \fBPERF_TYPE_HW_CACHE\fP يشير هذا إلى حدث في خبيئة العتاد. وله ترميز خاص مشروح في تعريف حقل \fIconfig\fP. .TP \fBPERF_TYPE_RAW\fP يشير هذا إلى حدث "خام" خاص بالتنفيذ في حقل \fIconfig\fP. .TP \fBPERF_TYPE_BREAKPOINT\fP (منذ لينكس 2.6.33) .\" commit 24f1e32c60c45c89a997c73395b69c8af6f0a84e يشير هذا إلى نقطة توقف عتادية كما توفرها وحدة المعالجة المركزية. يمكن أن تكون نقاط التوقف عمليات وصول للقراءة/الكتابة إلى عنوان ما، وكذلك تنفيذ لعنوان تعليمة. .TP وحدة مراقبة أداء (PMU) ديناميكية .\" commit 2e80a82a49c4c7eca4e35734380f28298ba5db19 منذ لينكس 2.6.38، يمكن لـ \fBperf_event_open\fP() دعم وحدات PMU متعددة. لتفعيل ذلك، يمكن استخدام قيمة تصدرها النواة في حقل \fItype\fP للإشارة إلى وحدة PMU المراد استخدامها. يمكن العثور على القيمة المطلوب استخدامها في نظام ملفات sysfs: يوجد دليل فرعي لكل مثيل PMU تحت \fI/sys/bus/event_source/devices\fP. يوجد في كل دليل فرعي ملف \fItype\fP محتواه عدد صحيح يمكن استخدامه في حقل \fItype\fP. على سبيل المثال، يحتوي \fI/sys/bus/event_source/devices/cpu/type\fP على قيمة وحدة PMU لنواة وحدة المعالجة المركزية، وهي عادة 4. .TP \fBkprobe\fP .TQ \fBuprobe\fP (كلاهما منذ لينكس 4.17) .\" commit 65074d43fc77bcae32776724b7fa2696923c78e4 .\" commit e12f03d7031a977356e3d7b75a68c2185ff8d155 .\" commit 33ea4b24277b06dbc55d7f5772a46f029600255e تنشئ وحدتا PMU الديناميكيتان هاتان kprobe/uprobe وتربطانه بواصف الملف الناتج عن perf_event_open. وسيُحذف kprobe/uprobe عند حذف واصف الملف. انظر الحقول \fIkprobe_func\fP و\fIuprobe_path\fP و\fIkprobe_addr\fP و\fIprobe_offset\fP لمزيد من التفاصيل. .RE .TP \fIsize\fP حجم بنية \fIperf_event_attr\fP للتوافقية الأمامية والخلفية. اضبط هذا باستخدام \fIsizeof(struct perf_event_attr)\fP للسماح للنواة برؤية حجم البنية وقت التصريف. .IP .\" commit cb5d76999029ae7a517cb07dfa732c1b5a934fc2 .\" this was added much later when PERF_ATTR_SIZE_VER2 happened .\" but the actual attr_size had increased in Linux 2.6.33 .\" commit cb5d76999029ae7a517cb07dfa732c1b5a934fc2 .\" commit 1659d129ed014b715b0b2120e6fd929bdd33ed03 .\" commit 60e2364e60e86e81bc6377f49779779e6120977f .\" commit 1a5941312414c71dece6717da9a0fa1303127afa عُيّن التعريف ذو الصلة \fBPERF_ATTR_SIZE_VER0\fP إلى 64؛ وكان هذا حجم أول بنية نُشرت. و\fBPERF_ATTR_SIZE_VER1\fP هو 72، ويقابل إضافة نقاط التوقف في لينكس 2.6.33. و\fBPERF_ATTR_SIZE_VER2\fP هو 80 ويقابل إضافة أخذ عينات التفرع في لينكس 3.4. و\fBPERF_ATTR_SIZE_VER3\fP هو 96 ويقابل إضافة \fIsample_regs_user\fP و \fIsample_stack_user\fP في لينكس 3.7. و\fBPERF_ATTR_SIZE_VER4\fP هو 104 ويقابل إضافة \fIsample_regs_intr\fP في لينكس 3.19. و\fBPERF_ATTR_SIZE_VER5\fP هو 112 ويقابل إضافة \fIaux_watermark\fP في لينكس 4.1. .TP \fIconfig\fP يحدد هذا الحدث الذي تريده، بالاشتراك مع حقل \fItype\fP. كما تُؤخذ الحقول \fIconfig1\fP و\fIconfig2\fP في الاعتبار في الحالات التي لا يكفي فيها 64 بتاً لتحديد الحدث بشكل كامل. يعتمد ترميز هذه الحقول على نوع الحدث. .IP توجد طرق متنوعة لضبط حقل \fIconfig\fP تعتمد على قيمة حقل \fItype\fP الموصوف سابقاً. وفيما يلي الإعدادات المختلفة الممكنة لـ \fIconfig\fP مقسمة حسب \fItype\fP. .IP إذا كان \fItype\fP هو \fBPERF_TYPE_HARDWARE\fP، فإننا نقيس أحد أحداث وحدة المعالجة المركزية العتادية الموحدة. ليست كل هذه الأحداث متاحة في جميع المنصات. اضبط \fIconfig\fP على أحد الخيارات التالية: .RS 12 .TP \fBPERF_COUNT_HW_CPU_CYCLES\fP إجمالي الدورات. كن حذرًا مما يحدث أثناء تغيير تردد وحدة المعالجة المركزية. .TP \fBPERF_COUNT_HW_INSTRUCTIONS\fP التعليمات المتقاعدة. كن حذرًا، فقد تتأثر هذه بمشكلات متنوعة، وأبرزها عدادات المقاطعات العتادية. .TP \fBPERF_COUNT_HW_CACHE_REFERENCES\fP الوصول إلى الخبيئة. يشير هذا عادةً إلى الوصول إلى خبيئة المستوى الأخير ولكن قد يختلف ذلك حسب وحدة المعالجة المركزية لديك. قد يتضمن هذا الجلب المسبق ورسائل التماسك؛ ومرة أخرى، يعتمد هذا على تصميم وحدة المعالجة المركزية لديك. .TP \fBPERF_COUNT_HW_CACHE_MISSES\fP إخفاقات الخبيئة. يشير هذا عادةً إلى إخفاقات خبيئة المستوى الأخير؛ ويُقصد استخدامه بالاقتران مع حدث \fBPERF_COUNT_HW_CACHE_REFERENCES\fP لحساب معدلات إخفاق الخبيئة. .TP \fBPERF_COUNT_HW_BRANCH_INSTRUCTIONS\fP .\" commit f287d332ce835f77a4f5077d2c0ef1e3f9ea42d2 تعليمات التفرع المتقاعدة. قبل لينكس 2.6.35، كان هذا يستخدم الحدث الخاطئ على معالجات AMD. .TP \fBPERF_COUNT_HW_BRANCH_MISSES\fP تعليمات التفرع التي أُسيء التنبؤ بها. .TP \fBPERF_COUNT_HW_BUS_CYCLES\fP دورات الناقل، والتي يمكن أن تختلف عن إجمالي الدورات. .TP \fBPERF_COUNT_HW_STALLED_CYCLES_FRONTEND\fP (منذ لينكس 3.0) .\" commit 8f62242246351b5a4bc0c1f00c0c7003edea128a الدورات المتوقفة أثناء الإصدار. .TP \fBPERF_COUNT_HW_STALLED_CYCLES_BACKEND\fP (منذ لينكس 3.0) .\" commit 8f62242246351b5a4bc0c1f00c0c7003edea128a الدورات المتوقفة أثناء التقاعد. .TP \fBPERF_COUNT_HW_REF_CPU_CYCLES\fP (منذ لينكس 3.3) .\" commit c37e17497e01fc0f5d2d6feb5723b210b3ab8890 إجمالي الدورات؛ لا يتأثر بتغيير تردد وحدة المعالجة المركزية. .RE .IP إذا كان \fItype\fP هو \fBPERF_TYPE_SOFTWARE\fP، فإننا نقيس أحداث البرمجيات التي توفرها النواة. اضبط \fIconfig\fP على أحد الخيارات التالية: .RS 12 .TP \fBPERF_COUNT_SW_CPU_CLOCK\fP يبلغ هذا عن ساعة وحدة المعالجة المركزية، وهي مؤقت عالي الدقة لكل معالج. .TP \fBPERF_COUNT_SW_TASK_CLOCK\fP يبلغ هذا عن عدد دورات الساعة الخاصة بالمهمة التي تعمل. .TP \fBPERF_COUNT_SW_PAGE_FAULTS\fP يبلغ هذا عن عدد إخفاقات الصفحة. .TP \fBPERF_COUNT_SW_CONTEXT_SWITCHES\fP .\" commit e49a5bd38159dfb1928fd25b173bc9de4bbadb21 يحسب هذا تبديلات السياق. حتى لينكس 2.6.34، أُبلغ عن كل هذه كأحداث في مساحة المستخدم، وبعد ذلك أُبلغ عنها كأحداث تقع في النواة. .TP \fBPERF_COUNT_SW_CPU_MIGRATIONS\fP يبلغ هذا عن عدد المرات التي انتقلت فيها العملية إلى وحدة معالجة مركزية جديدة. .TP \fBPERF_COUNT_SW_PAGE_FAULTS_MIN\fP يحسب هذا عدد إخفاقات الصفحة الصغرى. لم تتطلب هذه إدخالاً/إخراجاً للقرص لمعالجتها. .TP \fBPERF_COUNT_SW_PAGE_FAULTS_MAJ\fP يحسب هذا عدد إخفاقات الصفحة الكبرى. تطلبت هذه إدخالاً/إخراجاً للقرص لمعالجتها. .TP \fBPERF_COUNT_SW_ALIGNMENT_FAULTS\fP (منذ لينكس 2.6.33) .\" commit f7d7986060b2890fc26db6ab5203efbd33aa2497 يحسب هذا عدد أخطاء المحاذاة. تحدث هذه عند إجراء عمليات وصول غير محاذية للذاكرة؛ تستطيع النواة معالجة هذه الأخطاء ولكن ذلك يقلل من الأداء. يحدث هذا فقط في بعض المعماريات (أبداً على x86). .TP \fBPERF_COUNT_SW_EMULATION_FAULTS\fP (منذ لينكس 2.6.33) .\" commit f7d7986060b2890fc26db6ab5203efbd33aa2497 يحسب هذا عدد أخطاء المحاكاة. تصيد النواة أحياناً التعليمات غير المنفذة وتحاكيها لمساحة المستخدم. يمكن أن يؤثر هذا سلباً على الأداء. .TP \fBPERF_COUNT_SW_DUMMY\fP (منذ لينكس 3.12) .\" commit fa0097ee690693006ab1aea6c01ad3c851b65c77 هذا حدث نائِب لا يحسب شيئاً. يجب ربط أنواع سجلات العينات المعلوماتية مثل mmap أو comm بحدث نشط. يسمح هذا الحدث الوهمي بجمع مثل هذه السجلات دون الحاجة لحدث حاسِب. .TP \fBPERF_COUNT_SW_BPF_OUTPUT\fP (منذ لينكس 4.4) .\" commit a43eec304259a6c637f4014a6d4767159b6a3aa3 يُستخدم هذا لتوليد بيانات عينات خام من BPF. يمكن لبرامج BPF الكتابة في هذا الحدث باستخدام المساعد \fBbpf_perf_event_output\fP. .TP \fBPERF_COUNT_SW_CGROUP_SWITCHES\fP (منذ لينكس 5.13) .\" commit d0d1dd628527c77db2391ce0293c1ed344b2365f يحسب هذا تبديلات السياق لمهمة في مجموعة تحكم (cgroup) مختلفة. بمعنى آخر، إذا كانت المهمة التالية في نفس مجموعة التحكم، فلن يُحسب التبديل. .RE .P .RS إذا كان \fItype\fP هو \fBPERF_TYPE_TRACEPOINT\fP، فإننا نقيس نقاط تتبع النواة. يمكن الحصول على القيمة المستخدمة في \fIconfig\fP من مسار debugfs \fItracing/events/*/*/id\fP إذا وُجد ftrace مفعلاً في النواة. .RE .P .RS إذا كان \fItype\fP هو \fBPERF_TYPE_HW_CACHE\fP، فإننا نقيس حدث خبيئة وحدة معالجة مركزية عتادية. لحساب قيمة \fIconfig\fP المناسبة، استخدم المعادلة التالية: .RS 4 .P .in +4n .EX config = (perf_hw_cache_id) | (perf_hw_cache_op_id << 8) | (perf_hw_cache_op_result_id << 16); .EE .in .P حيث \fIperf_hw_cache_id\fP هو واحد من: .RS 4 .TP \fBPERF_COUNT_HW_CACHE_L1D\fP لقياس خبيئة البيانات من المستوى 1 .TP \fBPERF_COUNT_HW_CACHE_L1I\fP لقياس خبيئة التعليمات من المستوى 1 .TP \fBPERF_COUNT_HW_CACHE_LL\fP لقياس خبيئة المستوى الأخير .TP \fBPERF_COUNT_HW_CACHE_DTLB\fP لقياس مخزن الترجمة المؤقت للبيانات (Data TLB) .TP \fBPERF_COUNT_HW_CACHE_ITLB\fP لقياس مخزن الترجمة المؤقت للتعليمات (Instruction TLB) .TP \fBPERF_COUNT_HW_CACHE_BPU\fP لقياس وحدة التنبؤ بالتفرع .TP \fBPERF_COUNT_HW_CACHE_NODE\fP (منذ لينكس 3.1) .\" commit 89d6c0b5bdbb1927775584dcf532d98b3efe1477 لقياس عمليات الوصول إلى الذاكرة المحلية .RE .P و \fIperf_hw_cache_op_id\fP هو واحد من: .RS 4 .TP \fBPERF_COUNT_HW_CACHE_OP_READ\fP لعمليات الوصول المخصصة للقراءة .TP \fBPERF_COUNT_HW_CACHE_OP_WRITE\fP لعمليات الوصول المخصصة للكتابة .TP \fBPERF_COUNT_HW_CACHE_OP_PREFETCH\fP لعمليات وصول الجلب المسبق .RE .P ويكون \fIperf_hw_cache_op_result_id\fP واحدًا مما يلي: .RS 4 .TP \fBPERF_COUNT_HW_CACHE_RESULT_ACCESS\fP لقياس عمليات الوصول .TP \fBPERF_COUNT_HW_CACHE_RESULT_MISS\fP لقياس الإخفاقات .RE .RE .P إذا كان \fItype\fP هو \fBPERF_TYPE_RAW\fP، فستكون هناك حاجة إلى قيمة \fIconfig\fP "خام" مخصصة. تدعم معظم وحدات المعالجة المركزية أحداثًا لا تغطيها الأحداث "المعممة". هذه الأحداث محددة حسب التنفيذ؛ راجع دليل وحدة المعالجة المركزية (على سبيل المثال، وثائق Intel المجلد 3B، أو دليل مطور النواة و BIOS من AMD). يمكن استخدام مكتبة libpfm4 للترجمة من الاسم الموجود في الأدلة المعمارية إلى القيمة الست عشرية الخام التي يتوقعها \fBperf_event_open\fP() في هذا الحقل. .P إذا كان \fItype\fP هو \fBPERF_TYPE_BREAKPOINT\fP، فاترك \fIconfig\fP مضبوطًا على الصفر. تُضبط معلماته في أماكن أخرى. .P إذا كان \fItype\fP هو \fBkprobe\fP أو \fBuprobe\fP، فاضبط \fIretprobe\fP (البت 0 من \fIconfig\fP، راجع \fI/sys/bus/event_source/devices/[k,u]probe/format/retprobe\fP) لأجل kretprobe/uretprobe. راجع الحقول \fIkprobe_func\fP و \fIuprobe_path\fP و \fIkprobe_addr\fP و \fIprobe_offset\fP لمزيد من التفاصيل. .RE .TP \fIkprobe_func\fP .TQ \fIuprobe_path\fP .TQ \fIkprobe_addr\fP .TQ \fIprobe_offset\fP تصف هذه الحقول kprobe/uprobe لوحدات PMU الديناميكية \fBkprobe\fP و \fBuprobe\fP. بالنسبة لـ \fBkprobe\fP: استخدم \fIkprobe_func\fP و \fIprobe_offset\fP، أو استخدم \fIkprobe_addr\fP واترك \fIkprobe_func\fP كـ NULL. بالنسبة لـ \fBuprobe\fP: استخدم \fIuprobe_path\fP و \fIprobe_offset\fP. .TP \fIsample_period\fP .TQ \fIsample_freq\fP حدث "أخذ العينات" هو حدث يولد إشعار تجاوز السعة كل N من الأحداث، حيث تُعطى N بواسطة \fIsample_period\fP. يكون لحدث أخذ العينات \fIsample_period\fP أكبر من 0. وعند حدوث تجاوز للسعة، تُسجل البيانات المطلوبة في ذاكرة mmap الوسيطة. يتحكم الحقل \fIsample_type\fP في البيانات التي تُسجل عند كل تجاوز للسعة. .IP يمكن استخدام \fIsample_freq\fP إذا كنت ترغب في استخدام التردد بدلاً من الفترة. في هذه الحالة، تضبط علامة \fIfreq\fP. ستقوم النواة بضبط فترة أخذ العينات لمحاولة تحقيق المعدل المطلوب. معدل الضبط هو تكة المؤقت. .TP \fIsample_type\fP تحدد البتات المختلفة في هذا الحقل القيم التي يجب تضمينها في العينة. ستُسجل في ذاكرة وسيطة حلقية، وهي متاحة لمساحة المستخدم باستخدام \fBmmap\fP(2). الترتيب الذي تُحفظ به القيم في العينة موثق في القسم الفرعي تخطيط MMAP أدناه؛ وليس ترتيب \fIenum perf_event_sample_format\fP. .RS .TP \fBPERF_SAMPLE_IP\fP يسجل مؤشر التعليمات. .TP \fBPERF_SAMPLE_TID\fP يسجل معرفات العملية والمسار. .TP \fBPERF_SAMPLE_TIME\fP يسجل طابعًا زمنيًا. .TP \fBPERF_SAMPLE_ADDR\fP يسجل عنوانًا، إذا كان ذلك متاحًا. .TP \fBPERF_SAMPLE_READ\fP تسجيل قيم العداد لجميع الأحداث في مجموعة، وليس فقط قائد المجموعة. .TP \fBPERF_SAMPLE_CALLCHAIN\fP يسجل سلسلة الاستدعاء (تتبع الكومة الخلفي). .TP \fBPERF_SAMPLE_ID\fP يسجل معرفًا فريدًا لقائد مجموعة الأحداث المفتوحة. .TP \fBPERF_SAMPLE_CPU\fP يسجل رقم وحدة المعالجة المركزية. .TP \fBPERF_SAMPLE_PERIOD\fP يسجل فترة أخذ العينات الحالية. .TP \fBPERF_SAMPLE_STREAM_ID\fP يسجل معرفًا فريدًا للحدث المفتوح. على عكس \fBPERF_SAMPLE_ID\fP، يُعاد المعرف الفعلي، وليس قائد المجموعة. هذا المعرف هو نفسه الذي يعيده \fBPERF_FORMAT_ID\fP. .TP \fBPERF_SAMPLE_RAW\fP يسجل بيانات إضافية، إذا كان ذلك متاحًا. عادة ما تُعاد بواسطة أحداث نقطة التتبع. .TP \fBPERF_SAMPLE_BRANCH_STACK\fP (منذ لينكس 3.4) .\" commit bce38cd53e5ddba9cb6d708c4ef3d04a4016ec7e يوفر هذا سجلاً للفروع الحديثة، كما توفره أجهزة أخذ عينات الفروع في وحدة المعالجة المركزية (مثل Intel Last Branch Record). لا تدعم كل الأجهزة هذه الميزة. .IP راجع حقل \fIbranch_sample_type\fP لمعرفة كيفية تصفية الفروع التي يتم الإبلاغ عنها. .TP \fBPERF_SAMPLE_REGS_USER\fP (منذ لينكس 3.7) .\" commit 4018994f3d8785275ef0e7391b75c3462c029e56 يسجل حالة سجل وحدة المعالجة المركزية الحالية على مستوى المستخدم (القيم الموجودة في العملية قبل استدعاء النواة). .TP \fBPERF_SAMPLE_STACK_USER\fP (منذ لينكس 3.7) .\" commit c5ebcedb566ef17bda7b02686e0d658a7bb42ee7 يسجل كومة مستوى المستخدم، مما يسمح بفك الكومة. .TP \fBPERF_SAMPLE_WEIGHT\fP (منذ لينكس 3.10) .\" commit c3feedf2aaf9ac8bad6f19f5d21e4ee0b4b87e9c يسجل قيمة وزن توفرها الأجهزة تعبر عن مدى تكلفة الحدث الذي تم أخذ عينة منه. يتيح ذلك للأجهزة إبراز الأحداث المكلفة في التشكيلة. .TP \fBPERF_SAMPLE_DATA_SRC\fP (منذ لينكس 3.10) .\" commit d6be9ad6c960f43800a6f118932bc8a5a4eadcd1 يسجل مصدر البيانات: من أين أتت البيانات المرتبطة بالتعليمات التي تم أخذ عينة منها في هرمية الذاكرة. يتوفر هذا فقط إذا كانت الأجهزة الأساسية تدعم هذه الميزة. .TP \fBPERF_SAMPLE_IDENTIFIER\fP (منذ لينكس 3.12) .\" commit ff3d527cebc1fa3707c617bfe9e74f53fcfb0955 يضع قيمة \fBSAMPLE_ID\fP في موضع ثابت في السجل، إما في البداية (لأحداث العينة) أو في النهاية (إذا كان حدثًا ليس عينة). .IP كان هذا ضروريًا لأن دفق العينات قد يحتوي على سجلات من مصادر أحداث مختلفة مع إعدادات \fIsample_type\fP مختلفة. لم يكن من الممكن تحليل دفق الأحداث بشكل صحيح لأن تنسيق السجل كان مطلوبًا للعثور على \fBSAMPLE_ID\fP، ولكن تعذر العثور على التنسيق دون معرفة الحدث الذي تنتمي إليه العينة (مما يسبب تبعية دائرية). .IP يجعل إعداد \fBPERF_SAMPLE_IDENTIFIER\fP دفق الأحداث قابلاً للتحليل دائمًا عن طريق وضع \fBSAMPLE_ID\fP في موقع ثابت، على الرغم من أن ذلك يعني وجود قيم \fBSAMPLE_ID\fP مكررة في السجلات. .TP \fBPERF_SAMPLE_TRANSACTION\fP (منذ لينكس 3.13) .\" commit fdfbbd07e91f8fe387140776f3fd94605f0c89e5 يسجل أسباب أحداث إجهاض الذاكرة التعاملية (على سبيل المثال، من دعم الذاكرة التعاملية Intel TSX). .IP يجب أن يكون إعداد \fIprecise_ip\fP أكبر من 0 ويجب قياس حدث إجهاض الذاكرة التعاملية وإلا لن تُسجل أي قيم. لاحظ أيضًا أن بعض قياسات perf_event، مثل عد الدورات المأخوذ عينات منها، قد تسبب إجهاضات خارجية (عن طريق التسبب في مقاطعة أثناء المعاملة). .TP \fBPERF_SAMPLE_REGS_INTR\fP (منذ لينكس 3.19) .\" commit 60e2364e60e86e81bc6377f49779779e6120977f يسجل مجموعة فرعية من حالة سجل وحدة المعالجة المركزية الحالية كما هو محدد بواسطة \fIsample_regs_intr\fP. على عكس \fBPERF_SAMPLE_REGS_USER\fP، ستعيد قيم السجلات حالة سجل النواة إذا حدث التجاوز أثناء تشغيل كود النواة. إذا كانت وحدة المعالجة المركزية تدعم أخذ عينات الأجهزة لحالة السجل (أي، PEBS على Intel x86) وضُبط \fIprecise_ip\fP على قيمة أعلى من الصفر، فإن قيم السجل المعادة هي تلك التي التقطتها الأجهزة في وقت تقاعد التعليمة التي أُخذ عينة منها. .TP \fBPERF_SAMPLE_PHYS_ADDR\fP (منذ لينكس 4.13) .\" commit fc7ce9c74c3ad232b084d80148654f926d01ece7 يسجل العنوان الفيزيائي للبيانات كما في \fBPERF_SAMPLE_ADDR\fP. .TP \fBPERF_SAMPLE_CGROUP\fP (منذ لينكس 5.7) .\" commit 96aaab686505c449e24d76e76507290dcc30e008 يسجل معرف cgroup (perf_event) للعملية. يتوافق هذا مع حقل \fIid\fP في حدث \fBPERF_RECORD_CGROUP\fP. .TP \fBPERF_SAMPLE_DATA_PAGE_SIZE\fP (منذ لينكس 5.11) .\" commit 8d97e71811aaafe4abf611dc24822fd6e73df1a1 يسجل حجم صفحة البيانات كما في \fBPERF_SAMPLE_ADDR\fP. .TP \fBPERF_SAMPLE_CODE_PAGE_SIZE\fP (منذ لينكس 5.11) .\" commit 995f088efebe1eba0282a6ffa12411b37f8990c2 يسجل حجم صفحة ip كما في \fBPERF_SAMPLE_IP\fP. .TP \fBPERF_SAMPLE_WEIGHT_STRUCT\fP (منذ لينكس 5.12) .\" commit 2a6c6b7d7ad346f0679d0963cb19b3f0ea7ef32c يسجل قيم الوزن التي توفرها العتاد كما في \fBPERF_SAMPLE_WEIGHT\fP، ولكن يمكنه تمثيل قيم متعددة في بنية (struct). يتشارك هذا الحقل نفس المساحة مع \fBPERF_SAMPLE_WEIGHT\fP، لذا يمكن للمستخدمين تطبيق أحدهما وليس كلاهما. له التنسيق التالي ويعتمد معنى كل حقل على تطبيق العتاد. .P .in +4n .EX union perf_sample_weight { u64 full; /* PERF_SAMPLE_WEIGHT */ struct { /* PERF_SAMPLE_WEIGHT_STRUCT */ u32 var1_dw; u16 var2_w; u16 var3_w; }; }; .EE .in .RE .TP \fIread_format\fP يحدد هذا الحقل تنسيق البيانات التي يعيدها \fBread\fP(2) في واصف ملف \fBperf_event_open\fP(). .RS .TP \fBPERF_FORMAT_TOTAL_TIME_ENABLED\fP يضيف حقل \fItime_enabled\fP بطول 64 بت. يمكن استخدامه لحساب الإجماليات المقدرة إذا كانت وحدة مراقبة الأداء (PMU) مفرطة الالتزام ويحدث تعدد إرسال. .TP \fBPERF_FORMAT_TOTAL_TIME_RUNNING\fP يضيف حقل \fItime_running\fP بطول 64 بت. يمكن استخدامه لحساب الإجماليات المقدرة إذا كانت وحدة مراقبة الأداء (PMU) مفرطة الالتزام ويحدث تعدد إرسال. .TP \fBPERF_FORMAT_ID\fP يضيف قيمة فريدة بطول 64 بت تقابل مجموعة الأحداث. .TP \fBPERF_FORMAT_GROUP\fP يسمح بقراءة جميع قيم العدادات في مجموعة أحداث بعملية قراءة واحدة. .TP \fBPERF_FORMAT_LOST (منذ لينكس 6.0)\fP .\" commit 119a784c81270eb88e573174ed2209225d646656 يضيف قيمة بطول 64 بت تمثل عدد العينات المفقودة لهذا الحدث. لن يكون لهذا معنى إلا عند ضبط \fIsample_period\fP أو \fIsample_freq\fP. .RE .TP \fIdisabled\fP تحدد بتة \fIdisabled\fP ما إذا كان العداد سيبدأ معطلاً أم مفعلاً. إذا عُطل، يمكن تفعيل الحدث لاحقًا بواسطة \fBioctl\fP(2) أو \fBprctl\fP(2) أو \fIenable_on_exec\fP. .IP عند إنشاء مجموعة أحداث، يُهيأ قائد المجموعة عادةً مع ضبط \fIdisabled\fP على 1، وتُهيأ أي أحداث تابعة مع ضبط \fIdisabled\fP على 0. وبالرغم من كون \fIdisabled\fP بقيمة 0، لن تبدأ الأحداث التابعة حتى يُفعل قائد المجموعة. .TP \fIinherit\fP تحدد بتة \fIinherit\fP وجوب قيام هذا العداد بعد أحداث المهام التابعة بالإضافة إلى المهمة المحددة. ينطبق هذا فقط على التوابع الجدد، وليس على أي توابع موجودين وقت إنشاء العداد (ولا على أي توابع جدد لتوابع موجودين). .IP لا تعمل الوراثة (Inherit) مع بعض تركيبات قيم \fIread_format\fP، مثل \fBPERF_FORMAT_GROUP\fP. بالإضافة إلى ذلك، فإن استخدامها مع \fIcpu == \-1\fP يمنع إنشاء مخزن mmap الدائري المستخدم لتسجيل الأحداث غير المتزامنة في نمط أخذ العينات. .TP \fIpinned\fP تحدد بتة \fIpinned\fP وجوب بقاء العداد دائماً على المعالج إن أمكن ذلك. تنطبق فقط على العدادات العتادية وعلى قادة المجموعات فقط. إذا تعذر وضع عداد مثبت على المعالج (مثلاً لعدم كفاية العدادات العتادية أو بسبب تعارض مع حدث آخر)، ينتقل العداد إلى حالة 'خطأ'، حيث تعيد عمليات القراءة نهاية الملف (أي يعيد \fBread\fP(2) القيمة 0) حتى يُفعل العداد أو يُعطل لاحقًا. .TP \fIexclusive\fP تحدد بتة \fIexclusive\fP أنه عندما تكون مجموعة هذا العداد على المعالج، يجب أن تكون هي المجموعة الوحيدة التي تستخدم عدادات المعالج. قد يسمح هذا مستقبلاً لبرامج المراقبة بدعم ميزات وحدة مراقبة الأداء (PMU) التي تتطلب العمل بمفردها حتى لا تشوش على العدادات العتادية الأخرى. .IP لاحظ أن العديد من المواقف غير المتوقعة قد تمنع الأحداث التي ضُبطت فيها بتة \fIexclusive\fP من العمل نهائياً. يتضمن ذلك أي مستخدمين يشغلون قياساً على مستوى النظام، بالإضافة إلى أي استخدام للنواة لعدادات الأداء (بما في ذلك واجهة مؤقت مراقب NMI المفعلة عادةً). .TP \fIexclude_user\fP إذا ضُبطت هذه البتة، يستثني العد الأحداث التي تقع في مساحة المستخدم. .TP \fIexclude_kernel\fP إذا ضُبطت هذه البتة، يستثني العد الأحداث التي تقع في مساحة النواة. .TP \fIexclude_hv\fP إذا ضُبطت هذه البتة، يستثني العد الأحداث التي تقع في مشرف الأجهزة الافتراضية (hypervisor). هذا مخصص أساساً لوحدات مراقبة الأداء (PMUs) التي تدعم ذلك ذاتياً (مثل POWER). يلزم دعم إضافي للتعامل مع قياسات مشرف الأجهزة الافتراضية في معظم الأجهزة. .TP \fIexclude_idle\fP إذا ضُبطت، لا يُعد عندما يشغل المعالج مهمة الخمول. برغم أنه يمكن تفعيل هذا حالياً لأي نوع حدث، إلا أنه يُتجاهل لجميع الأحداث باستثناء الأحداث البرمجية. .TP \fImmap\fP تفعل بتة \fImmap\fP توليد عينات \fBPERF_RECORD_MMAP\fP لكل استدعاء \fBmmap\fP(2) يكون فيه \fBPROT_EXEC\fP مضبوطاً. يسمح هذا للأدوات بملاحظة التعليمات البرمجية التنفيذية الجديدة التي تُربط ببرنامج ما (مثل المكتبات المشتركة الديناميكية) بحيث يمكن ربط العناوين بالتعليمات البرمجية الأصلية. .TP \fIcomm\fP .\" commit 82b897782d10fcc4930c9d4a15b175348fdd2871 تفعل بتة \fIcomm\fP تتبع اسم أمر العملية كما يُعدل بواسطة استدعاءات النظام \fBexecve\fP(2) و \fBprctl\fP(PR_SET_NAME) بالإضافة إلى الكتابة في \fI/proc/self/comm\fP. إذا ضُبط علم \fIcomm_exec\fP أيضًا بنجاح (ممكن منذ لينكس 3.16)، يمكن استخدام العلم المتنوع \fBPERF_RECORD_MISC_COMM_EXEC\fP للتمييز بين حالة \fBexecve\fP(2) والحالات الأخرى. .TP \fIfreq\fP إذا ضُبطت هذه البتة، يُستخدم \fIsample_frequency\fP وليس \fIsample_period\fP عند إعداد فاصل أخذ العينات الزمني. .TP \fIinherit_stat\fP تفعل هذه البتة حفظ أعداد الأحداث عند تبديل السياق للمهام الموروثة. لا يكون لهذا معنى إلا إذا كان حقل \fIinherit\fP مضبوطاً. .TP \fIenable_on_exec\fP إذا ضُبطت هذه البتة، يُفعل العداد آلياً بعد استدعاء \fBexecve\fP(2). .TP \fItask\fP إذا ضُبطت هذه البتة، تُدرج إشعارات التفريع/الخروج في المخزن الدائري. .TP \fIwatermark\fP إذا ضُبطت، يقع إشعار فيض عند تجاوز حدود \fIwakeup_watermark\fP. وإلا، تقع إشعارات الفيض بعد عينات \fIwakeup_events\fP. .TP \fIprecise_ip\fP (منذ لينكس 2.6.35) .\" commit ab608344bcbde4f55ec4cd911b686b0ce3eae076 يتحكم هذا في مقدار الانزلاق (skid). الانزلاق هو عدد التعليمات المنفذة بين وقوع حدث مهم وتمكن النواة من التوقف وتسجيل الحدث. الانزلاق الأصغر أفضل ويسمح بتقرير أكثر دقة عن أي الأحداث يقابل أي التعليمات، ولكن غالباً ما يكون العتاد محدوداً في مدى صغر هذا المقدار. .IP القيم الممكنة لهذا الحقل هي كالتالي: .RS .TP \fB0\fP يمكن لـ \fBSAMPLE_IP\fP أن يحصل على انزلاق تعسفي. .TP \fB1\fP يجب أن يكون لـ \fBSAMPLE_IP\fP انزلاق ثابت. .TP \fB2\fP طُلب أن يكون لـ \fBSAMPLE_IP\fP انزلاق بقيمة 0. .TP \fB3\fP يجب أن يكون لـ \fBSAMPLE_IP\fP انزلاق بقيمة 0. انظر أيضًا وصف \fBPERF_RECORD_MISC_EXACT_IP\fP. .RE .TP \fImmap_data\fP (منذ لينكس 2.6.36) .\" commit 3af9e859281bda7eb7c20b51879cf43aa788ac2e هذا هو نظير حقل \fImmap\fP. يفعل توليد عينات \fBPERF_RECORD_MMAP\fP لاستدعاءات \fBmmap\fP(2) التي ليس فيها \fBPROT_EXEC\fP مضبوطاً (على سبيل المثال البيانات وذاكرة SysV المشتركة). .TP \fIsample_id_all\fP (منذ لينكس 2.6.38) .\" commit c980d1091810df13f21aabbce545fd98f545bbf7 إذا ضُبطت، يمكن بالإضافة إلى ذلك تضمين TID و TIME و ID و STREAM_ID و CPU في السجلات التي ليست من نوع \fBPERF_RECORD_SAMPLE\fP إذا اختير \fIsample_type\fP المقابل. .IP إذا حدد \fBPERF_SAMPLE_IDENTIFIER\fP، تُدرج قيمة ID إضافية كآخر قيمة لتسهيل تحليل تدفق السجلات. قد يؤدي هذا إلى ظهور قيمة \fIid\fP مرتين. .IP يوصف التخطيط بهذه البنية الوهمية: .IP .in +4n .EX struct sample_id { { u32 pid, tid; } /* if PERF_SAMPLE_TID set */ { u64 time; } /* if PERF_SAMPLE_TIME set */ { u64 id; } /* if PERF_SAMPLE_ID set */ { u64 stream_id;} /* if PERF_SAMPLE_STREAM_ID set */ { u32 cpu, res; } /* if PERF_SAMPLE_CPU set */ { u64 id; } /* if PERF_SAMPLE_IDENTIFIER set */ }; .EE .in .TP \fIexclude_host\fP (منذ لينكس 3.2) .\" commit a240f76165e6255384d4bdb8139895fac7988799 عند إجراء قياسات تتضمن عمليات تشغل مثيلات الأجهزة الافتراضية (أي التي نفذت \fBKVM_RUN\fP \fBioctl\fP(2))، لا تُقاس إلا الأحداث التي تقع داخل مثيلة ضيف. لا يكون لهذا معنى إلا خارج الضيوف؛ هذا الإعداد لا يغير الأعداد المجموعة داخل الضيف. حالياً، هذه الوظيفة مقتصرة على x86 فقط. .TP \fIexclude_guest\fP (منذ لينكس 3.2) .\" commit a240f76165e6255384d4bdb8139895fac7988799 عند إجراء قياسات تتضمن عمليات تشغل مثيلات الأجهزة الافتراضية (أي التي نفذت \fBKVM_RUN\fP \fBioctl\fP(2))، لا تُقاس الأحداث التي تقع داخل مثيلات الضيف. لا يكون لهذا معنى إلا خارج الضيوف؛ هذا الإعداد لا يغير الأعداد المجموعة داخل الضيف. حالياً، هذه الوظيفة مقتصرة على x86 فقط. .TP \fIexclude_callchain_kernel\fP (منذ لينكس 3.7) .\" commit d077526485d5c9b12fe85d0b2b3b7041e6bc5f91 لا تُدرج تسلسلات استدعاء النواة. .TP \fIexclude_callchain_user\fP (منذ لينكس 3.7) .\" commit d077526485d5c9b12fe85d0b2b3b7041e6bc5f91 لا تُدرج تسلسلات استدعاء المستخدم. .TP \fImmap2\fP (منذ لينكس 3.16) .\" commit 13d7a2410fa637f450a29ecb515ac318ee40c741 .\" This is tricky; was committed during 3.12 development .\" but right before release was disabled. .\" So while you could select mmap2 starting with Linux 3.12 .\" it did not work until Linux 3.16 .\" commit a5a5ba72843dd05f991184d6cb9a4471acce1005 ولّد سجل mmap تنفيذيًّا ممتدًّا يحتوي على معلومات إضافية كافية لتمييز التعيينات المشتركة بشكل فريد. يجب أيضًا ضبط علم \fImmap\fP ليعمل هذا. .TP \fIcomm_exec\fP (منذ لينكس 3.16) .\" commit 82b897782d10fcc4930c9d4a15b175348fdd2871 هذا علم لاكتشاف الميزات فحسب، ولا يغير سلوك النواة. إذا ضُبط هذا العلم بنجاح، فعند تمكين \fIcomm\fP، سيُضبط علم \fBPERF_RECORD_MISC_COMM_EXEC\fP في حقل \fImisc\fP لترويسة سجل comm إذا كان حدث إعادة التسمية المُبلغ عنه ناتجًا عن استدعاء \fBexecve\fP(2). يتيح هذا للأدوات التمييز بين الأنواع المختلفة لإعادة تسمية العمليات. .TP \fIuse_clockid\fP (منذ لينكس 4.1) .\" commit 34f439278cef7b1177f8ce24f9fc81dfc6221d3b يسمح هذا باختيار أي ساعة لينكس داخلية تُستخدم عند توليد الطوابع الزمنية عبر حقل \fIclockid\fP. يمكن أن يسهل هذا ربط أوقات عينات الأداء (perf) بالطوابع الزمنية التي تولدها أدوات أخرى. .TP \fIcontext_switch\fP (منذ لينكس 4.3) .\" commit 45ac1403f564f411c6a383a2448688ba8dd705a4 يُمكّن هذا توليد سجلات \fBPERF_RECORD_SWITCH\fP عند حدوث تبديل سياق. كما يُمكّن توليد سجلات \fBPERF_RECORD_SWITCH_CPU_WIDE\fP عند أخذ العينات في وضع CPU\-wide. هذه الوظيفة هي إضافة إلى نقاط التتبع (tracepoint) وأحداث البرمجيات الموجودة لقياس تبديلات السياق. ميزة هذه الطريقة هي أنها ستعطي معلومات كاملة حتى مع إعدادات \fIperf_event_paranoid\fP الصارمة. .TP \fIwrite_backward\fP (منذ لينكس 4.6) .\" commit 9ecda41acb971ebd07c8fb35faf24005c0baea12 يؤدي هذا إلى كتابة المخزن المؤقت الحلقي (ring buffer) من النهاية إلى البداية. هذا لدعم القراءة من مخزن مؤقت حلقي قابل للكتابة فوقه. .TP \fInamespaces\fP (منذ لينكس 4.11) .\" commit e422267322cd319e2695a535e47c5b1feeac45eb يُمكّن هذا توليد سجلات \fBPERF_RECORD_NAMESPACES\fP عندما تدخل مهمة ما في مساحة أسماء جديدة. كل مساحة أسماء لها مزيج من أرقام الأجهزة وأرقام العقد الفهرسية (inode). .TP \fIksymbol\fP (منذ لينكس 5.0) .\" commit 76193a94522f1d4edf2447a536f3f796ce56343b يُمكّن هذا توليد سجلات \fBPERF_RECORD_KSYMBOL\fP عند تسجيل رموز نواة جديدة أو إلغاء تسجيلها. يُستخدم هذا لتحليل وظائف النواة الديناميكية مثل eBPF. .TP \fIbpf_event\fP (منذ لينكس 5.0) .\" commit 6ee52e2a3fe4ea35520720736e6791df1fb67106 يُمكّن هذا توليد سجلات \fBPERF_RECORD_BPF_EVENT\fP عند تحميل برنامج eBPF أو إلغاء تحميله. .TP \fIaux_output\fP (منذ لينكس 5.4) .\" commit ab43762ef010967e4ccd53627f70a2eecbeafefb يسمح هذا للأحداث العادية (غير AUX) بتوليد بيانات لأحداث AUX إذا كان العتاد يدعم ذلك. .TP \fIcgroup\fP (منذ لينكس 5.7) .\" commit 96aaab686505c449e24d76e76507290dcc30e008 يُمكّن هذا توليد سجلات \fBPERF_RECORD_CGROUP\fP عند إنشاء (وتنشيط) مجموعة تحكم (cgroup) جديدة. .TP \fItext_poke\fP (منذ لينكس 5.8) .\" commit e17d43b93e544f5016c0251d2074c15568d5d963 يُمكّن هذا توليد سجلات \fBPERF_RECORD_TEXT_POKE\fP عندما يطرأ تغيير على نص النواة (أي الكود المتمور أو المعدل ذاتيًّا). .TP \fIbuild_id\fP (منذ لينكس 5.12) .\" commit 88a16a1309333e43d328621ece3e9fa37027e8eb يغير هذا محتويات \fBPERF_RECORD_MMAP2\fP لتحتوي على معرف بناء (build\-id) بدلًا من أرقام الأجهزة والعقد الفهرسية (inode). .TP \fIinherit_thread\fP (منذ لينكس 5.13) .\" commit 2b26f0aa004995f49f7b6f4100dd0e4c39a9ed5f يعطل هذا توريث الحدث لعملية فرعية. فقط الخيوط الجديدة في نفس العملية (التي تُنسخ باستخدام \fBCLONE_THREAD\fP) هي من سيرث الحدث. .TP \fIremove_on_exec\fP (منذ لينكس 5.13) .\" commit 2e498d0a74e5b88a6689ae1b811f247f91ff188e يغلق هذا الحدث عندما يبدأ صورة عملية جديدة بواسطة \fBexecve\fP(2). .TP \fIsigtrap\fP (منذ لينكس 5.13) .\" commit 97ba62b278674293762c3d91f724f1bb922f04e0 يُمكّن هذا تسليم إشارة \fBSIGTRAP\fP المتزامنة عند فيض الحدث. .TP \fIwakeup_events\fP .TQ \fIwakeup_watermark\fP تحدد هذه الوحدة (union) عدد العينات (\fIwakeup_events\fP) أو البايتات (\fIwakeup_watermark\fP) التي تحدث قبل حدوث إشعار بالفيض. ويُختار أيهما يُستخدم بواسطة علم بت \fIwatermark\fP. .IP يعد \fIwakeup_events\fP أنواع سجلات \fBPERF_RECORD_SAMPLE\fP فقط. لتلقي إشعار بالفيض لجميع أنواع \fBPERF_RECORD\fP اختر watermark واضبط \fIwakeup_watermark\fP على 1. .IP .\" commit f506b3dc0ec454a16d40cab9ee5d75435b39dc50 قبل لينكس 3.0، كان ضبط \fIwakeup_events\fP على 0 يؤدي لعدم وجود إشعارات فيض؛ النوى الأحدث تعامل 0 معاملة 1. .TP \fIbp_type\fP (منذ لينكس 2.6.33) .\" commit 24f1e32c60c45c89a997c73395b69c8af6f0a84e يختار هذا نوع نقطة التوقف. وهو واحد من: .RS .TP \fBHW_BREAKPOINT_EMPTY\fP لا توجد نقطة توقف. .TP \fBHW_BREAKPOINT_R\fP العّد عند قراءة موقع الذاكرة. .TP \fBHW_BREAKPOINT_W\fP العّد عند الكتابة في موقع الذاكرة. .TP \fBHW_BREAKPOINT_RW\fP العّد عند قراءة أو الكتابة في موقع الذاكرة. .TP \fBHW_BREAKPOINT_X\fP العّد عند تنفيذ كود في موقع الذاكرة. .P يمكن دمج القيم عبر أو (OR) المنطقية، ولكن دمج \fBHW_BREAKPOINT_R\fP أو \fBHW_BREAKPOINT_W\fP مع \fBHW_BREAKPOINT_X\fP غير مسموح به. .RE .TP \fIbp_addr\fP (منذ لينكس 2.6.33) .\" commit 24f1e32c60c45c89a997c73395b69c8af6f0a84e هذا هو عنوان نقطة التوقف. بالنسبة لنقاط توقف التنفيذ، هذا هو عنوان الذاكرة للتعليمة المعنية؛ بالنسبة لنقاط توقف القراءة والكتابة، فهو عنوان الذاكرة لموقع الذاكرة المعني. .TP \fIconfig1\fP (منذ لينكس 2.6.39) .\" commit a7e3ed1e470116c9d12c2f778431a481a6be8ab6 يُستخدم \fIconfig1\fP لضبط الأحداث التي تحتاج إلى سجل إضافي أو التي لا تتناسب مع حقل config العادي. تستخدم أحداث OFFCORE_EVENTS الخام على معالجات Nehalem/Westmere/SandyBridge هذا الحقل في نواة لينكس 3.3 والإصدارات الأحدث. .TP \fIbp_len\fP (منذ لينكس 2.6.33) .\" commit 24f1e32c60c45c89a997c73395b69c8af6f0a84e \fIbp_len\fP هو حجم نقطة التوقف التي تُقاس إذا كان \fItype\fP هو \fBPERF_TYPE_BREAKPOINT\fP. الخيارات هي \fBHW_BREAKPOINT_LEN_1\fP، و \fBHW_BREAKPOINT_LEN_2\fP، و \fBHW_BREAKPOINT_LEN_4\fP، و \fBHW_BREAKPOINT_LEN_8\fP. لنقطة توقف تنفيذ، اضبط هذا على \fIsizeof(long)\fP. .TP \fIconfig2\fP (منذ لينكس 2.6.39) .\" commit a7e3ed1e470116c9d12c2f778431a481a6be8ab6 \fIconfig2\fP هو امتداد إضافي لحقل \fIconfig1\fP. .TP \fIbranch_sample_type\fP (منذ لينكس 3.4) .\" commit bce38cd53e5ddba9cb6d708c4ef3d04a4016ec7e إذا مُكّن \fBPERF_SAMPLE_BRANCH_STACK\fP، فهذا يحدد الفروع التي يجب تضمينها في سجل الفروع. .IP الجزء الأول من القيمة هو مستوى الامتياز، وهو مزيج من إحدى القيم المدرجة أدناه. إذا لم يضبط المستخدم مستوى الامتياز صراحةً، فستستخدم النواة مستوى امتياز الحدث. لا يلزم تطابق مستويات امتياز الحدث والفرع. .RS .TP \fBPERF_SAMPLE_BRANCH_USER\fP هدف الفرع في مساحة المستخدم. .TP \fBPERF_SAMPLE_BRANCH_KERNEL\fP هدف الفرع في مساحة النواة. .TP \fBPERF_SAMPLE_BRANCH_HV\fP هدف الفرع في المفرط (hypervisor). .TP \fBPERF_SAMPLE_BRANCH_PLM_ALL\fP قيمة ملائمة هي نتاج دمج القيم الثلاث السابقة باستخدام معامل OR المنطقي. .P بالإضافة إلى قيمة الامتياز، يجب ضبط بت واحد على الأقل من البتات التالية. .TP \fBPERF_SAMPLE_BRANCH_ANY\fP أي نوع من أنواع الفروع. .TP \fBPERF_SAMPLE_BRANCH_ANY_CALL\fP أي فرع استدعاء (يشمل الاستدعاءات المباشرة، والاستدعاءات غير المباشرة، والقفزات البعيدة). .TP \fBPERF_SAMPLE_BRANCH_IND_CALL\fP الاستدعاءات غير المباشرة. .TP \fBPERF_SAMPLE_BRANCH_CALL\fP (منذ لينكس 4.4) .\" commit c229bf9dc179d2023e185c0f705bdf68484c1e73 الاستدعاءات المباشرة. .TP \fBPERF_SAMPLE_BRANCH_ANY_RETURN\fP أي فرع عودة. .TP \fBPERF_SAMPLE_BRANCH_IND_JUMP\fP (منذ لينكس 4.2) .\" commit c9fdfa14c3792c0160849c484e83aa57afd80ccc القفزات غير المباشرة. .TP \fBPERF_SAMPLE_BRANCH_COND\fP (منذ لينكس 3.16) .\" commit bac52139f0b7ab31330e98fd87fc5a2664951050 الفروع الشرطية. .TP \fBPERF_SAMPLE_BRANCH_ABORT_TX\fP (منذ لينكس 3.11) .\" commit 135c5612c460f89657c4698fe2ea753f6f667963 إجهاضات الذاكرة التحويلية. .TP \fBPERF_SAMPLE_BRANCH_IN_TX\fP (منذ لينكس 3.11) .\" commit 135c5612c460f89657c4698fe2ea753f6f667963 فرع داخل معاملة ذاكرة تحويلية. .TP \fBPERF_SAMPLE_BRANCH_NO_TX\fP (منذ لينكس 3.11) .\" commit 135c5612c460f89657c4698fe2ea753f6f667963 .\" commit 2c44b1936bb3b135a3fac8b3493394d42e51cf70 فرع ليس في معاملة ذاكرة تحويلية. \fBPERF_SAMPLE_BRANCH_CALL_STACK\fP (منذ لينكس 4.1) الفرع جزء من مكدس استدعاء مُولّد عتاديًا. يتطلب هذا دعمًا عتاديًا، لا يتوفر حاليًا إلا في معالجات Intel x86 من عائلة Haswell أو أحدث. .RE .TP \fIsample_regs_user\fP (منذ لينكس 3.7) .\" commit 4018994f3d8785275ef0e7391b75c3462c029e56 يحدد قناع البتات هذا مجموعة سجلات وحدة المعالجة المركزية الخاصة بالمستخدم لتفريغها عند أخذ العينات. تخطيط قناع السجلات خاص بالبنية المعمارية وموصوف في ملف ترويسة النواة \fIarch/ARCH/include/uapi/asm/perf_regs.h\fP. .TP \fIsample_stack_user\fP (منذ لينكس 3.7) .\" commit c5ebcedb566ef17bda7b02686e0d658a7bb42ee7 يحدد هذا حجم مكدس المستخدم المراد تفريغه إذا حُدد \fBPERF_SAMPLE_STACK_USER\fP. .TP \fIclockid\fP (منذ لينكس 4.1) .\" commit 34f439278cef7b1177f8ce24f9fc81dfc6221d3b إذا ضُبط \fIuse_clockid\fP، يختار هذا الحقل أي مؤقت لينكس داخلي سيُستخدم للطوابع الزمنية. المؤقتات المتاحة مُعرفة في \fIlinux/time.h\fP، مع دعم \fBCLOCK_MONOTONIC\fP و \fBCLOCK_MONOTONIC_RAW\fP و \fBCLOCK_REALTIME\fP و \fBCLOCK_BOOTTIME\fP و \fBCLOCK_TAI\fP حاليًا. .TP \fIaux_watermark\fP (منذ لينكس 4.1) .\" commit 1a5941312414c71dece6717da9a0fa1303127afa يحدد هذا مقدار البيانات المطلوبة لإطلاق عينة \fBPERF_RECORD_AUX\fP. .TP \fIsample_max_stack\fP (منذ لينكس 4.8) .\" commit 97c79a38cd454602645f0470ffb444b3b75ce574 عندما يتضمن \fIsample_type\fP القيمة \fBPERF_SAMPLE_CALLCHAIN\fP، يحدد هذا الحقل عدد إطارات المكدس التي سيُبلغ عنها عند توليد سلسلة الاستدعاءات. .TP \fIaux_sample_size\fP (منذ لينكس 5.5) .\" commit a4faf00d994c40e64f656805ac375c65e324eefb عند ضبط علامة \fBPERF_SAMPLE_AUX\fP، حدد الحجم المطلوب لبيانات AUX. لاحظ أنه قد يتم الحصول على بيانات أصغر من الحجم المحدد. .TP \fIsig_data\fP (منذ لينكس 5.13) .\" commit 97ba62b278674293762c3d91f724f1bb922f04e0 ستُنسخ هذه البيانات إلى معالج إشارات المستخدم (عبر \fIsi_perf\fP في \fIsiginfo_t\fP) لإزالة اللبس حول أي حدث أطلق الإشارة. .SS "قراءة النتائج" بمجرد فتح واصف ملف \fBperf_event_open\fP()، يمكن قراءة قيم الأحداث من واصف الملف. القيم الموجودة هناك يحددها حقل \fIread_format\fP في بنية \fIattr\fP عند وقت الفتح. .P إذا حاولت القراءة في مخزن مؤقت ليس كبيرًا بما يكفي لاحتواء البيانات، فستنتج الخطأ \fBENOSPC\fP. .P إليك تخطيط البيانات التي تعيدها عملية القراءة: .IP \[bu] 3 إذا حُدد \fBPERF_FORMAT_GROUP\fP للسماح بقراءة جميع الأحداث في مجموعة دفعة واحدة: .IP .in +4n .EX struct read_format { u64 nr; /* عدد الأحداث */ u64 time_enabled; /* إذا حُدد PERF_FORMAT_TOTAL_TIME_ENABLED */ u64 time_running; /* إذا حُدد PERF_FORMAT_TOTAL_TIME_RUNNING */ struct { u64 value; /* قيمة الحدث */ u64 id; /* إذا حُدد PERF_FORMAT_ID */ u64 lost; /* إذا حُدد PERF_FORMAT_LOST */ } values[nr]; }; .EE .in .IP \[bu] إذا \fIلم\fP يُحدد \fBPERF_FORMAT_GROUP\fP: .IP .in +4n .EX struct read_format { u64 value; /* قيمة الحدث */ u64 time_enabled; /* إذا حُدد PERF_FORMAT_TOTAL_TIME_ENABLED */ u64 time_running; /* إذا حُدد PERF_FORMAT_TOTAL_TIME_RUNNING */ u64 id; /* إذا حُدد PERF_FORMAT_ID */ u64 lost; /* إذا حُدد PERF_FORMAT_LOST */ }; .EE .in .P القيم المقروءة هي كما يلي: .TP \fInr\fP عدد الأحداث في واصف الملف هذا. متاح فقط إذا حُدد \fBPERF_FORMAT_GROUP\fP. .TP \fItime_enabled\fP .TQ \fItime_running\fP إجمالي الوقت الذي كان فيه الحدث مُمكنًا وقيد التشغيل. عادة ما تكون هذه القيم متماثلة. يحدث تعدد الإرسال (Multiplexing) إذا كان عدد الأحداث أكثر من عدد فتحات عداد PMU المتاحة. في هذه الحالة، تعمل الأحداث لجزء من الوقت فقط، ويمكن استخدام قيم \fItime_enabled\fP و \fItime_running\fP لقياس قيمة تقديرية للعدد. .TP \fIvalue\fP قيمة غير موقعة بطول 64 بت تحتوي على نتيجة العداد. .TP \fIid\fP قيمة فريدة عالميًا لهذا الحدث المعين؛ تظهر فقط إذا حُدد \fBPERF_FORMAT_ID\fP في \fIread_format\fP. .TP \fIlost\fP عدد العينات المفقودة لهذا الحدث؛ تظهر فقط إذا حُدد \fBPERF_FORMAT_LOST\fP في \fIread_format\fP. .SS "تخطيط MMAP" عند استخدام \fBperf_event_open\fP() في وضع أخذ العينات، تُسجل الأحداث غير المتزامنة (مثل تجاوز العداد أو تتبع mmap لـ \fBPROT_EXEC\fP) في مخزن حلقي مؤقت. يُنشأ هذا المخزن الحلقي المؤقت ويُوصَل إليه عبر \fBmmap\fP(2). .P يجب أن يكون حجم mmap هو 1+2\[ha]n صفحة، حيث تكون الصفحة الأولى صفحة بيانات وصفية (\fIstruct perf_event_mmap_page\fP) تحتوي على معلومات متنوعة مثل مكان رأس المخزن الحلقي المؤقت. .P قبل لينكس 2.6.39، كانت هناك علة تعني أنه يجب عليك تخصيص مخزن حلقي مؤقت لـ mmap عند أخذ العينات حتى لو لم تكن تخطط للوصول إليه. .P بنية أول صفحة بيانات وصفية لـ mmap هي كما يلي: .P .in +4n .EX struct perf_event_mmap_page { __u32 version; /* رقم إصدار هذه البنية */ __u32 compat_version; /* أدنى إصدار تتوافق معه */ __u32 lock; /* قفل تسلسلي (seqlock) للمزامنة */ __u32 index; /* معرف عداد العتاد */ __s64 offset; /* يُضاف إلى قيمة عداد العتاد */ __u64 time_enabled; /* وقت نشاط الحدث */ __u64 time_running; /* وقت وجود الحدث على وحدة المعالجة المركزية */ union { __u64 capabilities; struct { __u64 cap_usr_time / cap_usr_rdpmc / cap_bit0 : 1, cap_bit0_is_deprecated : 1, cap_user_rdpmc : 1, cap_user_time : 1, cap_user_time_zero : 1, }; }; __u16 pmc_width; __u16 time_shift; __u32 time_mult; __u64 time_offset; __u64 __reserved[120]; /* حشو حتى 1 كيلوبايت */ __u64 data_head; /* الرأس في قسم البيانات */ __u64 data_tail; /* الذيل المكتوب من مساحة المستخدم */ __u64 data_offset; /* مكان بدء المخزن المؤقت */ __u64 data_size; /* حجم مخزن البيانات المؤقت */ __u64 aux_head; __u64 aux_tail; __u64 aux_offset; __u64 aux_size; \& } .EE .in .P تصف القائمة التالية الحقول في بنية \fIperf_event_mmap_page\fP بمزيد من التفصيل: .TP \fIالإصدار\fP رقم إصدار هذه البنية. .TP \fIإصدار_التوافق\fP أدنى إصدار تتوافق معه هذه البنية. .TP \fIالقفل\fP قفل تسلسلي (seqlock) للمزامنة. .TP \fIindex\fP معرف فريد لعدادات العتاد. .TP \fIoffset\fP عند استخدام rdpmc للقراءات، يجب إضافة قيمة \fIoffset\fP هذه إلى القيمة التي تعيدها rdpmc للحصول على إجمالي عدد الأحداث الحالي. .TP \fItime_enabled\fP الوقت الذي كان فيه الحدث نشطًا. .TP \fItime_running\fP الوقت الذي كان فيه الحدث قيد التشغيل. .TP \fIcap_usr_time\fP / \fIcap_usr_rdpmc\fP / \fIcap_bit0\fP (منذ لينكس 3.4) .\" commit c7206205d00ab375839bd6c7ddb247d600693c09 وُجدت علة في تعريف \fIcap_usr_time\fP و \fIcap_usr_rdpmc\fP من لينكس 3.4 حتى لينكس 3.11. عُرّف كلا البتين للإشارة إلى الموقع نفسه، لذا كان من المستحيل معرفة ما إذا كان قد ضُبط \fIcap_usr_time\fP أو \fIcap_usr_rdpmc\fP فعليًا. .IP .\" commit fa7315871046b9a4c48627905691dbde57e51033 بدءًا من لينكس 3.12، غُيرت أسماؤها إلى \fIcap_bit0\fP وينبغي عليك استخدام حقول \fIcap_user_time\fP و \fIcap_user_rdpmc\fP بدلًا منها. .TP \fIcap_bit0_is_deprecated\fP (منذ لينكس 3.12) .\" commit fa7315871046b9a4c48627905691dbde57e51033 إذا ضُبط هذا البت، فإنه يشير إلى أن النواة تدعم بتات \fIcap_user_time\fP و \fIcap_user_rdpmc\fP المفصولة بشكل سليم. .IP إذا لم يُضبط، فإنه يشير إلى نواة قديمة حيث ترتبط \fIcap_usr_time\fP و \fIcap_usr_rdpmc\fP بالبت نفسه وبالتالي يجب استخدام كلتا الميزتين بحذر. .TP \fIcap_user_rdpmc\fP (منذ لينكس 3.12) .\" commit fa7315871046b9a4c48627905691dbde57e51033 إذا كان العتاد يدعم قراءة عدادات الأداء من مساحة المستخدم دون استدعاء نظام (هذه هي تعليمة "rdpmc" على x86)، فيمكن استخدام الشيفرة التالية لإجراء القراءة: .IP .in +4n .EX u32 seq, time_mult, time_shift, idx, width; u64 count, enabled, running; u64 cyc, time_offset; \& do { seq = pc\->lock; barrier(); enabled = pc\->time_enabled; running = pc\->time_running; \& if (pc\->cap_usr_time && enabled != running) { cyc = rdtsc(); time_offset = pc\->time_offset; time_mult = pc\->time_mult; time_shift = pc\->time_shift; } \& idx = pc\->index; count = pc\->offset; \& if (pc\->cap_usr_rdpmc && idx) { width = pc\->pmc_width; count += rdpmc(idx \- 1); } \& barrier(); } while (pc\->lock != seq); .EE .in .TP \fIcap_user_time\fP (منذ لينكس 3.12) .\" commit fa7315871046b9a4c48627905691dbde57e51033 يشير هذا البت إلى أن العتاد يحتوي على عداد طابع زمني ثابت لا يتوقف (TSC على x86). .TP \fIcap_user_time_zero\fP (منذ لينكس 3.12) .\" commit fa7315871046b9a4c48627905691dbde57e51033 يشير إلى وجود \fItime_zero\fP الذي يسمح بربط قيم الطابع الزمني بساعة العتاد. .TP \fIpmc_width\fP في حال وجود \fIcap_usr_rdpmc\fP، يوفر هذا الحقل عرض البت للقيمة المقروءة باستخدام rdpmc أو تعليمة مكافئة. يمكن استخدام هذا لتوسيع إشارة النتيجة مثل: .IP .in +4n .EX pmc <<= 64 \- pmc_width; pmc >>= 64 \- pmc_width; // إزاحة يمين مع إشارة count += pmc; .EE .in .TP \fItime_shift\fP .TQ \fItime_mult\fP .TQ \fItime_offset\fP .IP في حال وجود \fIcap_usr_time\fP، يمكن استخدام هذه الحقول لحساب فارق الوقت منذ \fItime_enabled\fP (بالنانوثانية) باستخدام rdtsc أو ما شابه. .IP .in +4n .EX u64 quot, rem; u64 delta; \& quot = cyc >> time_shift; rem = cyc & (((u64)1 << time_shift) \- 1); delta = time_offset + quot * time_mult + ((rem * time_mult) >> time_shift); .EE .in .IP حيث تُقرأ \fItime_offset\fP و \fItime_mult\fP و \fItime_shift\fP و \fIcyc\fP في حلقة seqcount الموضحة أعلاه. يمكن بعد ذلك إضافة هذا الفارق (delta) إلى الوقت المُمكّن (enabled) والمشغل المحتمل (running) (إذا وُجد idx)، مما يحسن القياس: .IP .in +4n .EX enabled += delta; if (idx) running += delta; quot = count / running; rem = count % running; count = quot * enabled + (rem * enabled) / running; .EE .in .TP \fItime_zero\fP (منذ لينكس 3.12) .\" commit fa7315871046b9a4c48627905691dbde57e51033 .IP إذا ضُبط \fIcap_usr_time_zero\fP، فيمكن حساب ساعة العتاد (عداد الطابع الزمني TSC على x86) من قيم \fItime_zero\fP و \fItime_mult\fP و \fItime_shift\fP: .IP .in +4n .EX time = timestamp \- time_zero; quot = time / time_mult; rem = time % time_mult; cyc = (quot << time_shift) + (rem << time_shift) / time_mult; .EE .in .IP والعكس صحيح: .IP .in +4n .EX quot = cyc >> time_shift; rem = cyc & (((u64)1 << time_shift) \- 1); timestamp = time_zero + quot * time_mult + ((rem * time_mult) >> time_shift); .EE .in .TP \fIdata_head\fP يشير هذا إلى رأس قسم البيانات. تزداد القيمة باستمرار، ولا تلتف. يجب لف القيمة يدويًا بحجم وسيط mmap قبل الوصول إلى العينات. .IP في المنصات التي تدعم SMP، بعد قراءة قيمة \fIdata_head\fP، يجب على مساحة المستخدم إصدار rmb(). .TP \fIdata_tail\fP عندما يكون الربط \fBPROT_WRITE\fP، يجب كتابة قيمة \fIdata_tail\fP بواسطة مساحة المستخدم لتعكس آخر بيانات وُصل إليها. في هذه الحالة، لن تكتب النواة فوق البيانات غير المقروءة. .TP \fIdata_offset\fP (منذ لينكس 4.1) .\" commit e8c6deac69629c0cb97c3d3272f8631ef17f8f0f يحتوي على إزاحة الموقع في وسيط mmap حيث تبدأ بيانات عينة الأداء. .TP \fIdata_size\fP (منذ لينكس 4.1) .\" commit e8c6deac69629c0cb97c3d3272f8631ef17f8f0f يحتوي على حجم منطقة عينة الأداء داخل وسيط mmap. .TP \fIaux_head\fP .TQ \fIaux_tail\fP .TQ \fIaux_offset\fP .TQ \fIaux_size (منذ لينكس 4.1)\fP .\" commit 45bfb2e50471abbbfd83d40d28c986078b0d24ff تسمح منطقة AUX بإجراء \fBmmap\fP(2) لوسيط عينة منفصل لتدفقات البيانات ذات النطاق الترددي العالي (منفصل عن وسيط عينة الأداء الرئيس). من الأمثلة على تدفقات النطاق الترددي العالي دعم تتبع التعليمات، كما هو موجود في معالجات Intel الأحدث. .IP لإعداد منطقة AUX، يجب أولاً ضبط \fIaux_offset\fP بإزاحة أكبر من \fIdata_offset\fP+\fIdata_size\fP ويجب ضبط \fIaux_size\fP على حجم الوسيط المطلوب. يجب أن تكون الإزاحة والحجم المطلوبان متحاذيين مع الصفحة، ويجب أن يكون الحجم من مضاعفات القوة اثنين. تُمرر هذه القيم بعد ذلك إلى mmap لربط وسيط AUX. تُدرج الصفحات في وسيط AUX كجزء من حد الموارد \fBRLIMIT_MEMLOCK\fP (انظر \fBsetrlimit\fP(2))، وأيضًا كجزء من مخصص \fIperf_event_mlock_kb\fP. .IP بشكل مبدئي، سيُبتر وسيط AUX إذا لم يتسع في المساحة المتاحة في الوسيط الدائري. إذا رُبط وسيط AUX كوسيط للقراءة فقط، فسيعمل في وضع الوسيط الدائري حيث تُستبدل البيانات القديمة ببيانات جديدة. في وضع الكتابة فوق البيانات، قد لا يكون من الممكن استنتاج أين بدأت البيانات الجديدة، وتكون مهمة المستهلك تعطيل القياس أثناء القراءة لتجنب سباقات البيانات المحتملة. .IP تتبع مؤشرات الوسيط الدائري \fIaux_head\fP و \fIaux_tail\fP السلوك نفسه وقواعد الترتيب الخاصة بـ \fIdata_head\fP و \fIdata_tail\fP الموصوفة سابقًا. .P صفحات الوسيط الدائري 2^n التالية لها التخطيط الموصوف أدناه. .P إذا ضُبط \fIperf_event_attr.sample_id_all\fP، فستحتوي جميع أنواع الأحداث على حقول sample_type المحددة المتعلقة بمكان/زمان (هوية) وقوع الحدث (TID, TIME, ID, CPU, STREAM_ID) الموضحة في \fBPERF_RECORD_SAMPLE\fP أدناه، وسيُخزن مباشرة بعد \fIperf_event_header\fP والحقول الموجودة بالفعل للحقول الحالية، أي في نهاية الحمولة. يسمح هذا بدعم ملف perf.data أحدث بواسطة أدوات perf قديمة، مع تجاهل الحقول الاختيارية الجديدة. .P تبدأ قيم mmap بترويسة: .P .in +4n .EX struct perf_event_header { __u32 type; __u16 misc; __u16 size; }; .EE .in .P أدناه، نصف حقول \fIperf_event_header\fP بمزيد من التفصيل. لسهولة القراءة، تُعرض الحقول ذات الأوصاف الأقصر أولاً. .TP \fIsize\fP يشير هذا إلى حجم السجل. .TP \fImisc\fP يحتوي الحقل \fImisc\fP على معلومات إضافية حول العينة. .IP يمكن تحديد وضع وحدة المعالجة المركزية من هذه القيمة عن طريق القناع بـ \fBPERF_RECORD_MISC_CPUMODE_MASK\fP والبحث عن أحد ما يلي (لاحظ أن هذه ليست أقنعة بتات، يمكن ضبط واحد فقط في كل مرة): .RS .TP \fBPERF_RECORD_MISC_CPUMODE_UNKNOWN\fP وضع وحدة معالجة مركزية مجهول. .TP \fBPERF_RECORD_MISC_KERNEL\fP حدثت العينة في النواة. .TP \fBPERF_RECORD_MISC_USER\fP حدثت العينة في كود المستخدم. .TP \fBPERF_RECORD_MISC_HYPERVISOR\fP حدثت العينة في برنامج مراقبة الأجهزة الافتراضية. .TP \fBPERF_RECORD_MISC_GUEST_KERNEL\fP (منذ لينكس 2.6.35) .\" commit 39447b386c846bbf1c56f6403c5282837486200f حدثت العينة في نواة الضيف. .TP \fBPERF_RECORD_MISC_GUEST_USER (منذ Linux 2.6.35)\fP .\" commit 39447b386c846bbf1c56f6403c5282837486200f حدثت العينة في كود مستخدم ضيف. .RE .P .RS بما أن الحالات الثلاث التالية تُولَّد بواسطة أنواع سجلات مختلفة، فإنها تشير إلى نفس البت: .TP \fBPERF_RECORD_MISC_MMAP_DATA\fP (منذ Linux 3.10) .\" commit 2fe85427e3bf65d791700d065132772fc26e4d75 يُضبط هذا عندما لا يكون التعيين (mapping) قابلاً للتنفيذ؛ وإلا فإن التعيين يكون قابلاً للتنفيذ. .TP \fBPERF_RECORD_MISC_COMM_EXEC\fP (منذ Linux 3.16) .\" commit 82b897782d10fcc4930c9d4a15b175348fdd2871 يُضبط هذا لسجل \fBPERF_RECORD_COMM\fP في النوى الأحدث من Linux 3.16 إذا كان تغيير اسم العملية ناتجًا عن استدعاء نظام \fBexecve\fP(2). .TP \fBPERF_RECORD_MISC_SWITCH_OUT\fP (منذ Linux 4.3) .\" commit 45ac1403f564f411c6a383a2448688ba8dd705a4 عند توليد سجل \fBPERF_RECORD_SWITCH\fP أو \fBPERF_RECORD_SWITCH_CPU_WIDE\fP، يشير هذا البت إلى أن تبديل السياق بعيد عن العملية الحالية (بدلاً من الانتقال إلى العملية الحالية). .RE .P .RS بالإضافة إلى ذلك، يمكن ضبط البتات التالية: .TP \fBPERF_RECORD_MISC_EXACT_IP\fP يشير هذا إلى أن محتوى \fBPERF_SAMPLE_IP\fP يشير إلى التعليمة الفعلية التي أطلقت الحدث. انظر أيضًا \fIperf_event_attr.precise_ip\fP. .TP \fBPERF_RECORD_MISC_SWITCH_OUT_PREEMPT\fP (منذ Linux 4.17) .\" commit 101592b4904ecf6b8ed2a4784d41d180319d95a1 عند توليد سجل \fBPERF_RECORD_SWITCH\fP أو \fBPERF_RECORD_SWITCH_CPU_WIDE\fP، يشير هذا إلى أن تبديل السياق كان استباقاً (preemption). .TP \fBPERF_RECORD_MISC_MMAP_BUILD_ID\fP (منذ Linux 5.12) .\" commit 88a16a1309333e43d328621ece3e9fa37027e8eb يشير هذا إلى أن محتوى \fBPERF_SAMPLE_MMAP2\fP يحتوي على بيانات معرف البناء (build\-ID) بدلاً من أرقام الجهاز الرئيسية والثانوية ورقم الفهرس (inode). .TP \fBPERF_RECORD_MISC_EXT_RESERVED\fP (منذ Linux 2.6.35) .\" commit 1676b8a077c352085d52578fb4f29350b58b6e74 يشير هذا إلى وجود بيانات ممتدة متاحة (لا تُستخدم حاليًا). .TP \fBPERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT\fP .\" commit 930e6fcd2bcce9bcd9d4aa7e755678d33f3fe6f4 لا تُضبط هذه البتة بواسطة النواة. إنها محجوزة لأداة perf في مساحة المستخدم للإشارة إلى أن تحليل \fI/proc/\fPpid\fI/maps\fP استغرق وقتًا طويلاً ووقِف، وبالتالي قد تُبتر سجلات mmap. .RE .TP \fItype\fP قيمة \fItype\fP هي واحدة مما يلي. تعتمد القيم في السجل المقابل (الذي يلي الترويسة) على \fItype\fP المحدد كما هو موضح. .RS .TP 4 \fBPERF_RECORD_MMAP\fP تسجل أحداث MMAP تعيينات \fBPROT_EXEC\fP حتى نتمكن من ربط عناوين IP في مساحة المستخدم بالكود. ولها البنية التالية: .IP .in +4n .EX struct { struct perf_event_header header; u32 pid, tid; u64 addr; u64 len; u64 pgoff; char filename[]; }; .EE .in .RS .TP \fIpid\fP هو معرف العملية. .TP \fItid\fP هو معرف الخيط. .TP \fIaddr\fP هو عنوان الذاكرة المخصصة. \fIlen\fP هو حجم الذاكرة المخصصة. \fIpgoff\fP هو إزاحة الصفحة للذاكرة المخصصة. \fIfilename\fP هو سلسلة نصية تصف ما وراء الذاكرة المخصصة. .RE .TP \fBPERF_RECORD_LOST\fP يشير هذا السجل إلى وقت فقدان الأحداث. .IP .in +4n .EX struct { struct perf_event_header header; u64 id; u64 lost; struct sample_id sample_id; }; .EE .in .RS .TP \fIid\fP هو معرف الحدث الفريد للعينات التي فُقدت. .TP \fIlost\fP هو عدد الأحداث التي فُقدت. .RE .TP \fBPERF_RECORD_COMM\fP يشير هذا السجل إلى تغيير في اسم العملية. .IP .in +4n .EX struct { struct perf_event_header header; u32 pid; u32 tid; char comm[]; struct sample_id sample_id; }; .EE .in .RS .TP \fIpid\fP هو معرف العملية. .TP \fItid\fP هو معرف الخيط. .TP \fIcomm\fP هو سلسلة نصية تحتوي على الاسم الجديد للعملية. .RE .TP \fBPERF_RECORD_EXIT\fP يشير هذا السجل إلى حدث خروج عملية. .IP .in +4n .EX struct { struct perf_event_header header; u32 pid, ppid; u32 tid, ptid; u64 time; struct sample_id sample_id; }; .EE .in .TP \fBPERF_RECORD_THROTTLE\fP .TQ \fBPERF_RECORD_UNTHROTTLE\fP يشير هذا السجل إلى حدث تقييد/إلغاء تقييد (throttle/unthrottle). .IP .in +4n .EX struct { struct perf_event_header header; u64 time; u64 id; u64 stream_id; struct sample_id sample_id; }; .EE .in .TP \fBPERF_RECORD_FORK\fP يشير هذا السجل إلى حدث تشعب (fork). .IP .in +4n .EX struct { struct perf_event_header header; u32 pid, ppid; u32 tid, ptid; u64 time; struct sample_id sample_id; }; .EE .in .TP \fBPERF_RECORD_READ\fP يشير هذا السجل إلى حدث قراءة. .IP .in +4n .EX struct { struct perf_event_header header; u32 pid, tid; struct read_format values; struct sample_id sample_id; }; .EE .in .TP \fBPERF_RECORD_SAMPLE\fP يشير هذا السجل إلى عينة. .IP .in +4n .EX struct { struct perf_event_header header; u64 sample_id; /* if PERF_SAMPLE_IDENTIFIER */ u64 ip; /* if PERF_SAMPLE_IP */ u32 pid, tid; /* if PERF_SAMPLE_TID */ u64 time; /* if PERF_SAMPLE_TIME */ u64 addr; /* if PERF_SAMPLE_ADDR */ u64 id; /* if PERF_SAMPLE_ID */ u64 stream_id; /* if PERF_SAMPLE_STREAM_ID */ u32 cpu, res; /* if PERF_SAMPLE_CPU */ u64 period; /* if PERF_SAMPLE_PERIOD */ struct read_format v; /* if PERF_SAMPLE_READ */ u64 nr; /* if PERF_SAMPLE_CALLCHAIN */ u64 ips[nr]; /* if PERF_SAMPLE_CALLCHAIN */ u32 size; /* if PERF_SAMPLE_RAW */ char data[size]; /* if PERF_SAMPLE_RAW */ u64 bnr; /* if PERF_SAMPLE_BRANCH_STACK */ struct perf_branch_entry lbr[bnr]; /* if PERF_SAMPLE_BRANCH_STACK */ u64 abi; /* if PERF_SAMPLE_REGS_USER */ u64 regs[weight(mask)]; /* if PERF_SAMPLE_REGS_USER */ u64 size; /* if PERF_SAMPLE_STACK_USER */ char data[size]; /* if PERF_SAMPLE_STACK_USER */ u64 dyn_size; /* if PERF_SAMPLE_STACK_USER && size != 0 */ union perf_sample_weight weight; /* if PERF_SAMPLE_WEIGHT */ /* || PERF_SAMPLE_WEIGHT_STRUCT */ u64 data_src; /* if PERF_SAMPLE_DATA_SRC */ u64 transaction; /* if PERF_SAMPLE_TRANSACTION */ u64 abi; /* if PERF_SAMPLE_REGS_INTR */ u64 regs[weight(mask)]; /* if PERF_SAMPLE_REGS_INTR */ u64 phys_addr; /* if PERF_SAMPLE_PHYS_ADDR */ u64 cgroup; /* if PERF_SAMPLE_CGROUP */ u64 data_page_size; /* if PERF_SAMPLE_DATA_PAGE_SIZE */ u64 code_page_size; /* if PERF_SAMPLE_CODE_PAGE_SIZE */ u64 size; /* if PERF_SAMPLE_AUX */ char data[size]; /* if PERF_SAMPLE_AUX */ }; .EE .in .RS 4 .TP 4 \fIsample_id\fP إذا مكنت \fBPERF_SAMPLE_IDENTIFIER\fP، سيُدرج معرف فريد 64 بت. هذا تكرار لقيمة \fIid\fP في \fBPERF_SAMPLE_ID\fP، ولكنه مدرج في بداية العينة حتى تتمكن المحللات من الحصول على القيمة بسهولة. .TP \fIip\fP إذا مكنت \fBPERF_SAMPLE_IP\fP، فستُدرج قيمة مؤشر تعليمات 64 بت. .TP \fIpid\fP .TQ \fItid\fP إذا مكنت \fBPERF_SAMPLE_TID\fP، فسيُدرج معرف عملية 32 بت ومعرف خيط 32 بت. .TP \fItime\fP إذا مكنت \fBPERF_SAMPLE_TIME\fP، فسيُدرج طابع زمني 64 بت. يُحصل على هذا عبر local_clock() وهو طابع زمني للأجهزة إذا كان متاحًا وقيمة jiffies إذا لم يكن كذلك. .TP \fIaddr\fP إذا مكنت \fBPERF_SAMPLE_ADDR\fP، فسيُدرج عنوان 64 بت. يكون هذا عادةً عنوان نقطة تتبع، أو نقطة توقف، أو حدث برمجي؛ وإلا فإن القيمة تكون 0. .TP \fIid\fP إذا مكنت \fBPERF_SAMPLE_ID\fP، سيُدرج معرف فريد 64 بت. إذا كان الحدث عضواً في مجموعة أحداث، فسيُرجع معرف قائد المجموعة. هذا المعرف هو نفسه الذي يرجعه \fBPERF_FORMAT_ID\fP. .TP \fIstream_id\fP إذا مكنت \fBPERF_SAMPLE_STREAM_ID\fP، سيُدرج معرف فريد 64 بت. على عكس \fBPERF_SAMPLE_ID\fP يُرجع المعرف الفعلي، وليس قائد المجموعة. هذا المعرف هو نفسه الذي يرجعه \fBPERF_FORMAT_ID\fP. .TP \fIوحدة المعالجة المركزية\fP .TQ \fIres\fP إذا مكنت \fBPERF_SAMPLE_CPU\fP، فهذه قيمة 32 بت تشير إلى وحدة المعالجة المركزية التي كانت قيد الاستخدام، بالإضافة إلى قيمة 32 بت محجوزة (غير مستخدمة). .TP \fIperiod\fP إذا مكنت \fBPERF_SAMPLE_PERIOD\fP، فستُكتب قيمة 64 بت تشير إلى فترة المعاينة الحالية. .TP \fIv\fP إذا فُعِّل \fBPERF_SAMPLE_READ\fP، فستُدرج بنية من النوع read_format تحتوي على قيم لكل الأحداث في مجموعة الأحداث. تعتمد القيم المُدرجة على قيمة \fIread_format\fP المستخدمة وقت \fBperf_event_open\fP(). .TP \fInr\fP .TQ \fIips[nr]\fP إذا فُعِّل \fBPERF_SAMPLE_CALLCHAIN\fP، فسيُدرج رقم 64\-بت يشير إلى عدد مؤشرات التعليمات (instruction pointers) التالية ذات 64\-بت التي ستتبع. هذا هو تسلسل الاستدعاء الحالي. .TP \fIsize\fP .TQ \fIdata[size]\fP إذا فُعِّل \fBPERF_SAMPLE_RAW\fP، فستُدرج قيمة 32\-بت تشير إلى الحجم، تليها مصفوفة من قيم 8\-بت بحجم \fIsize\fP. تُحشى القيم بالأصفار لتحقيق محاذاة 64\-بت. .IP بيانات السجل الخام (RAW) هذه مبهمة بالنسبة لواجهة التطبيق الثنائية (ABI). لا تقدم واجهة ABI أي وعود فيما يتعلق باستقرار محتواها، فقد تختلف بناءً على الحدث، والعتاد، وإصدار النواة (Kernel). .TP \fIbnr\fP .TQ \fIlbr[bnr]\fP إذا فُعِّل \fBPERF_SAMPLE_BRANCH_STACK\fP، فستُدرج قيمة 64\-بت تشير إلى عدد السجلات، تليها \fIbnr\fP من بنيات \fIperf_branch_entry\fP التي يتضمن كل منها الحقول التالية: .RS .TP \fIfrom\fP يشير هذا إلى تعليمة المصدر (قد لا تكون فرعًا). .TP \fIto\fP هدف الفرع. .TP \fImispred\fP أُسيء التنبؤ بهدف الفرع. .TP \fIpredicted\fP تُنُبئ بهدف الفرع. .TP \fIin_tx\fP (منذ لينكس 3.11) .\" commit 135c5612c460f89657c4698fe2ea753f6f667963 كان الفرع ضمن معاملة ذاكرة تعاملية (transactional memory transaction). .TP \fIabort\fP (منذ لينكس 3.11) .\" commit 135c5612c460f89657c4698fe2ea753f6f667963 كان الفرع ضمن معاملة ذاكرة تعاملية مُجهضة. .TP \fIcycles\fP (منذ لينكس 4.3) .\" commit 71ef3c6b9d4665ee7afbbe4c208a98917dcfc32f يبلغ هذا عن عدد الدورات (cycles) المنقضية منذ التحديث السابق لمكدس الفروع (branch stack). .P تُرتب المدخلات من الأحدث إلى الأقدم، لذا فإن المدخل الأول يحتوي على أحدث فرع. .P دعم \fImispred\fP و \fIpredicted\fP و \fIcycles\fP اختياري؛ وإذا لم تكن مدعومة، فستكون هذه القيم 0. .P نوع الفروع المسجلة يُحدد بواسطة حقل \fIbranch_sample_type\fP. .RE .TP \fIabi\fP .TQ \fIregs[weight(mask)]\fP إذا فُعِّل \fBPERF_SAMPLE_REGS_USER\fP، فتُسجل سجلات وحدة المعالجة المركزية (CPU) للمستخدم. .IP يكون حقل \fIabi\fP واحدًا من \fBPERF_SAMPLE_REGS_ABI_NONE\fP، أو \fBPERF_SAMPLE_REGS_ABI_32\fP، أو \fBPERF_SAMPLE_REGS_ABI_64\fP. .IP حقل \fIregs\fP هو مصفوفة من سجلات CPU التي حُددت بواسطة حقل \fIsample_regs_user\fP في السمات (attr). عدد القيم هو عدد البتات المضبطة في قناع البتات \fIsample_regs_user\fP. .TP \fIsize\fP .TQ \fIdata[size]\fP .TQ \fIdyn_size\fP إذا فُعِّل \fBPERF_SAMPLE_STACK_USER\fP، فسيُسجل مكدس المستخدم. يمكن استخدام هذا لإنشاء تتبعات خلفية للمكدس (backtraces). يمثل \fIsize\fP الحجم الذي طلبه المستخدم في \fIsample_stack_user\fP أو أقصى حجم للسجل. \fIdata\fP هي بيانات المكدس (تفريغ خام للذاكرة التي يشير إليها مؤشر المكدس وقت أخذ العينات). \fIdyn_size\fP هو كمية البيانات التي فُرغت فعليًا (يمكن أن تكون أقل من \fIsize\fP). لاحظ أن \fIdyn_size\fP يُحذف إذا كان \fIsize\fP هو 0. .TP \fIweight\fP إذا فُعِّل \fBPERF_SAMPLE_WEIGHT\fP أو \fBPERF_SAMPLE_WEIGHT_STRUCT\fP، فتُسجل قيمة 64\-بت يوفرها العتاد تشير إلى مدى تكلفة الحدث. يسمح هذا للأحداث المكلفة بالبروز بوضوح أكبر في التشكيلات (profiles). .TP \fIdata_src\fP إذا فُعِّل \fBPERF_SAMPLE_DATA_SRC\fP، فتُسجل قيمة 64\-بت تتكون من الحقول التالية: .RS .TP 4 \fImem_op\fP نوع رمز العملية (opcode)، وهو مزيج بتات (bitwise combination) من: .IP .PD 0 .RS .TP 24 \fBPERF_MEM_OP_NA\fP غير متاح .TP \fBPERF_MEM_OP_LOAD\fP تعليمة تحميل (Load) .TP \fBPERF_MEM_OP_STORE\fP تعليمة تخزين (Store) .TP \fBPERF_MEM_OP_PFETCH\fP جلب مسبق .TP \fBPERF_MEM_OP_EXEC\fP كود قابل للتنفيذ .RE .PD .TP \fImem_lvl\fP إصابة أو إخفاق مستوى هرمية الذاكرة، وهو مزيج بتات مما يلي، مُزاح لليسار بمقدار \fBPERF_MEM_LVL_SHIFT\fP: .IP .PD 0 .RS .TP 24 \fBPERF_MEM_LVL_NA\fP غير متاح .TP \fBPERF_MEM_LVL_HIT\fP إصابة (Hit) .TP \fBPERF_MEM_LVL_MISS\fP إخفاق (Miss) .TP \fBPERF_MEM_LVL_L1\fP خبيئة المستوى 1 .TP \fBPERF_MEM_LVL_LFB\fP مخزن مؤقت لملء السطور (Line fill buffer) .TP \fBPERF_MEM_LVL_L2\fP خبيئة المستوى 2 .TP \fBPERF_MEM_LVL_L3\fP خبيئة المستوى 3 .TP \fBPERF_MEM_LVL_LOC_RAM\fP DRAM محلية .TP \fBPERF_MEM_LVL_REM_RAM1\fP DRAM بعيدة على بعد قفزة واحدة .TP \fBPERF_MEM_LVL_REM_RAM2\fP ذاكرة DRAM بعيدة عبر قفزتين .TP \fBPERF_MEM_LVL_REM_CCE1\fP خبيئة بعيدة عبر قفزة واحدة .TP \fBPERF_MEM_LVL_REM_CCE2\fP خبيئة بعيدة عبر قفزتين .TP \fBPERF_MEM_LVL_IO\fP ذاكرة الإدخال/الإخراج .TP \fBPERF_MEM_LVL_UNC\fP ذاكرة غير مخبوءة .RE .PD .TP \fImem_snoop\fP وضع الاسترقاق (Snoop mode)، وهو مزيج بتات مما يلي، مُزاح إلى اليسار بمقدار \fBPERF_MEM_SNOOP_SHIFT\fP: .IP .PD 0 .RS .TP 24 \fBPERF_MEM_SNOOP_NA\fP غير متاح .TP \fBPERF_MEM_SNOOP_NONE\fP لا يوجد استرقاق .TP \fBPERF_MEM_SNOOP_HIT\fP إصابة استرقاق .TP \fBPERF_MEM_SNOOP_MISS\fP إخفاق استرقاق .TP \fBPERF_MEM_SNOOP_HITM\fP إصابة استرقاق مُعدلة .RE .PD .TP \fImem_lock\fP تعليمات القفل، وهي مزيج بتات مما يلي، مُزاح إلى اليسار بمقدار \fBPERF_MEM_LOCK_SHIFT\fP: .IP .PD 0 .RS .TP 24 \fBPERF_MEM_LOCK_NA\fP غير متاح .TP \fBPERF_MEM_LOCK_LOCKED\fP عملية مقفلة .RE .PD .TP \fImem_dtlb\fP إصابة أو إخفاق وصول TLB، وهي مزيج بتات مما يلي، مُزاح إلى اليسار بمقدار \fBPERF_MEM_TLB_SHIFT\fP: .IP .PD 0 .RS .TP 24 \fBPERF_MEM_TLB_NA\fP غير متاح .TP \fBPERF_MEM_TLB_HIT\fP إصابة (Hit) .TP \fBPERF_MEM_TLB_MISS\fP إخفاق (Miss) .TP \fBPERF_MEM_TLB_L1\fP TLB المستوى 1 .TP \fBPERF_MEM_TLB_L2\fP TLB المستوى 2 .TP \fBPERF_MEM_TLB_WK\fP جوال عتادي .TP \fBPERF_MEM_TLB_OS\fP مُعالج أخطاء نظام التشغيل .RE .PD .RE .TP \fItransaction\fP إذا ضُبطت العلامة \fBPERF_SAMPLE_TRANSACTION\fP، فسيُسجل حقل بطول 64 بت يصف مصادر أي إجهاضات للذاكرة المعاملاتية. .IP هذا الحقل هو مزيج بتات من القيم التالية: .RS .TP \fBPERF_TXN_ELISION\fP إجهاض من معاملة من نوع الحذف (خاص بمعالجات إنقيل). .TP \fBPERF_TXN_TRANSACTION\fP إجهاض من معاملة عامة. .TP \fBPERF_TXN_SYNC\fP إجهاض متزامن (متعلق بالتعليمات المُبلغ عنها). .TP \fBPERF_TXN_ASYNC\fP إجهاض غير متزامن (غير متعلق بالتعليمات المُبلغ عنها). .TP \fBPERF_TXN_RETRY\fP إجهاض قابل لإعادة المحاولة (ربما نجحت إعادة محاولة المعاملة). .TP \fBPERF_TXN_CONFLICT\fP إجهاض بسبب تضارب الذاكرة مع خيوط أخرى. .TP \fBPERF_TXN_CAPACITY_WRITE\fP إجهاض بسبب تجاوز سعة الكتابة. .TP \fBPERF_TXN_CAPACITY_READ\fP إجهاض بسبب تجاوز سعة القراءة. .RE .IP بالإضافة إلى ذلك، يمكن الحصول على كود إجهاض محدد من قبل المستخدم من الـ 32 بت العليا للحقل عن طريق الإزاحة لليمين بمقدار \fBPERF_TXN_ABORT_SHIFT\fP وتطبيق قناع بالقيمة \fBPERF_TXN_ABORT_MASK\fP. .TP \fIabi\fP .TQ \fIregs[weight(mask)]\fP إذا فُعّلت \fBPERF_SAMPLE_REGS_INTR\fP، فستُسجل سجلات وحدة المعالجة المركزية للمستخدم. .IP يكون حقل \fIabi\fP واحدًا من \fBPERF_SAMPLE_REGS_ABI_NONE\fP، أو \fBPERF_SAMPLE_REGS_ABI_32\fP، أو \fBPERF_SAMPLE_REGS_ABI_64\fP. .IP حقل \fIregs\fP هو مصفوفة من سجلات وحدة المعالجة المركزية التي حُددت بواسطة حقل السمة \fIsample_regs_intr\fP. عدد القيم هو عدد البتات المضبوطة في قناع البتات \fIsample_regs_intr\fP. .TP \fIphys_addr\fP إذا ضُبطت العلامة \fBPERF_SAMPLE_PHYS_ADDR\fP، فسيُسجل العنوان الفيزيائي ذو الـ 64 بت. .TP \fIcgroup\fP إذا ضُبطت العلامة \fBPERF_SAMPLE_CGROUP\fP، فسيُسجل معرف cgroup ذو الـ 64 بت (الخاص بنظام perf_event الفرعي). للحصول على مسار cgroup، يجب أن يتطابق المعرف مع أحد المعرفات في \fBPERF_RECORD_CGROUP\fP. .TP \fIdata_page_size\fP إذا ضُبطت العلامة \fBPERF_SAMPLE_DATA_PAGE_SIZE\fP، فسيُسجل حجم الصفحة ذو الـ 64 بت لعنوان الـ \fBdata\fP. .TP \fIcode_page_size\fP إذا ضُبطت العلامة \fBPERF_SAMPLE_CODE_PAGE_SIZE\fP، فسيُسجل حجم الصفحة ذو الـ 64 بت لعنوان الـ \fBip\fP. .TP \fIsize\fP .TQ \fIdata\fP[\fIsize\fP] إذا فُعّلت \fBPERF_SAMPLE_AUX\fP، فستُسجل لقطة لمخزن aux المؤقت. .RE .TP \fBPERF_RECORD_MMAP2\fP يتضمن هذا السجل معلومات ممتدة حول استدعاءات \fBmmap\fP(2) التي تعيد تخطيطات قابلة للتنفيذ. التنسيق مشابه لتنسيق سجل \fBPERF_RECORD_MMAP\fP، ولكنه يتضمن قيمًا إضافية تسمح بتحديد التخطيطات المشتركة بشكل فريد. اعتمادًا على بت \fBPERF_RECORD_MISC_MMAP_BUILD_ID\fP في الترويسة، تختلف معاني القيم الإضافية ومخططها. .IP .in +4n .EX struct { struct perf_event_header header; u32 pid; u32 tid; u64 addr; u64 len; u64 pgoff; union { struct { u32 maj; u32 min; u64 ino; u64 ino_generation; }; struct { /* if PERF_RECORD_MISC_MMAP_BUILD_ID */ u8 build_id_size; u8 __reserved_1; u16 __reserved_2; u8 build_id[20]; }; }; u32 prot; u32 flags; char filename[]; struct sample_id sample_id; }; .EE .in .RS .TP \fIpid\fP هو معرف العملية. .TP \fItid\fP هو معرف الخيط. .TP \fIaddr\fP هو عنوان الذاكرة المخصصة. .TP \fIlen\fP هو حجم الذاكرة المخصصة. .TP \fIpgoff\fP هو إزاحة الصفحة للذاكرة المخصصة. .TP \fImaj\fP هو المعرف الرئيس للجهاز الأساسي. .TP \fImin\fP هو المعرف الثانوي للجهاز الأساسي. .TP \fIino\fP هو رقم الآينود (inode). .TP \fIino_generation\fP هو جيل الآينود (inode). .TP \fIbuild_id_size\fP هو الحجم الفعلي لحقل \fIbuild_id\fP (حتى 20). .TP \fIbuild_id\fP هي بيانات خام لتعريف ملف ثنائي. .TP \fIprot\fP هي معلومات الحماية. .TP \fIflags\fP هي معلومات الأعلام (flags). .TP \fIfilename\fP هي سلسلة نصية تصف ما يسند الذاكرة المخصصة. .RE .TP \fBPERF_RECORD_AUX\fP (منذ لينكس 4.1) .\" commit 68db7e98c3a6ebe7284b6cf14906ed7c55f3f7f0 يبلغ هذا السجل عن توفر بيانات جديدة في منطقة مخزن AUX المؤقت المنفصلة. .IP .in +4n .EX struct { struct perf_event_header header; u64 aux_offset; u64 aux_size; u64 flags; struct sample_id sample_id; }; .EE .in .RS .TP \fIaux_offset\fP الإزاحة في منطقة mmap لـ AUX حيث تبدأ البيانات الجديدة. .TP \fIaux_size\fP حجم البيانات التي أُتيحت. .TP \fIflags\fP يصف تحديث AUX. .RS .TP \fBPERF_AUX_FLAG_TRUNCATED\fP إذا ضُبط، فهذا يعني أن البيانات المعادة بُترت لتناسب حجم المخزن المؤقت المتاح. .TP \fBPERF_AUX_FLAG_OVERWRITE\fP .\" commit 2023a0d2829e521fe6ad6b9907f3f90bfbf57142 إذا ضُبط، فهذا يعني أن البيانات المعادة كتبت فوق بيانات سابقة. .RE .RE .TP \fBPERF_RECORD_ITRACE_START\fP (منذ لينكس 4.1) .\" ec0d7729bbaed4b9d2d3fada693278e13a3d1368 يشير هذا السجل إلى العملية التي بدأت حدث تتبع التعليمات، مما يسمح للأدوات بربط عناوين التعليمات في مخزن AUX المؤقت بالملف التنفيذي المناسب بشكل صحيح. .IP .in +4n .EX struct { struct perf_event_header header; u32 pid; u32 tid; }; .EE .in .RS .TP \fIpid\fP معرف العملية للخيط (thread) الذي يبدأ تتبع التعليمات. .TP \fItid\fP معرف الخيط (thread ID) للخيط الذي يبدأ تتبع التعليمات. .RE .TP \fBPERF_RECORD_LOST_SAMPLES\fP (منذ لينكس 4.2) .\" f38b0dbb491a6987e198aa6b428db8692a6480f8 عند استخدام المعاينة العتادية (مثل Intel PEBS)، يشير هذا السجل إلى عدد من العينات التي قد تكون فُقدت. .IP .in +4n .EX struct { struct perf_event_header header; u64 lost; struct sample_id sample_id; }; .EE .in .RS .TP \fIlost\fP عدد العينات التي يحتمل فقدانها. .RE .TP \fBPERF_RECORD_SWITCH\fP (منذ لينكس 4.3) .\" commit 45ac1403f564f411c6a383a2448688ba8dd705a4 يشير هذا السجل إلى حدوث تبديل سياق. يشير بت \fBPERF_RECORD_MISC_SWITCH_OUT\fP في حقل \fImisc\fP ما إذا كان تبديل السياق إلى العملية الحالية أو بعيدًا عنها. .IP .in +4n .EX struct { struct perf_event_header header; struct sample_id sample_id; }; .EE .in .TP \fBPERF_RECORD_SWITCH_CPU_WIDE\fP (منذ لينكس 4.3) .\" commit 45ac1403f564f411c6a383a2448688ba8dd705a4 كما هو الحال مع \fBPERF_RECORD_SWITCH\fP، يشير هذا السجل إلى حدوث تبديل سياق، ولكنه يحدث فقط عند المعاينة في وضع شامل للمعالج (CPU\-wide) ويوفر معلومات إضافية حول العملية التي يجري التبديل إليها أو منها. يشير بت \fBPERF_RECORD_MISC_SWITCH_OUT\fP في حقل \fImisc\fP ما إذا كان تبديل السياق إلى العملية الحالية أو بعيدًا عنها. .IP .in +4n .EX struct { struct perf_event_header header; u32 next_prev_pid; u32 next_prev_tid; struct sample_id sample_id; }; .EE .in .RS .TP \fInext_prev_pid\fP معرف العملية للعملية السابقة (في حالة التبديل للداخل) أو التالية (في حالة التبديل للخارج) على المعالج. .TP \fInext_prev_tid\fP معرف الخيط (thread ID) للخيط السابق (في حالة التبديل للداخل) أو التالي (في حالة التبديل للخارج) على المعالج. .RE .TP \fBPERF_RECORD_NAMESPACES\fP (منذ لينكس 4.11) .\" commit e422267322cd319e2695a535e47c5b1feeac45eb يتضمن هذا السجل معلومات مساحات أسماء متنوعة لعملية ما. .IP .in +4n .EX struct { struct perf_event_header header; u32 pid; u32 tid; u64 nr_namespaces; struct { u64 dev, inode } [nr_namespaces]; struct sample_id sample_id; }; .EE .in .RS .TP \fIpid\fP هو معرف العملية .TP \fItid\fP هو معرف الخيط .TP \fInr_namespace\fP هو عدد مساحات الأسماء في هذا السجل .RE .IP تملك كل مساحة أسماء حقلين \fIdev\fP و \fIinode\fP وتُسجل في موضع ثابت مثل أدناه: .RS .TP \fBNET_NS_INDEX\fP=\fB0\fP مساحة أسماء الشبكة .TP \fBUTS_NS_INDEX\fP=\fB1\fP مساحة أسماء UTS .TP \fBIPC_NS_INDEX\fP=\fB2\fP مساحة أسماء IPC .TP \fBPID_NS_INDEX\fP=\fB3\fP نطاق تسمية PID .TP \fBUSER_NS_INDEX\fP=\fB4\fP نطاق تسمية المستخدم .TP \fBMNT_NS_INDEX\fP=\fB5\fP نطاق تسمية الوصل .TP \fBCGROUP_NS_INDEX\fP=\fB6\fP نطاق تسمية Cgroup .RE .TP \fBPERF_RECORD_KSYMBOL\fP (منذ لينكس 5.0) .\" commit 76193a94522f1d4edf2447a536f3f796ce56343b يشير هذا السجل إلى أحداث تسجيل/إلغاء تسجيل رموز النواة. .IP .in +4n .EX struct { struct perf_event_header header; u64 addr; u32 len; u16 ksym_type; u16 flags; char name[]; struct sample_id sample_id; }; .EE .in .RS .TP \fIaddr\fP هو عنوان رمز النواة. .TP \fIlen\fP هو حجم رمز النواة. .TP \fIksym_type\fP هو نوع رمز النواة. تتوفر الأنواع التالية حاليًا: .RS .TP \fBPERF_RECORD_KSYMBOL_TYPE_BPF\fP رمز النواة هو دالة BPF. .RE .TP \fIflags\fP إذا ضُبط \fBPERF_RECORD_KSYMBOL_FLAGS_UNREGISTER\fP، فإن هذا الحدث يكون لإلغاء تسجيل رمز النواة. .RE .TP \fBPERF_RECORD_BPF_EVENT\fP (منذ لينكس 5.0) .\" commit 6ee52e2a3fe4ea35520720736e6791df1fb67106 يشير هذا السجل إلى تحميل برنامج BPF أو تفريغه. .IP .in +4n .EX struct { struct perf_event_header header; u16 type; u16 flags; u32 id; u8 tag[BPF_TAG_SIZE]; struct sample_id sample_id; }; .EE .in .RS .TP \fItype\fP هي واحدة من القيم التالية: .RS .TP \fBPERF_BPF_EVENT_PROG_LOAD\fP حُمِّل برنامج BPF .TP \fBPERF_BPF_EVENT_PROG_UNLOAD\fP فُرِّغ برنامج BPF .RE .TP \fIid\fP هو معرف برنامج BPF. .TP \fIوسم\fP هو وسم برنامج BPF. حاليًا، يُعرَّف \fBBPF_TAG_SIZE\fP على أنه 8. .RE .TP \fBPERF_RECORD_CGROUP\fP (منذ لينكس 5.7) .\" commit 96aaab686505c449e24d76e76507290dcc30e008 يشير هذا السجل إلى إنشاء cgroup جديد وتنشيطه. .IP .in +4n .EX struct { struct perf_event_header header; u64 id; char path[]; struct sample_id sample_id; }; .EE .in .RS .TP \fIid\fP هو معرف cgroup. يمكن استرداده أيضًا بواسطة \fBname_to_handle_at\fP(2) على مسار cgroup (كمقبض ملف). .TP \fIمسار\fP هو مسار cgroup من الجذر. .RE .TP \fBPERF_RECORD_TEXT_POKE\fP (منذ لينكس 5.8) .\" commit e17d43b93e544f5016c0251d2074c15568d5d963 يشير هذا السجل إلى تغيير في نص النواة. يتضمن ذلك إضافة النص وإزالته، ويكون الحجم المقابل صفرًا في هذه الحالة. .IP .in +4n .EX struct { struct perf_event_header header; u64 addr; u16 old_len; u16 new_len; u8 bytes[]; struct sample_id sample_id; }; .EE .in .RS .TP \fIaddr\fP هو عنوان التغيير .TP \fIold_len\fP هو الحجم القديم .TP \fInew_len\fP هو الحجم الجديد .TP \fIbytes\fP يحتوي على البايتات القديمة متبوعة مباشرة بالبايتات الجديدة. .RE .RE .SS "التعامل مع الطفح" يمكن ضبط الأحداث للإشعار عند تجاوز عتبة معينة، مما يشير إلى حدوث طفح. يمكن التقاط حالات الطفح من خلال مراقبة واصف ملف الحدث باستخدام \fBpoll\fP(2)، أو \fBselect\fP(2)، أو \fBepoll\fP(7). بدلاً من ذلك، يمكن التقاط أحداث الطفح عبر معالج إشارات، من خلال تمكين إشارات الدخل/الخرج على واصف الملف؛ انظر مناقشة عمليتي \fBF_SETOWN\fP و \fBF_SETSIG\fP في \fBfcntl\fP(2). .P لا تُولَّد حالات الطفح إلا بواسطة أحداث أخذ العينات (يجب أن تكون قيمة \fIsample_period\fP غير صفرية). .P توجد طريقتان لتوليد إشعارات الطفح. .P الأولى هي ضبط قيمة \fIwakeup_events\fP أو \fIwakeup_watermark\fP التي ستعمل إذا كُتب عدد معين من العينات أو البايتات في المخزن المؤقت الحلقي لـ mmap. في هذه الحالة، يُشار إلى \fBPOLL_IN\fP. .P الطريقة الأخرى هي استخدام ioctl \fBPERF_EVENT_IOC_REFRESH\fP. يضيف هذا الـ ioctl إلى عداد يتناقص في كل مرة يطفح فيها الحدث. عندما تكون القيمة غير صفرية، يُشار إلى \fBPOLL_IN\fP، ولكن بمجرد وصول العداد إلى 0، يُشار إلى \fBPOLL_HUP\fP ويُعطَّل الحدث الأساسي. .P .\" See https://lkml.org/lkml/2011/5/24/337 تؤدي عملية تنشيط متصدر مجموعة أحداث إلى تنشيط جميع الأشقاء، كما أن التنشيط باستخدام المعامل 0 يتيح حاليًا عمليات تنشيط غير محدودة؛ هذه السلوكيات غير مدعومة ولا ينبغي الاعتماد عليها. .P .\" commit 179033b3e064d2cd3f5f9945e76b0a0f0fbf4883 بدءًا من لينكس 3.18، يُشار إلى \fBPOLL_HUP\fP إذا كان الحدث الذي تُجرى مراقبته مرتبطًا بعملية مختلفة وخرجت تلك العملية. .SS "تعليمة rdpmc" .\" commit c7206205d00ab375839bd6c7ddb247d600693c09 بدءًا من لينكس 3.4 على x86، يمكنك استخدام تعليمة \fIrdpmc\fP للحصول على قراءات ذات زمن وصول منخفض دون الحاجة إلى الدخول إلى النواة. لاحظ أن استخدام \fIrdpmc\fP ليس بالضرورة أسرع من الطرق الأخرى لقراءة قيم الأحداث. .P يمكن اكتشاف دعم ذلك من خلال حقل \fIcap_usr_rdpmc\fP في صفحة mmap؛ يمكن العثور على وثائق حول كيفية حساب قيم الأحداث في ذلك القسم. .P .\" 7911d3f7af14a614617e38245fedf98a724e46a9 في الأصل، عندما كان دعم rdpmc مُمكَّنًا، كان بإمكان أي عملية (ليس فقط تلك التي لديها حدث perf نشط) استخدام تعليمة rdpmc للوصول إلى العدادات. بدءًا من لينكس 4.0، لا يُسمح بدعم rdpmc إلا إذا كان هناك حدث مُمكَّن حاليًا في سياق العملية. لاستعادة السلوك القديم، اكتب القيمة 2 في \fI/sys/devices/cpu/rdpmc\fP. .SS "استدعاءات ioctl لـ perf_event" تعمل استدعاءات ioctl المتنوعة على واصفات ملفات \fBperf_event_open\fP(): .TP \fBPERF_EVENT_IOC_ENABLE\fP يُمكِّن هذا الحدث الفردي أو مجموعة الأحداث المحددة بواسطة وسيط واصف الملف. .IP إذا ضُبطت بتة \fBPERF_IOC_FLAG_GROUP\fP في وسيط ioctl، فستُمكَّن جميع الأحداث في المجموعة، حتى لو لم يكن الحدث المحدد هو متصدر المجموعة (ولكن انظر قسم العيوب BUGS). .TP \fBPERF_EVENT_IOC_DISABLE\fP يُعطِّل هذا العداد الفردي أو مجموعة الأحداث المحددة بواسطة وسيط واصف الملف. .IP يؤدي تمكين أو تعطيل متصدر المجموعة إلى تمكين أو تعطيل المجموعة بأكملها؛ أي أنه أثناء تعطيل متصدر المجموعة، لن يقوم أي من العدادات في المجموعة بالعد. يؤثر تمكين أو تعطيل عضو في مجموعة غير المتصدر على ذلك العداد فقط؛ حيث يؤدي تعطيل عضو غير متصدر إلى إيقاف ذلك العداد عن العد ولكنه لا يؤثر على أي عداد آخر. .IP إذا ضُبطت بتة \fBPERF_IOC_FLAG_GROUP\fP في وسيط ioctl، فستُعطَّل جميع الأحداث في المجموعة، حتى لو لم يكن الحدث المحدد هو متصدر المجموعة (ولكن انظر قسم العيوب BUGS). .TP \fBPERF_EVENT_IOC_REFRESH\fP يمكن لعدادات الطفح غير الموروثة استخدام هذا لتمكين عداد لعدد من حالات الطفح المحددة بواسطة الوسيط، وبعد ذلك يُعطَّل. تضيف الاستدعاءات اللاحقة لهذا الـ ioctl قيمة الوسيط إلى العدد الحالي. سيحدث إشعار طفح مع ضبط \fBPOLL_IN\fP عند كل طفح حتى يصل العدد إلى 0؛ وعندما يحدث ذلك، يُرسل إشعار مع ضبط \fBPOLL_HUP\fP ويُعطَّل الحدث. يُعد استخدام وسيط بقيمة 0 سلوكًا غير محدد. .TP \fBPERF_EVENT_IOC_RESET\fP تُصفَّر قيمة عداد الأحداث المحدد بواسطة وسيط واصف الملف. يصفر هذا القيم فقط؛ ولا توجد طريقة لتصفير قيم تعدد الإرسال \fItime_enabled\fP أو \fItime_running\fP. .IP إذا ضُبطت بتة \fBPERF_IOC_FLAG_GROUP\fP في وسيط ioctl، فستُصفر كل الأحداث في المجموعة، حتى لو لم يكن الحدث المحدد هو قائد المجموعة (لكن انظر قسم العلل BUGS). .TP \fBPERF_EVENT_IOC_PERIOD\fP يحدث هذا فترة التجاوز (overflow) للحدث. .IP .\" commit 3581fe0ef37ce12ac7a4f74831168352ae848edc .\" commit bad7192b842c83e580747ca57104dd51fe08c223 بدءًا من لينكس 3.7 (على ARM) ولينكس 3.14 (بقية المعماريات الأخرى)، تسري الفترة الجديدة فورًا. أما في نويات النواة الأقدم، فلم تكن الفترة الجديدة تسري إلا بعد حدوث التجاوز التالي. .IP الوسيط هو مؤشر إلى قيمة 64 بت تحتوي على الفترة الجديدة المطلوبة. .IP .\" commit ad0cf3478de8677f720ee06393b3147819568d6a قبل لينكس 2.6.36، كان ioctl هذا يفشل دائمًا بسبب علة في النواة. .TP \fBPERF_EVENT_IOC_SET_OUTPUT\fP يخبر هذا النواة بإرسال إشعارات الأحداث إلى واصف الملف المحدد بدلًا من الواصف المبدئي. يجب أن تكون جميع واصفات الملفات على وحدة المعالجة المركزية ذاتها. .IP يحدد الوسيط واصف الملف المطلوب، أو \-1 إذا وجب تجاهل المخرجات. .TP \fBPERF_EVENT_IOC_SET_FILTER\fP (منذ لينكس 2.6.33) .\" commit 6fb2915df7f0747d9044da9dbff5b46dc2e20830 يضيف هذا مرشح ftrace إلى هذا الحدث. .IP الوسيط هو مؤشر إلى مرشح ftrace المطلوب. .TP \fBPERF_EVENT_IOC_ID\fP (منذ لينكس 3.12) .\" commit cf4957f17f2a89984915ea808876d9c82225b862 يعيد هذا قيمة معرف الحدث لواصف ملف الحدث المعطى. .IP الوسيط هو مؤشر إلى عدد صحيح غير موقع بطول 64 بت لحفظ النتيجة. .TP \fBPERF_EVENT_IOC_SET_BPF\fP (منذ لينكس 4.1) .\" commit 2541517c32be2531e0da59dfd7efc1ce844644f5 يسمح هذا بربط برنامج مرشح حزم بيركلي (BPF) بحدث نقطة تتبع kprobe موجود. تحتاج إلى امتيازات \fBCAP_PERFMON\fP (منذ لينكس 5.8) أو \fBCAP_SYS_ADMIN\fP لاستخدام ioctl هذا. .IP الوسيط هو واصف ملف برنامج BPF أُنشئ عبر استدعاء نظام \fBbpf\fP(2) سابق. .TP \fBPERF_EVENT_IOC_PAUSE_OUTPUT\fP (منذ لينكس 4.7) .\" commit 86e7972f690c1017fd086cdfe53d8524e68c661c يسمح هذا بإيقاف واستئناف المخزن الحلقي (ring\-buffer) للحدث. لا يمنع المخزن الحلقي المتوقف مؤقتًا توليد العينات، ولكنه يطرحها ببساطة. تُعتبر العينات المطروحة مفقودة، وتتسبب في توليد عينة \fBPERF_RECORD_LOST\fP عندما يكون ذلك ممكنًا. قد تظل إشارة التجاوز تنطلق بسبب العينة المطروحة حتى لو ظل المخزن الحلقي فارغًا. .IP الوسيط هو عدد صحيح غير موقع بطول 32 بت. تؤدي القيمة غير الصفرية إلى إيقاف المخزن الحلقي مؤقتًا، بينما تستأنفه القيمة الصفرية. .TP \fBPERF_EVENT_MODIFY_ATTRIBUTES\fP (منذ لينكس 4.17) .\" commit 32ff77e8cc9e66cc4fb38098f64fd54cc8f54573 يسمح هذا بتعديل حدث موجود دون العبء الإضافي لإغلاق وفتح حدث جديد. هذا مدعوم حاليًا لأحداث نقاط التوقف (breakpoint events) فقط. .IP الوسيط هو مؤشر إلى بنية \fIperf_event_attr\fP تحتوي على إعدادات الحدث المحدثة. .TP \fBPERF_EVENT_IOC_QUERY_BPF\fP (منذ لينكس 4.16) .\" commit f371b304f12e31fe30207c41ca7754564e0ea4dc يسمح هذا بالاستعلام عن برامج مرشح حزم بيركلي (BPF) المربوطة بنقطة تتبع kprobe موجودة. يمكنك ربط برنامج BPF واحد فقط لكل حدث، ولكن يمكن أن يكون لديك أحداث متعددة مربوطة بنقطة تتبع واحدة. يعيد الاستعلام عن هذه القيمة في حدث نقطة تتبع واحد معرفات جميع برامج BPF في جميع الأحداث المربوطة بنقطة التتبع تلك. تحتاج إلى امتيازات \fBCAP_PERFMON\fP (منذ لينكس 5.8) أو \fBCAP_SYS_ADMIN\fP لاستخدام ioctl هذا. .IP الوسيط هو مؤشر إلى بنية .in +4n .EX struct perf_event_query_bpf { __u32 ids_len; __u32 prog_cnt; __u32 ids[0]; }; .EE .in .IP .\" يشير حقل \fIids_len\fP إلى عدد المعرفات التي يمكن أن يتسع لها مصفوفة \fIids\fP الموفرة. تملأ النواة قيمة \fIprog_cnt\fP بعدد برامج BPF المربوطة. تُملأ مصفوفة \fIids\fP بمعرف كل برنامج BPF مربوط. إذا كان هناك عدد من البرامج أكبر مما يتسع له المصفوفة، فستعيد النواة \fBENOSPC\fP وسيشير \fIids_len\fP إلى عدد معرفات البرامج التي نُسخت بنجاح. .SS "استخدام prctl(2)" يمكن للعملية تفعيل أو تعطيل جميع مجموعات الأحداث المفتوحة حاليًا باستخدام عمليتي \fBprctl\fP(2) هما \fBPR_TASK_PERF_EVENTS_ENABLE\fP و \fBPR_TASK_PERF_EVENTS_DISABLE\fP. ينطبق هذا فقط على الأحداث التي أنشأها المستدعِي محليًا. ولا ينطبق على الأحداث التي أنشأتها عمليات أخرى مرتبطة بالعملية المستدعِية أو الأحداث الموروثة من عملية أب. تُفعل وتُعطل قادة المجموعات فقط، وليس أي أعضاء آخرين في المجموعات. .SS "ملفات الإعداد المتعلقة بـ perf_event" ملفات في \fI/proc/sys/kernel/\fP .RS 4 .TP \fI/proc/sys/kernel/perf_event_paranoid\fP يمكن ضبط ملف \fIperf_event_paranoid\fP لتقييد الوصول إلى عدادات الأداء. .IP .PD 0 .RS .TP \fB2\fP .\" default changed in commit 0161028b7c8aebef64194d3d73e43bc3b53b5c66 يسمح فقط بقياسات مساحة المستخدم (المبدئي منذ لينكس 4.6). .TP \fB1\fP يسمح بكل من قياسات النواة والمستخدم (المبدئي قبل لينكس 4.6). .TP \fB0\fP يسمح بالوصول إلى البيانات الخاصة بوحدة المعالجة المركزية ولكن ليس لعينات نقطة التتبع الخام. .TP \fB\-1\fP بلا قيود. .RE .PD .IP يُعد وجود ملف \fIperf_event_paranoid\fP هو الطريقة الرسمية لتحديد ما إذا كانت النواة تدعم \fBperf_event_open\fP(). .TP \fI/proc/sys/kernel/perf_event_max_sample_rate\fP يضبط هذا الحد الأقصى لمعدل أخذ العينات. قد يؤدي ضبط هذا المعدل على قيمة عالية جدًا إلى السماح للمستخدمين بأخذ العينات بمعدل يؤثر على الأداء العام للحاسوب وقد يؤدي إلى تجمده. القيمة المبدئية هي 100000 (عينة في الثانية). .TP \fI/proc/sys/kernel/perf_event_max_stack\fP .\" Introduced in c5dfd78eb79851e278b7973031b9ca363da87a7e يضبط هذا الملف الحد الأقصى لعمق مدخلات إطارات المكدس (stack frame) المبلغ عنها عند توليد تتبع الاستدعاء (call trace). .TP \fI/proc/sys/kernel/perf_event_mlock_kb\fP الحد الأقصى لعدد الصفحات التي يمكن لمستخدم غير متميز قفلها باستخدام \fBmlock\fP(2). القيمة المبدئية هي 516 (كيلوبايت). .RE .P ملفات في \fI/sys/bus/event_source/devices/\fP .P .RS 4 منذ لينكس 2.6.34، تدعم النواة وجود عدة وحدات مراقبة أداء (PMUs) متاحة للمراقبة. يمكن العثور على معلومات حول كيفية برمجة هذه الوحدات تحت المسار \fI/sys/bus/event_source/devices/\fP. يقابل كل دليل فرعي وحدة PMU مختلفة. .TP \fI/sys/bus/event_source/devices/*/type\fP (منذ لينكس 2.6.38) .\" commit abe43400579d5de0078c2d3a760e6598e183f871 يحتوي هذا على عدد صحيح يمكن استخدامه في حقل \fItype\fP في \fIperf_event_attr\fP للإشارة إلى رغبتك في استخدام وحدة PMU هذه. .TP \fI/sys/bus/event_source/devices/cpu/rdpmc\fP (منذ لينكس 3.4) .\" commit 0c9d42ed4cee2aa1dfc3a260b741baae8615744f إذا كانت قيمة هذا الملف هي 1، فسيُسمح بالوصول المباشر من مساحة المستخدم إلى سجلات عداد الأداء عبر تعليمة rdpmc. يمكن تعطيل ذلك عبر كتابة 0 في الملف. .IP .\" a66734297f78707ce39d756b656bfae861d53f62 .\" 7911d3f7af14a614617e38245fedf98a724e46a9 بدءًا من لينكس 4.0 تغير السلوك، حيث تعني القيمة 1 الآن السماح بالوصول فقط للعمليات التي لديها أحداث perf نشطة، بينما تشير القيمة 2 إلى السلوك القديم الذي يسمح للجميع بالوصول. .TP \fI/sys/bus/event_source/devices/*/format/\fP (منذ لينكس 3.4) .\" commit 641cc938815dfd09f8fa1ec72deb814f0938ac33 يحتوي هذا الدليل الفرعي على معلومات حول الحقول الفرعية الخاصة بالمعمارية والمتاحة لبرمجة حقول \fIconfig\fP المتنوعة في بنية \fIperf_event_attr\fP. .IP محتوى كل ملف هو اسم حقل الإعداد، متبوعًا بنقطتين، متبوعًا بسلسلة من نطاقات البتات الصحيحة المفصولة بفواصل. على سبيل المثال، قد يحتوي الملف \fIevent\fP على القيمة \fIconfig1:1,6\-10,44\fP مما يشير إلى أن الحدث هو سمة تحتل البتات 1 و 6 إلى 10 و 44 من \fIperf_event_attr::config1\fP. .TP \fI/sys/bus/event_source/devices/*/events/\fP (منذ لينكس 3.4) .\" commit 641cc938815dfd09f8fa1ec72deb814f0938ac33 يحتوي هذا الدليل الفرعي على ملفات بها أحداث محددة مسبقًا. المحتويات عبارة عن سلاسل تصف إعدادات الحدث معبرًا عنها بدلالة الحقول الموجودة في دليل \&\fI./format/\fP المذكور سابقًا. ليست هذه بالضرورة قوائم كاملة لجميع الأحداث التي تدعمها وحدة PMU، ولكنها عادة ما تكون مجموعة فرعية من الأحداث التي تعتبر مفيدة أو مثيرة للاهتمام. .IP محتوى كل ملف هو قائمة بأسماء السمات مفصولة بفواصل. لكل مدخل قيمة اختيارية (إما ست عشرية أو عشرية). إذا لم تُحدد أي قيمة، فيُفترض أنها حقل من بت واحد بقيمته 1. قد يبدو مدخل المثال كالتالي: \fIevent=0x2,inv,ldlat=3\fP. .TP \fI/sys/bus/event_source/devices/*/uevent\fP هذا الملف هو واجهة جهاز النواة القياسية لحقن أحداث التوصيل الفوري (hotplug). .TP \fI/sys/bus/event_source/devices/*/cpumask\fP (منذ لينكس 3.7) .\" commit 314d9f63f385096580e9e2a06eaa0745d92fe4ac يحتوي ملف \fIcpumask\fP على قائمة من الأعداد الصحيحة المفصولة بفواصل والتي تشير إلى رقم معالج ممثل لكل مقبس (socket) على اللوحة الأم. هذا مطلوب عند إعداد أحداث uncore أو الجسر الشمالي (northbridge)، حيث تقدم تلك الوحدات (PMUs) أحداثًا على مستوى المقبس. .RE .SH "قيمة الإرجاع" عند النجاح، يعيد \fBperf_event_open\fP() واصف الملف الجديد. وعند الخطأ، تُعاد القيمة \-1 ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء يمكن أن تكون الأخطاء التي يعيدها \fBperf_event_open\fP() غير متسقة، وقد تختلف عبر معماريات المعالجات ووحدات مراقبة الأداء. .TP \fBE2BIG\fP يُعاد إذا كانت قيمة \fIsize\fP في \fIperf_event_attr\fP صغيرة جدًا (أصغر من \fBPERF_ATTR_SIZE_VER0\fP)، أو كبيرة جدًا (أكبر من حجم الصفحة)، أو أكبر مما تدعمه النواة ولم تكن البتات الإضافية صفرًا. عند إرجاع \fBE2BIG\fP، يُكتب فوق حقل \fIsize\fP في \fIperf_event_attr\fP من قبل النواة ليصبح حجم البنية التي كانت تتوقعها. .TP \fBEACCES\fP يُعاد عندما يتطلب الحدث المطلوب صلاحيات \fBCAP_PERFMON\fP (منذ لينكس 5.8) أو \fBCAP_SYS_ADMIN\fP (أو إعداد perf_event paranoid أكثر تسامحًا). بعض الحالات الشائعة التي قد تواجه فيها عملية غير متميزة هذا الخطأ: الارتباط بعملية يملكها مستخدم آخر؛ ومراقبة جميع العمليات على وحدة معالجة مركزية معينة (أي تحديد معامل \fIpid\fP كـ \-1)؛ وعدم ضبط \fIexclude_kernel\fP عندما يتطلب إعداد paranoid ذلك. .TP \fBEBADF\fP يُعاد إذا كان واصف الملف \fIgroup_fd\fP غير صالح، أو إذا ضُبط \fBPERF_FLAG_PID_CGROUP\fP وكان واصف ملف cgroup في \fIpid\fP غير صالح. .TP \fBEBUSY\fP (منذ لينكس 4.1) .\" bed5b25ad9c8a2f5d735ef0bc746ec870c01c1b0 يُعاد إذا كان هناك حدث آخر يمتلك بالفعل وصولاً حصريًا إلى PMU. .TP \fBEFAULT\fP يُعاد إذا كان مؤشر \fIattr\fP يشير إلى عنوان ذاكرة غير صالح. .TP \fBEINTR\fP يُعاد عند محاولة الخلط بين معالجة perf و ftrace لـ uprobe. .TP \fBEINVAL\fP يُعاد إذا كان الحدث المحدد غير صالح. هناك العديد من الأسباب المحتملة لذلك، منها على سبيل المثال لا الحصر: كون \fIsample_freq\fP أعلى من الحد الأقصى للإعداد؛ أو أن \fIcpu\fP المراد مراقبته غير موجود؛ أو \fIread_format\fP خارج النطاق؛ أو \fIsample_type\fP خارج النطاق؛ أو قيمة \fIflags\fP خارج النطاق؛ أو تعيين \fIexclusive\fP أو \fIpinned\fP والحدث ليس قائد مجموعة؛ أو قيم \fIconfig\fP للحدث خارج النطاق أو تم تعيين بتات محجوزة؛ أو أن الحدث العام المحدد غير مدعوم؛ أو عدم وجود مساحة كافية لإضافة الحدث المحدد. .TP \fBEMFILE\fP يستخدم كل حدث مفتوح واصف ملف واحد. إذا فُتح عدد كبير من الأحداث، سيتم الوصول إلى الحد الأقصى لواصفات الملفات المفتوحة لكل عملية، ولن يمكن إنشاء المزيد من الأحداث. .TP \fBENODEV\fP يُعاد عندما يتضمن الحدث ميزة لا تدعمها وحدة المعالجة المركزية الحالية. .TP \fBENOENT\fP يُعاد إذا كان إعداد \fItype\fP غير صالح. يُعاد هذا الخطأ أيضًا لبعض الأحداث العامة غير المدعومة. .TP \fBENOSPC\fP .\" commit aa2bc1ade59003a379ffc485d6da2d92ea3370a6 قبل لينكس 3.3، إذا لم تكن هناك مساحة كافية للحدث، كان يُعاد \fBENOSPC\fP. في لينكس 3.3، غُيّر هذا إلى \fBEINVAL\fP. لا يزال \fBENOSPC\fP يُعاد إذا حاولت إضافة أحداث نقاط توقف (breakpoint) أكثر مما يدعمه العتاد. .TP \fBENOSYS\fP يُعاد إذا ضُبط \fBPERF_SAMPLE_STACK_USER\fP في \fIsample_type\fP وكان غير مدعوم من قبل العتاد. .TP \fBEOPNOTSUPP\fP يُعاد إذا طُلب حدث يتطلب ميزة عتادية معينة ولكن لا يوجد دعم عتادي لها. يتضمن ذلك طلب أحداث منخفضة الانحراف (low\-skid) إذا كانت غير مدعومة، وتتبع الفروع (branch tracing) إذا لم يكن متاحًا، وأخذ العينات (sampling) إذا لم يتوفر مقاطعة PMU، وكدسات الفروع للأحداث البرمجية. .TP \fBEOVERFLOW\fP (منذ لينكس 4.8) .\" 97c79a38cd454602645f0470ffb444b3b75ce574 يُعاد إذا طُلب \fBPERF_SAMPLE_CALLCHAIN\fP وكان \fIsample_max_stack\fP أكبر من الحد الأقصى المحدد في \fI/proc/sys/kernel/perf_event_max_stack\fP. .TP \fBEPERM\fP يُعاد في العديد من البنى (وليس جميعها) عند تحديد إعداد غير مدعوم لـ \fIexclude_hv\fP أو \fIexclude_idle\fP أو \fIexclude_user\fP أو \fIexclude_kernel\fP. .IP .\" commit a4e95fc2cbb31d70a65beffeaf8773f881328c34 يمكن أن يحدث أيضًا، كما هو الحال مع \fBEACCES\fP، عندما يتطلب الحدث المطلوب صلاحيات \fBCAP_PERFMON\fP (منذ لينكس 5.8) أو \fBCAP_SYS_ADMIN\fP (أو إعداد perf_event paranoid أكثر تسامحًا). يتضمن ذلك تعيين نقطة توقف على عنوان للنواة، و(منذ لينكس 3.13) تعيين نقطة تتبع تتبع وظائف النواة. .TP \fBESRCH\fP يُعاد عند محاولة الارتباط بعملية غير موجودة. .SH المعايير لينكس. .SH التاريخ .\" commit 0793a61d4df8daeac6492dbf8d2f3e5713caae5e .\" commit cdd6c482c9ff9c55475ee7392ec8f672eddb7be6 أُدخلت \fBperf_event_open\fP() في لينكس 2.6.31 ولكن كانت تسمى \fBperf_counter_open\fP(). أُعيدت تسميتها في لينكس 2.6.32. .SH ملاحظات الطريقة الرسمية لمعرفة ما إذا كان دعم \fBperf_event_open\fP() مُمكّنًا هي التحقق من وجود الملف \fI/proc/sys/kernel/perf_event_paranoid\fP. .P توفر قدرة \fBCAP_PERFMON\fP (منذ لينكس 5.8) نهجًا آمنًا لعمليات مراقبة الأداء والقابلية للملاحظة في النظام وفقًا لمبدأ الأقل صلاحية (POSIX IEEE 1003.1e). إن الوصول إلى عمليات مراقبة أداء النظام والقابلية للملاحظة باستخدام \fBCAP_PERFMON\fP بدلاً من \fBCAP_SYS_ADMIN\fP الأكثر قوة بكثير يستبعد فرص إساءة استخدام الاعتمادات ويجعل العمليات أكثر أمانًا. لا يُنصح باستخدام \fBCAP_SYS_ADMIN\fP لمراقبة أداء النظام الآمن والقابلية للملاحظة ويُفضل استخدام قدرة \fBCAP_PERFMON\fP بدلاً منها. .SH العلل .\" commit ba0a6c9f6fceed11c6a99e8326f0477fe383e6b5 خيار \fBF_SETOWN_EX\fP لـ \fBfcntl\fP(2) مطلوب للحصول بشكل صحيح على إشارات التجاوز في الخيوط. أُدخل هذا في لينكس 2.6.32. .P .\" commit b690081d4d3f6a23541493f1682835c3cd5c54a1 قبل لينكس 2.6.33 (على الأقل لـ x86)، لم تكن النواة تتحقق مما إذا كان يمكن جدولة الأحداث معًا حتى وقت القراءة. يحدث الشيء نفسه في جميع النوى المعروفة إذا كان مراقب NMI مُمكّنًا. هذا يعني أنه لرؤية ما إذا كانت مجموعة معينة من الأحداث تعمل، يتعين عليك استدعاء \fBperf_event_open\fP()، والبدء، ثم القراءة قبل أن تعرف بالتأكيد ما إذا كان يمكنك الحصول على قياسات صالحة. .P .\" FIXME . cannot find a kernel commit for this one قبل لينكس 2.6.34، لم تكن قيود الأحداث تُفرض من قبل النواة. في هذه الحالة، كانت بعض الأحداث ستعيد "0" بصمت إذا قامت النواة بجدولتها في فتحة عداد غير مناسبة. .P .\" commit 45e16a6834b6af098702e5ea6c9a40de42ff77d8 قبل لينكس 2.6.34، كانت هناك علة عند تعدد الإرسال حيث يمكن إعادة نتائج خاطئة. .P .\" commit 38b435b16c36b0d863efcf3f07b34a6fac9873fd يمكن للنوى من لينكس 2.6.35 إلى لينكس 2.6.39 أن تنهار بسرعة إذا كان "inherit" مُمكّنًا وبُدئ العديد من الخيوط. .P .\" commit 050735b08ca8a016bbace4445fa025b88fee770b قبل لينكس 2.6.35، لم يكن \fBPERF_FORMAT_GROUP\fP يعمل مع العمليات المرتبطة. .P .\" commit 4ec8363dfc1451f8c8f86825731fe712798ada02 هناك علة في كود النواة بين لينكس 2.6.36 ولينكس 3.0 تتجاهل حقل "watermark" وتتصرف كما لو اختير wakeup_event إذا كان للاتحاد (union) قيمة غير صفرية فيه. .P .\" commit 724b6daa13e100067c30cfc4d1ad06629609dc4e من لينكس 2.6.31 إلى لينكس 3.4، كان معامل ioctl لـ \fBPERF_IOC_FLAG_GROUP\fP معطلاً وكان يعمل بشكل متكرر على الحدث المحدد بدلاً من التكرار عبر جميع الأحداث الشقيقة في مجموعة. .P .\" commit fa7315871046b9a4c48627905691dbde57e51033 من لينكس 3.4 إلى لينكس 3.11، خُصصت بتات mmap لـ \fIcap_usr_rdpmc\fP و \fIcap_usr_time\fP إلى نفس الموقع. يجب أن ينتقل الكود إلى حقول \fIcap_user_rdpmc\fP و \fIcap_user_time\fP الجديدة بدلاً من ذلك. .P .\" commit f287d332ce835f77a4f5077d2c0ef1e3f9ea42d2 تحقق دائمًا من نتائجك مرتين! كانت لعدة أحداث عامة قيم خاطئة. على سبيل المثال، كانت الفروع المتقاعدة (retired branches) تقيس الشيء الخاطئ على أجهزة AMD حتى لينكس 2.6.35. .SH أمثلة فيما يلي مثال قصير يقيس إجمالي عدد التعليمات لاستدعاء لـ \fBprintf\fP(3). .P .\" SRC BEGIN (perf_event_open.c) .EX #include #include #include #include #include #include #include #include #include \& static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu, int group_fd, unsigned long flags) { int ret; \& ret = syscall(SYS_perf_event_open, hw_event, pid, cpu, group_fd, flags); return ret; } \& int main(void) { int fd; long long count; struct perf_event_attr pe; \& memset(&pe, 0, sizeof(pe)); pe.type = PERF_TYPE_HARDWARE; pe.size = sizeof(pe); pe.config = PERF_COUNT_HW_INSTRUCTIONS; pe.disabled = 1; pe.exclude_kernel = 1; pe.exclude_hv = 1; \& fd = perf_event_open(&pe, 0, \-1, \-1, 0); if (fd == \-1) err(EXIT_FAILURE, "Error opening leader %llx\[rs]n", pe.config); \& if (ioctl(fd, PERF_EVENT_IOC_RESET, 0) == \-1) err(EXIT_FAILURE, "PERF_EVENT_IOC_RESET"); if (ioctl(fd, PERF_EVENT_IOC_ENABLE, 0) == \-1) err(EXIT_FAILURE, "PERF_EVENT_IOC_ENABLE"); \& printf("Measuring instruction count for this printf\[rs]n"); \& if (ioctl(fd, PERF_EVENT_IOC_DISABLE, 0) == \-1) err(EXIT_FAILURE, "PERF_EVENT_IOC_DISABLE"); if (read(fd, &count, sizeof(count)) != sizeof(count)) err(EXIT_FAILURE, "read"); \& printf("Used %lld instructions\[rs]n", count); \& if (close(fd) == \-1) err(EXIT_FAILURE, "close"); } .EE .\" SRC END .SH "انظر أيضًا" \fBperf\fP(1), \fBfcntl\fP(2), \fBmmap\fP(2), \fBopen\fP(2), \fBprctl\fP(2), \fBread\fP(2) .P \fIDocumentation/admin\-guide/perf\-security.rst\fP في شجرة مصدر النواة .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .