'\" t .\" Title: sqlhist .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: 01/05/2026 .\" Manual: libtracefs Manual .\" Source: libtracefs 1.8.3 .\" Language: English .\" .TH "SQLHIST" "1" "01/05/2026" "libtracefs 1\&.8\&.3" "libtracefs Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "نام (NAME)" sqlhist \- ابزاری مبتنی بر زبان SQL برای ساخت یا نمایش نحوه ساخت هیستوگرام‌های tracefs و رویدادهای ساختگی\&. .SH "خلاصه دستور (SYNOPSIS)" .sp \fBsqlhist\fR [\fIOPTIONS\fR] [\fISQL\-select\-command\fR] .SH "توضیحات (DESCRIPTION)" .sp ابزار \fBsqlhist\fR(1) یک عبارت مشابه SQL را دریافت کرده تا هیستوگرام‌های tracefs و رویدادهای ساختگی (synthetic events) ایجاد کند که می‌توانند اقدامات مختلفی را برای مدیریت‌های گوناگون داده‌ها به انجام برسانند\&. .sp سیستم‌فایل tracefs با زیرساخت ردگیری لینوکس (Linux tracing) که رویدادهای پویای و ایستای مختلفی در سراسر هسته دارد در تعامل است\&. به هر یک از این رویدادها می‌توان یک «هیستوگرام» متصل کرد، جایی که فیلدهای رویداد دسته‌ها (buckets) هیستوگرام را تعریف می‌کنند\&. .sp یک رویداد ساختگی (synthetic event) روشی برای پیوند دادن دو رویداد مجزا و استفاده از فیلدها و برچسب‌های زمانی آن رویدادها برای ساخت یک رویداد پویای جدید است\&. این رویداد پویای جدید، یک رویداد ساختگی نامیده می‌شود\&. فیلدهای هر رویداد می‌توانند محاسبات ساده‌ای روی خود داشته باشند؛ به عنوان مثال می‌توان مقدار اختلاف (delta) بین یک فیلد از یک رویداد تا فیلدی از رویداد دیگر را به دست آورد\&. این قابلیت برای برچسب‌های زمانی رویدادها نیز کار می‌کند، جایی که اختلاف زمانی بین دو رویداد نیز می‌تواند استخراج شده و درون رویداد ساختگی قرار گیرد\&. .sp اقدامات دیگری نیز بر اساس فیلدهای رویدادها قابل انجام است\&. برای نمونه، هنگامی که یک متغیر استفاده‌شده در ساخت رویداد ساختگی به یک مقدار بیشینه برسد یا صرفاً تغییر کند، می‌توان از بافر حلقوی هسته (kernel ring buffer) یک تصویر لحظه‌ای (snapshot) گرفت\&. .sp دستورات ایجاد هیستوگرام‌ها و رویدادهای ساختگی پیچیده بوده و به‌خاطرسپاری آن‌ها آسان نیست\&. از \fBsqlhist\fR برای تبدیل نحو SQL به دستورات مورد نیاز برای ساخت هیستوگرام یا رویداد ساختگی استفاده می‌شود\&. .sp عبارت \fBSQL\-select\-command\fR یک رشتهٔ SQL است که توسط \fBtracefs_sql\fR(3) تعریف می‌شود\&. .sp توجه داشته باشید که این دستور باید به عنوان کاربر ریشه (یا با sudo) اجرا شود، زیرا تعامل با دایرکتوری tracefs نیازمند دسترسی کاربر ریشه است، مگر اینکه گزینهٔ \fB\-t\fR به همراه رونوشتی از دایرکتوری \fItracefs\fR و رویدادهای آن داده شود\&. .sp ابزار \fBsqlhist\fR یک برنامه ساده است که کد آن در واقع در صفحه راهنمای \fBtracefs_sql\fR(3) قرار دارد\&. .SH "گزینه‌ها (OPTIONS)" .PP \fB\-n\fR \fIname\fR .RS 4 نام رویداد ساختگی که باید ایجاد شود\&. سپس می‌توان از این رویداد مانند هر رویداد دیگری استفاده کرد و آن را از طریق \fBtrace\-cmd\fR(1) فعال نمود\&. .RE .PP \fB\-t\fR \fItracefs\-dir\fR .RS 4 به‌منظور آزمایش این ابزار به عنوان کاربر غیر ریشه، می‌توان از یک رونوشت از دایرکتوری tracefs استفاده کرد و ارسال آن دایرکتوری با این گزینه امکان کارکرد برنامه را فراهم می‌کند\&. بدیهی است که گزینهٔ \fB\-e\fR برای کاربر غیر ریشه کار نخواهد کرد، زیرا قادر به اجرا نخواهد بود\&. .sp .if n \{\ .RS 4 .\} .nf # mkdir /tmp/tracing # cp \-r /sys/kernel/tracing/events /tmp/tracing # exit $ \&./sqlhist \-t /tmp/tracing \&.\&.\&. .fi .if n \{\ .RE .\} .RE .PP \fB\-e\fR .RS 4 نه تنها دستورات مربوط به ساخت هیستوگرام را نمایش می‌دهد، بلکه آن‌ها را اجرا نیز می‌کند\&. این کار نیازمند دسترسی کاربر ریشه است\&. .RE .PP \fB\-f\fR \fIfile\fR .RS 4 به جای خواندن دستورات SQL از خط فرمان، آن‌ها را از \fIfile\fR می‌خواند\&. اگر \fIfile\fR برابر با \fI\-\fR باشد، دستورات از ورودی استاندارد خوانده می‌شوند\&. .RE .PP \fB\-m\fR \fIvar\fR .RS 4 هنگامی که متغیر \fIvar\fR به یک مقدار بیشینهٔ جدید برسد، اقدام داده‌شده را انجام می‌دهد\&. این گزینه همراه با \fB\-c\fR قابل استفاده نیست\&. .RE .PP \fB\-c\fR \fIvar\fR .RS 4 هنگامی که مقدار متغیر \fIvar\fR تغییر کند، اقدام داده‌شده را انجام می‌دهد\&. این گزینه همراه با \fB\-m\fR قابل استفاده نیست\&. .RE .PP \fB\-s\fR .RS 4 به جای فراخوانی رویداد ساختگی، یک تصویر لحظه‌ای (snapshot) تهیه می‌کند\&. .RE .PP \fB\-T\fR .RS 4 هم یک تصویر لحظه‌ای تهیه می‌کند و هم رویداد ساختگی را ردگیری می‌نماید\&. .RE .PP \fB\-S\fR \fIfields[,fields]\fR .RS 4 فیلدهای داده‌شده را ذخیره می‌کند\&. فیلدها باید فیلدهایی از رویداد «پایانی» مشخص‌شده در \fBSQL\-select\-command\fR باشند\&. .RE .PP \fB\-B\fR \fIinstance\fR .RS 4 برای عبارت‌های ساده‌ای که فقط یک هیستوگرام تولید می‌کنند، نمونهٔ (instance) مشخص‌شده در اینجا مکانی خواهد بود که هیستوگرام در آن ایجاد می‌شود\&. این مقدار در فرآیند کامل ساخت رویداد ساختگی نادیده گرفته می‌شود، زیرا رویدادهای ساختگی تأثیری سراسری روی تمام نمونه‌های ردگیری دارند، در حالی که هیستوگرام‌ها فقط بر یک نمونه تأثیر می‌گذارند\&. .RE.SH "مثال‌ها (EXAMPLES)" .sp ایجاد فایل اجرایی sqlhist: .sp .if n \{\ .RS 4 .\} .nf man tracefs_sql | sed \-ne \*(Aq/^EXAMPLE/,/FILES/ { /EXAMPLE/d ; /FILES/d ; p}\*(Aq > sqlhist\&.c gcc \-o sqlhist sqlhist\&.c `pkg\-config \-\-cflags \-\-libs libtracefs` .fi .if n \{\ .RE .\} .sp همان‌طور که در بالا توضیح داده شد، برای اهداف آزمایشی، یک رونوشت از دایرکتوری رویدادها ایجاد کنید: .sp .if n \{\ .RS 4 .\} .nf $ mkdir /tmp/tracing $ sudo cp \-r /sys/kernel/tracing/events /tmp/tracing/ $ sudo chmod \-R 0644 /tmp/tracing/ .fi .if n \{\ .RE .\} .sp برای نمونه‌ای از خروجی ساده هیستوگرام با استفاده از رونوشت دایرکتوری tracefs\&. .sp .if n \{\ .RS 4 .\} .nf $ \&./sqlhist \-t /tmp/tracing/ \*(AqSELECT CAST(call_site as SYM\-OFFSET), bytes_req, CAST(bytes_alloc AS _COUNTER_) FROM kmalloc\*(Aq .fi .if n \{\ .RE .\} .sp خروجی زیر را تولید می‌کند: .sp .if n \{\ .RS 4 .\} .nf echo \*(Aqhist:keys=call_site\&.sym\-offset,bytes_req:vals=bytes_alloc\*(Aq > /sys/kernel/tracing/events/kmem/kmalloc/trigger .fi .if n \{\ .RE .\} .sp که می‌تواند توسط ریشه (root) استفاده شود: .sp .if n \{\ .RS 4 .\} .nf # echo \*(Aqhist:keys=call_site\&.sym\-offset,bytes_req:vals=bytes_alloc\*(Aq > /sys/kernel/tracing/events/kmem/kmalloc/trigger # cat /sys/kernel/tracing/events/kmem/kmalloc/hist # event histogram # # trigger info: hist:keys=call_site\&.sym\-offset,bytes_req:vals=hitcount,bytes_alloc:sort=hitcount:size=2048 [active] # { call_site: [ffffffff813f8d8a] load_elf_phdrs+0x4a/0xb0 , bytes_req: 728 } hitcount: 1 bytes_alloc: 1024 { call_site: [ffffffffc0c69e74] nf_ct_ext_add+0xd4/0x1d0 [nf_conntrack] , bytes_req: 128 } hitcount: 1 bytes_alloc: 128 { call_site: [ffffffff818355e6] dma_resv_get_fences+0xf6/0x440 , bytes_req: 8 } hitcount: 1 bytes_alloc: 8 { call_site: [ffffffffc06dc73f] intel_gt_get_buffer_pool+0x15f/0x290 [i915] , bytes_req: 424 } hitcount: 1 bytes_alloc: 512 { call_site: [ffffffff813f8d8a] load_elf_phdrs+0x4a/0xb0 , bytes_req: 616 } hitcount: 1 bytes_alloc: 1024 { call_site: [ffffffff8161a44c] __sg_alloc_table+0x11c/0x180 , bytes_req: 32 } hitcount: 1 bytes_alloc: 32 { call_site: [ffffffffc070749d] shmem_get_pages+0xad/0x5d0 [i915] , bytes_req: 16 } hitcount: 1 bytes_alloc: 16 { call_site: [ffffffffc07507f5] intel_framebuffer_create+0x25/0x60 [i915] , bytes_req: 408 } hitcount: 1 bytes_alloc: 512 { call_site: [ffffffffc06fc20f] eb_parse+0x34f/0x910 [i915] , bytes_req: 408 } hitcount: 1 bytes_alloc: 512 { call_site: [ffffffffc0700ebd] i915_gem_object_get_pages_internal+0x5d/0x270 [i915] , bytes_req: 16 } hitcount: 1 bytes_alloc: 16 { call_site: [ffffffffc0771188] intel_frontbuffer_get+0x38/0x220 [i915] , bytes_req: 400 } hitcount: 1 bytes_alloc: 512 { call_site: [ffffffff8161a44c] __sg_alloc_table+0x11c/0x180 , bytes_req: 128 } hitcount: 1 bytes_alloc: 128 { call_site: [ffffffff813f8f45] load_elf_binary+0x155/0x1680 , bytes_req: 28 } hitcount: 1 bytes_alloc: 32 { call_site: [ffffffffc07038c8] __assign_mmap_offset+0x208/0x3d0 [i915] , bytes_req: 288 } hitcount: 1 bytes_alloc: 512 { call_site: [ffffffff813737b2] alloc_bprm+0x32/0x2f0 , bytes_req: 416 } hitcount: 1 bytes_alloc: 512 { call_site: [ffffffff813f9027] load_elf_binary+0x237/0x1680 , bytes_req: 64 } hitcount: 1 bytes_alloc: 64 { call_site: [ffffffff8161a44c] __sg_alloc_table+0x11c/0x180 , bytes_req: 64 } hitcount: 1 bytes_alloc: 64 { call_site: [ffffffffc040ffe7] drm_vma_node_allow+0x27/0xe0 [drm] , bytes_req: 40 } hitcount: 2 bytes_alloc: 128 { call_site: [ffffffff813cda98] __do_sys_timerfd_create+0x58/0x1c0 , bytes_req: 336 } hitcount: 2 bytes_alloc: 1024 { call_site: [ffffffff818355e6] dma_resv_get_fences+0xf6/0x440 , bytes_req: 40 } hitcount: 2 bytes_alloc: 128 { call_site: [ffffffff8139b75a] single_open+0x2a/0xa0 , bytes_req: 32 } hitcount: 2 bytes_alloc: 64 { call_site: [ffffffff815df715] bio_kmalloc+0x25/0x80 , bytes_req: 136 } hitcount: 2 bytes_alloc: 384 { call_site: [ffffffffc071e5cd] i915_vma_work+0x1d/0x50 [i915] , bytes_req: 416 } hitcount: 3 bytes_alloc: 1536 { call_site: [ffffffff81390d0d] alloc_fdtable+0x4d/0x100 , bytes_req: 56 } hitcount: 3 bytes_alloc: 192 { call_site: [ffffffffc06ff65f] i915_gem_do_execbuffer+0x158f/0x2440 [i915] , bytes_req: 16 } hitcount: 4 bytes_alloc: 64 { call_site: [ffffffff8137713c] alloc_pipe_info+0x5c/0x230 , bytes_req: 384 } hitcount: 5 bytes_alloc: 2560 { call_site: [ffffffff813771b4] alloc_pipe_info+0xd4/0x230 , bytes_req: 640 } hitcount: 5 bytes_alloc: 5120 { call_site: [ffffffff81834cdb] dma_resv_list_alloc+0x1b/0x40 , bytes_req: 40 } hitcount: 6 bytes_alloc: 384 { call_site: [ffffffff81834cdb] dma_resv_list_alloc+0x1b/0x40 , bytes_req: 56 } hitcount: 9 bytes_alloc: 576 { call_site: [ffffffff8120086e] tracing_map_sort_entries+0x9e/0x3e0 , bytes_req: 24 } hitcount: 60 bytes_alloc: 1920 Totals: Hits: 122 Entries: 30 Dropped: 0 .fi .if n \{\ .RE .\} .sp توجه داشته باشید، اگرچه مثال‌ها از حروف بزرگ برای کلیدواژه‌های SQL استفاده می‌کنند، اما الزامی به این کار نیست\&. \fISELECT\fR می‌تواند \fIselect\fR یا حتی \fIsElEcT\fR نیز باشد\&. .sp با استفاده از زبان کامل SQL، رویدادهای ساختگی (synthetic events) را می‌توان ایجاد و پردازش کرد\&. به عنوان مثال، با استفاده از \fBsqlhist\fR در کنار \fBtrace\-cmd\fR(1)، تاخیر بیدارباش (wake up latency) می‌تواند با ایجاد یک رویداد ساختگی از طریق پیوند دادن رویدادهای \fIsched_waking\fR و \fIsched_switch\fR ثبت شود\&. .sp .if n \{\ .RS 4 .\} .nf # sqlhist \-n wakeup_lat \-e \-T \-m lat \*(AqSELECT end\&.next_comm AS comm, (end\&.TIMESTAMP_USECS \- start\&.TIMESTAMP_USECS) AS lat FROM \*(Aq \e \*(Aqsched_waking AS start JOIN sched_switch AS end ON start\&.pid = end\&.next_pid WHERE end\&.next_prio < 100 && end\&.next_comm == "cyclictest"\*(Aq # trace\-cmd start \-e all \-e wakeup_lat \-R stacktrace # cyclictest \-l 1000 \-p80 \-i250 \-a \-t \-q \-m \-d 0 \-b 1000 \-\-tracemark # trace\-cmd show \-s | tail \-30 \-0 [002] dNh4 23454\&.902246: sched_wakeup: comm=cyclictest pid=12272 prio=120 target_cpu=002 \-0 [005] \&.\&.\&.1 23454\&.902246: cpu_idle: state=4294967295 cpu_id=5 \-0 [007] d\&.\&.1 23454\&.902246: cpu_idle: state=0 cpu_id=7 \-0 [002] dNh1 23454\&.902247: hrtimer_expire_exit: hrtimer=0000000037956dc2 \-0 [005] d\&.\&.1 23454\&.902248: cpu_idle: state=0 cpu_id=5 \-0 [002] dNh1 23454\&.902248: write_msr: 6e0, value 4866ce957272 \-0 [006] \&.\&.\&.1 23454\&.902248: cpu_idle: state=4294967295 cpu_id=6 \-0 [002] dNh1 23454\&.902249: local_timer_exit: vector=236 \-0 [006] d\&.\&.1 23454\&.902250: cpu_idle: state=0 cpu_id=6 \-0 [002] \&.N\&.1 23454\&.902250: cpu_idle: state=4294967295 cpu_id=2 \-0 [002] dN\&.1 23454\&.902251: rcu_utilization: Start context switch \-0 [002] dN\&.1 23454\&.902252: rcu_utilization: End context switch \-0 [001] \&.\&.\&.1 23454\&.902252: cpu_idle: state=4294967295 cpu_id=1 \-0 [002] dN\&.3 23454\&.902253: prandom_u32: ret=3692516021 \-0 [001] d\&.\&.1 23454\&.902254: cpu_idle: state=0 cpu_id=1 \-0 [002] d\&.\&.2 23454\&.902254: sched_switch: prev_comm=swapper/2 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=cyclictest next_pid=12275 next_prio=19 \-0 [002] d\&.\&.4 23454\&.902256: wakeup_lat: next_comm=cyclictest lat=17 \-0 [002] d\&.\&.5 23454\&.902258: => trace_event_raw_event_synth => action_trace => event_hist_trigger => event_triggers_call => trace_event_buffer_commit => trace_event_raw_event_sched_switch => __traceiter_sched_switch => __schedule => schedule_idle => do_idle => cpu_startup_entry => secondary_startup_64_no_verify .fi .if n \{\ .RE .\} .sp در اینجا گزینه‌های \fBsqlhist\fR توضیح داده شده‌اند: .PP \fB\-n wakeup_lat\fR .RS 4 نام‌گذاری رویداد ساختگی مورد استفاده به \fBwakeup_lat\fR\&. .RE .PP \fB\-e\fR .RS 4 اجرای دستوراتی که چاپ می‌شوند\&. .RE .PP \fB\-T\fR .RS 4 انجام هم‌زمان یک عمل trace و سپس یک عمل snapshot (جابجایی بافر به بافر ایستان \fIsnapshot\fR)\&. .RE .PP \fB\-m lat\fR .RS 4 راه‌اندازی (trigger) این اعمال هر زمان که \fIlat\fR به یک مقدار بیشینه جدید برسد\&. .RE .sp اکنون بررسی بخش‌های دستور SQL: .sp .if n \{\ .RS 4 .\} .nf \*(AqSELECT end\&.next_comm AS comm, (end\&.TIMESTAMP_USECS \- start\&.TIMESTAMP_USECS) AS lat FROM \*(Aq \e \*(Aqsched_waking AS start JOIN sched_switch AS end ON start\&.pid = end\&.next_pid WHERE end\&.next_prio < 100 && end\&.next_comm == "cyclictest"\*(Aq .fi .if n \{\ .RE .\} .PP \fBend\&.next_comm AS comm\fR .RS 4 ذخیره فیلد \fBnext_comm\fR از \fIsched_switch\fR و قرار دادن آن در فیلد \fBcomm\fR از رویداد ساختگی \fIwakeup_lat\fR\&. .RE.PP \fB(end\&.TIMESTAMP_USECS \- start\&.TIMESTAMP_USECS) AS lat\fR .RS 4 اختلاف برچسب‌های زمانی را از رویداد \fIsched_switch\fR و رویداد \fIsched_waking\fR محاسبه می‌کند\&. از آن‌جا که برچسب‌های زمانی معمولاً بر حسب نانوثانیه ثبت می‌شوند، \fBTIMESTAMP\fR برچسب زمانی کامل به نانوثانیه را ارائه می‌دهد، اما در اینجا، \fBTIMESTAMP_USECS\fR آن را به میکروثانیه کوتاه (truncate) می‌کند\&. این مقدار در متغیر \fBlat\fR ذخیره می‌شود، که در رویداد ترکیبی (synthetic event) نیز ثبت خواهد شد\&. .RE .PP \fBFROM \fR\fB\fIsched_waking\fR\fR\fB AS start JOIN sched_switch AS end ON start\&.pid = end\&.next_pid\fR .RS 4 با پیوند دادن (JOIN) \fIsched_waking\fR به \fIsched_switch\fR، رویداد ترکیبی را ایجاد می‌کند و فیلد \fIpid\fR از \fIsched_waking\fR را با فیلد \fInext_pid\fR از \fIsched_switch\fR تطبیق می‌دهد\&. همچنین \fBstart\fR را نام مستعاری برای \fIsched_waking\fR و \fBend\fR را نام مستعاری برای \fIsched_switch\fR قرار می‌دهد، تا بتوان در ادامهٔ عبارت SQL از \fBstart\fR و \fBend\fR به ترتیب به عنوان جایگزینی برای \fIsched_waking\fR و \fIsched_switch\fR استفاده کرد\&. .RE .PP \fBWHERE end\&.next_prio < 100 && end\&.next_comm == "cyclictest"\fR .RS 4 منطق را طوری فیلتر می‌کند که فقط در صورتی اجرا شود که فیلد \fInext_prio\fR از \fIsched_waking\fR کمتر از ۱۰۰ باشد\&. (توجه داشته باشید که در هسته، اولویت‌ها معکوس هستند و اولویت‌های بی‌درنگ از ۰ تا ۱۰۰ نشان داده می‌شوند که در آن ۰ بالاترین اولویت است)\&. همچنین تنها زمانی ردگیری انجام می‌شود که \fInext_comm\fR (وظیفه‌ای که زمان‌بندی شده و به اجرا درمی‌آید) از رویداد \fIsched_switch\fR نام "cyclictest" را داشته باشد\&. .RE .sp برای دستور \fBtrace\-cmd\fR(3): .sp .if n \{\ .RS 4 .\} .nf trace\-cmd start \-e all \-e wakeup_lat \-R stacktrace .fi .if n \{\ .RE .\} .PP \fBtrace\-cmd start\fR .RS 4 ردگیری را فعال می‌کند (در فایل ذخیره نمی‌کند)\&. .RE .PP \fB\-e all\fR .RS 4 تمام رویدادها را فعال می‌کند\&. .RE .PP \fB\-e wakeup_lat \-R stacktrace\fR .RS 4 باعث می‌شود رویداد "wakeup_lat" (رویداد ترکیبی ما) تریگر (trigger) \fBstacktrace\fR را فعال کند، به طوری که به ازای هر نمونه از رویداد "wakeup_lat"، یک رد پشتهٔ هسته (kernel stack trace) در بافر حلقه‌ای (ring buffer) ثبت خواهد شد\&. .RE .sp پس از فراخوانی \fBcyclictest\fR (یک ابزار بی‌درنگ برای اندازه‌گیری تأخیر بیدارباش)، بافر تصویر لحظه‌ای (snapshot) را بخوانید\&. .PP \fBtrace\-cmd show \-s\fR .RS 4 دستور \fBtrace\-cmd show\fR بافر حلقه‌ای هسته را می‌خواند، و گزینهٔ \fB\-s\fR به جای بافر معمولی، بافر \fBsnapshot\fR را می‌خواند\&. .RE .sp .if n \{\ .RS 4 .\} .nf \-0 [002] d\&.\&.4 23454\&.902256: wakeup_lat: next_comm=cyclictest lat=17 .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf می‌بینیم که رویداد "wakeup_lat" روی CPU 2 با تأخیر بیدارباش ۱۷ میکروثانیه رخ داده است\&. .fi .if n \{\ .RE .\} .sp این را می‌توان در یک فایل \fBtrace\&.dat\fR استخراج کرد که \fBtrace\-cmd\fR(3) و همچنین \fBkernelshark\fR بتوانند آن را بخوانند و تحلیل‌های بیشتری انجام دهند\&. .sp .if n \{\ .RS 4 .\} .nf # trace\-cmd extract \-s # trace\-cmd report \-\-cpu 2 | tail \-30 \-0 [002] 23454\&.902238: prandom_u32: ret=1633425088 \-0 [002] 23454\&.902239: sched_wakeup: cyclictest:12275 [19] CPU:002 \-0 [002] 23454\&.902241: hrtimer_expire_exit: hrtimer=0xffffbbd68286fe60 \-0 [002] 23454\&.902241: hrtimer_cancel: hrtimer=0xffffbbd6826efe70 \-0 [002] 23454\&.902242: hrtimer_expire_entry: hrtimer=0xffffbbd6826efe70 now=23455294430750 function=hrtimer_wakeup/0x0 \-0 [002] 23454\&.902243: sched_waking: comm=cyclictest pid=12272 prio=120 target_cpu=002 \-0 [002] 23454\&.902244: prandom_u32: ret=1102749734 \-0 [002] 23454\&.902246: sched_wakeup: cyclictest:12272 [120] CPU:002 \-0 [002] 23454\&.902247: hrtimer_expire_exit: hrtimer=0xffffbbd6826efe70 \-0 [002] 23454\&.902248: write_msr: 6e0, value 4866ce957272 \-0 [002] 23454\&.902249: local_timer_exit: vector=236 \-0 [002] 23454\&.902250: cpu_idle: state=4294967295 cpu_id=2 \-0 [002] 23454\&.902251: rcu_utilization: Start context switch \-0 [002] 23454\&.902252: rcu_utilization: End context switch \-0 [002] 23454\&.902253: prandom_u32: ret=3692516021 \-0 [002] 23454\&.902254: sched_switch: swapper/2:0 [120] R ==> cyclictest:12275 [19] \-0 [002] 23454\&.902256: wakeup_lat: next_comm=cyclictest lat=17 \-0 [002] 23454\&.902258: kernel_stack: => trace_event_raw_event_synth (ffffffff8121a0db) => action_trace (ffffffff8121e9fb) => event_hist_trigger (ffffffff8121ca8d) => event_triggers_call (ffffffff81216c72) => trace_event_buffer_commit (ffffffff811f7618) => trace_event_raw_event_sched_switch (ffffffff8110fda4) => __traceiter_sched_switch (ffffffff8110d449) => __schedule (ffffffff81c02002) => schedule_idle (ffffffff81c02c86) => do_idle (ffffffff8111e898) => cpu_startup_entry (ffffffff8111eba9) => secondary_startup_64_no_verify (ffffffff81000107) .fi .if n \{\ .RE .\}.SH "گزارش باگ‌ها (BUGS)" .sp از آنجا که \fBsqlhist\fR صرفاً یک کد نمونه از یک صفحه man است، قطعاً حاوی باگ‌های زیادی خواهد بود\&. از جمله این‌که تمامی مسیرهای خطا به‌درستی پوشش داده نشده‌اند\&. .SH "همچنین ببینید (SEE ALSO)" .sp trace\-cmd(1), tracefs_sql(3) .SH "نویسندگان (AUTHORS)" .sp نوشته‌شده توسط Steven Rostedt، <\m[blue]\fBrostedt@goodmis\&.org\fR\m[]\&\s-2\u[1]\d\s+2> .SH "منابع (RESOURCES)" .sp \m[blue]\fBhttps://git\&.kernel\&.org/pub/scm/utils/trace\-cmd/trace\-cmd\&.git\fR\m[] .SH "کپی‌رایت و تکثیر (COPYING)" .sp کپی‌رایت (C) 2021 , Inc\&. استفاده آزاد از این نرم‌افزار تحت شرایط مجوز عمومی گنو (GPL) مجاز است\&. .SH "نکات (NOTES)" .IP " 1." 4 rostedt@goodmis.org .RS 4 \%mailto:rostedt@goodmis.org .RE