آشنایی با نحوهٔ استفاده از دستور top در لینوکس


گرچه دیدن نمایی استاتیک (ایستا) از اتفاقاتی که در سیستم در حال رخ دادن هستند مفید است، اما گاهی‌اوقات نیار داریم تا به صورت Real-time (در لحظه) پرفورمنس و عملکرد سیستم خود را مانیتور کنیم. یک راه‌کار این است که هر چند دقیقه یک‌بار، دستور ps را اجرا کرده و خروجی را مشاهده کنیم که به نظر کاری خسته‌کننده می‌رسد اما راه‌کار به مراتب بهتر و بهینه‌تر استفاده از ابزاری تحت عنوان top است که به صورت پیش‌فرض خروجی آن هر ۲ ثانیه آپدیت می‌شود و این کار تا زمانی ادامه می‌یابد که کاربر دکمهٔ q را بفشارد:

$ top

top - 12:07:11 up 15:17,  1 user,  load average: 0.20, 0.61, 0.63
Tasks: 218 total,   1 running, 217 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.3 us,  1.3 sy,  0.0 ni, 97.2 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4004584 total,   255616 free,  2185616 used,  1563352 buff/cache
KiB Swap:  4152316 total,  4100468 free,    51848 used.   993444 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                   
 1154 root      20   0  672812 110796  64872 S   1.0  2.8  12:52.79 Xorg                                                                                                                                      
11949 behzadm+  20   0  959456 159064  74728 S   0.7  4.0   6:02.19 chrome                                                                                                                                    
13465 behzadm+  20   0  686456  38428  29264 S   0.7  1.0   0:07.34 gnome-terminal-                                                                                                                           
16944 behzadm+  20   0   45884   4332   3580 R   0.7  0.1   0:00.12 top       
.
.
.                                                                                                                                
 1694 behzadm+  20   0 1257796  97784  35056 S   0.3  2.4  15:49.34 compiz                                                                                                                                    
 2089 behzadm+  20   0 2391612 250956  59040 S   0.3  6.3   2:21.34 thunderbird                                                                                                                               
16630 root      20   0       0      0      0 S   0.3  0.0   0:01.03 kworker/1:1                                                                                                                               
    1 root      20   0  205184   6856   5116 S   0.0  0.2   0:03.36 systemd                                                                                                                                   
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd                                                                                                                                  
    4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                                                                                              
    6 root      20   0       0      0      0 S   0.0  0.0   0:02.79 ksoftirqd/0                                                                                                                               
    7 root      20   0       0      0      0 S   0.0  0.0   0:19.0

ابزار دیگری در اکثر توزیع‌های لینوکسی وجود دارد تحت عنوان htop که نسخه‌ای پیشرفته‌تر از ابزار top است که از طریق دستور زیر می‌توان آن را نصب کرد:

sudo apt-get install htop

حال به سادگی با تایپ کامند htop در ترمینال و اینتر کردن، می‌توانیم وارد این برنامه شویم:

  
1  [|||||||||||                 5.9%]    Tasks: 154, 3 thr; 1 running
2  [||||||                      2.3%]    Load average: 0.11 0.50 0.65
Mem[|||||||||||          3.36G/3.82G]    Uptime: 18:01:52
Swp [||||                 707M/3.96G]     

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 1259 root       20   0 25660  1880  1368 R  0.0  0.2  0:00.06 htop
    1 root       20   0 24188  2120  1300 S  0.0  0.2  0:00.56 /sbin/init

در یک نگاه کلی، کامند top مشخص می‌سازد که کدام‌یک از پروسه‌ها بیشترین میزان مموری و سی‌پی‌یو را استفاده می‌کنند که با این اطلاعات، به سادگی می‌توان به پروسه‌هایی که دیگر به آنها نیاز نداریم پایان دهیم اما برای این کار، بایستی با اطلاعاتی که کامند top در اختیار ما قرار می‌دهد به خوبی آشنایی داشته باشیم که در ادامه به تفسیر خروجی این کامند خواهیم پرداخت.

بررسی اولین خط از خروجی کامند top
به طور کلی، اولین خط از خروجی کامند top خلاصه‌ای از آنچه در سیستم در حال رخ دادن است را در معرض دیدمان قرار می‌دهد که عبارت است از:
- برای چه مدت سیستم روشن بوده است
- چند کاربر لاگین کرده‌اند
- میزان میانگین لود سیستم چه‌قدر است (به عبارت دیگر، چه‌قدر سیستم درگیر است.)

top - 12:07:11 up 15:17,  1 user,  load average: 0.20, 0.61, 0.63

در واقع، میانگین بار (Load Avarage) معادل با 1.00 در هر CPU نشانگر سیستمی است که بار زیادی روی آن نیست و این در حالی است که اگر این مقدار بیش از 1.00 باشد، این مسئله حاکی از آن است که سیستم با کمبود CPU مواجه شده و هر پروسه‌ای برای اختصاص سهم بیشتر به خود در تلاش است و اگر هم این مؤلفه بسیار بالا باشد، این نشان از وجود مشکلی در سیستم دارد (مثلاً پروسه‌ای که هنگ کرده است). 

بررسی دومین خط از خروجی کامند top
دومین خط از خروجی کامند top نشانگر تعداد کل پروسه‌ها، تعداد پروسه‌های فعال، پروسه‌های در حال انتظار، پروسه‌های متوقف شده و حتی پروسه‌های زامبی است که در آموزش‌های گذشته با مفهوم آن آشنا شدیم:

Tasks: 218 total,   1 running, 217 sleeping,   0 stopped,   0 zombie

در واقع، مقایسهٔ تعداد پروسه‌های در حال اجرا با میانگین بار (Load Avarage) روی سیستم می‌تواند در درک اینکه آیا از تمام ظرفیت سیستم استفاده می‌شود یا خیر و حتی درک این مسئله که آیا کاربری بیش از حد از منابع سیستم استفاده می‌کند یا نه مفید واقع گردد.

بررسی سومین خط از خروجی کامند top
سومین خط از خروجی دستور top نشانگر این است که ظرفیت CPU چگونه مابین کاربران مختلف (us) و کِرنِل (sy) تقسیم شده است که این مقادیر به صورت درصدی نمایش داده می‌شوند:

%Cpu(s):  1.3 us,  1.3 sy,  0.0 ni, 97.2 id,  0.2 wa,  0.0 hi,  0.0 si,  0.0 st

همچنین همان‌طور که در خروجی فوق مشخص است، میزان Nice Value که در آموزش‌های گذشته با آن آشنا شدیم نیز آمده است که با ni مشخص شده است. هرچه میزان Load Avarage بالاتر باشد، میزان Idle Mode یا به اختصار id بایستی پایین باشد و بالعکس.

نکته
Idle مفهومی است که علاوه بر سنجش پروسه‌ها، برای کاهش مصرف انرژی نیز به کار می‌رود. در واقع، آیدل یک تِرِدی است که در کِرنِل لینوکس تعبیه شده است و زمانی اجرا می‌شود که هیچ پروسه‌ای در CPU فعال نباشد. به عبارت دیگر، وقتی که برنامه‌ای روی سیستم‌عامل اجرا می‌شود، بخشی از CPU را اشغال می‌کند؛ حال اگر هیچ برنامه‌ای برای اجرا وجود نداشته باشد، Idle منجر به کاهش سرعت کلاک CPU و کاهش برق مصرفی شده و برخی بخش‌های CPU اصطلاحاً در حالت خواب قرار می‌گیرند (به طور خلاصه، منظور از CPU Clock Rate که برحسب GHz سنجیده می‌شود این است که یک در حالت در هر ثانیه چند عملیات می‌تواند انجام دهد؛ به طور مثال، یک سی‌پی‌یو 1.8 گیگاهرتزی در هر ثانیه می‌تواند 1800000000 عملیات محاسباتی انجام دهد). 

در ضمن، میزان پروسه‌های در حال انتظار (wa) برای I/O (ورودی/خروجی) نیز لیست شده است. داده‌های دیگری مرتبط با Hardware Interrupt و Software Interrup هم لیست شده که به ترتیب با hi و si نمایش داده شده‌اند. در ادامه هم مفهوم دیگری تحت عنوان Steal Time یا به اختصار st نمایش داده شده که عموماً زمانی استفاده می‌شود که از ماشین مجازی (Virtual Machine) استفاده می‌شود به طوری که اگر کاربری از ظرفیت Idle CPU ماشین مجازی استفاده کند، مقدار آن درج خواهد شد.

بررسی چهارمین و پنجمین خط از خروجی کامند top
خطوط چهارم و پنجم از خروجی کامند top هم میزان استفاده از مموری را نشان می‌دهند که به ۲ دستهٔ مجزا تقسیم می‌شوند:
- مموری فیزیکی (RAM) که در خط چهارم نمایش داده می‌شود
- فضای Swap که در خط پنجم نمایش داده می‌شود

هر ۲ خط نشانگر میزان کل حافظه، میزان حافظهٔ آزاد و حافظهٔ استفاده شده بر اساس KiB (کیلوبایت) هستند. به طور کلی، اگر بخواهید از پرفورمنس حد اعلای سیستم اطمینان حاصل کنید، می‌بایست بادقت میزان استفاده‌ای که از حافظه می‌شود را رصد کنید:

KiB Mem :  4004584 total,   255616 free,  2185616 used,  1563352 buff/cache
KiB Swap:  4152316 total,  4100468 free,    51848 used.   993444 avail Mem 

در واقع، زمانی که کل حافظهٔ RAM استفاده شود، سیستم شروع به استفاده از حافظهٔ Swap می‌کند اما از آنجا که دسترسی به حافظهٔ Swap به مراتب کُندتر از RAM است، پرفورمنس سیستم به طرز قابل‌توجهی پایین می‌آید.

به خاطر داشته باشید
فضای Swap به بخشی از هارددیسک گفته می‌شود که در حین نصب سیستم‌عامل گنو/لینوکس توسط کاربر مشخص می‌شود، مثلاً ۴ گیگابایت، تا در صورت مواجه با کمبود مموری، سیستم به استفاده از فضای در نظر گرفته شده به جای RAM بپردازد.

در نظر داشته باشیم که اگر سیستم به دفعات زیاد اقدام به استفاده از حافظهٔ Swap کند، این نشان از کمبود رَم سیستم دارد که در صورت امکان با افزایش رَم می‌توان این مشکل را برطرف کرد اما در عین حال اگر هم امکان افزایش رَم نباشد، مثلاً در برخی لپ‌تاپ‌های قدیمی کاربر نهایتاً می‌تواند ۴ گیگابایت حافظهٔ فیزیکی (RAM) داشته باشد، می‌توان حافظهٔ Swap را افزایش داد.

بررسی لیست پروسه‌های نشان داده شده توسط کامند top
پس از پنجمین خط از خروجی دستور top، لیست پروسه‌های فعال در سیستم نمایش داده می‌شود و به صورت پیش‌فرض، پروسه‌ها بر اساس بیشترین میزان استفاده از CPU لیست شده‌اند:


  PID   USER     PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                   
 1154 root     20   0  672812 110796  64872 S   1.0  2.8  12:52.79 Xorg                                                                                                                                      
11949 behzadm+ 20   0  959456 159064  74728 S   0.7  4.0   6:02.19 chrome                                                                                                                                    
13465 behzadm+ 20   0  686456  38428  29264 S   0.7  1.0   0:07.34 gnome-terminal-                                                                                                                           
16944 behzadm+ 20   0   45884   4332   3580 R   0.7  0.1   0:00.12 top      

علاوه بر این، همان‌طور که در خروجی فوق مشخص است اطلاعات زیر برای هر پروسه در معرض دید کاربر قرار خواهند گرفت:
- شناسهٔ پروسه (PID)
- کاربری که شناسه متعلق به آن است (USER)
- PR و NI که به ترتیب برای نشان دادن Priority و Nice Value هستند
- حافظهٔ مجازی (VIRT)، حافظهٔ فیزیکی (RES) و حافظهٔ مشترک (SHR)
- وضعیت (S)
- درصد استفاده از سی‌پی‌یو (CPU%) و مموری (MEM%)
- مدت زمان اجرای پروسه (+TIME)
- کامند (COMMAND)

نحوهٔ استفاده از کلیدهای تعاملی در کامند top
علاوه بر گزارش‌دهی، ابزار top را می‌توان به صورت تعاملی برای مانیتور کردن و کنترل پروسه‌ها نیز مورد استفاده قرار داد. گرچه پس از وارد کردن کامند top در ترمینال و فشردن دکمهٔ اینتر این برنامه اجرا می‌شود، اما برای تعامل با این برنامه کاربران می‌توانند دستوراتی از پیش تعریف شده را وارد کنند و در نحوهٔ کار این ابزار تغییر ایجاد کنند و به نوعی آن را برای خود کاستومایز کنند.

برای مثال، کاربران می‌توانند با کلیدهای تعاملی top، پروسه‌ها را بر اساس معیار مد نظر خود لیست کنند و یا در صورت نیاز، برخی از آنها را متوقف کنند. جدول زیر شامل لیستی از کاربردی‌ترین کلیدهای تعاملی ابزار top است:

کامند کاربرد
t نمایش یا عدم نمایش خلاصه اطلاعات (خطوط دوم و سوم)
m نمایش یا عدم نمایش اطلاعات مربوط به حافظه (خطوط چهارم و پنجم)
A سورت (مرتب) کردن لیست پروسه‌ها بر اساس میزان استفاده از منابع سیستمی (به خاطر داشته باشید که این حرف حتماً باید به صورت بزرگ «A» تایپ شود).
r تغییر Priority (اولویت) پروسه‌ها
k Kill (متوقف) کردن یک پروسه
f وارد شدن به صفحهٔ تنظیمات ابزار top
o افزودن فیلتر به منظور سورت کردن لیست پروسه‌ها
Esc خارج شدن از وضعیت هر یک از دکمه‌های فوق‌الذکر
q خارج شدن از ابزار top

نحوهٔ Kill (متوقف) کردن یک پروسه در لینوکس
حال که نمایی کلی از داده‌های تک‌تک پروسه‌ها داریم، به منظور پایان دادن به یک پروسه، مثلاً خارج شدن از اپلیکیشنی که هنگ کرده است، به سادگی می‌توانیم با وارد کردن کامند <kill <pid این کار را انجام دهیم. برای مثال فرض کنیم برنامه‌ٔ firefox را قصد داریم Kill کنیم:


  PID  USER     PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                  
3123 behzadm+ 20   0  959456 159064  74728 S   0.7  4.0   6:02.19 firefox

همان‌طور که مشخص است، میزان مصرف CPU توسط این برنامه 40/3 درصد است که به نسبت زیاد است و سرعت سایر برنامه‌ها را پایین آورده است و اکنون قصد داریم که این برنامه را متوقف سازیم. برای این منظور، کامند زیر را وارد کرده و اینتر می‌کنیم:

kill 3123

اگر این کامند را در ترمینال تست کنیم، می‌بینیم که به محض فشردن دکمهٔ اینتر، برنامه‌ٔ فایرفاکس کلاً بسته می‌شود.

نکته‌ای که در ارتباط با کامند kill می‌بایست مد نظر داشته باشیم این است که نام این کامند به معنی «کشتن» تا حدودی گمراه‌کننده است و این کامند در واقع پروسه‌ها را از بین نمی‌برد بلکه یک سیگنال برای پروسهٔ مد نظر ارسال می‌کند. هر پروسه در لینوکس حاوی یکسری اصطلاحاً Signal Handler است که مسئول ارتباط برقرار کردن با سیگنال‌های ورودی هستند و هر زمانی هم که هیچ سیگنالی به عنوان پارامتر کامندها در نظر گرفته نشود، به صورت پیش فرض سیگنال شماره ۱۵ تحت عنوان SIGTERM در نظر گرفته می‌شود.

مواقعی پیش می‌آید که دستور kill بدون هیچ سیگنال ورودی، قادر به بستن برنامه نیست که در چنین شرایطی می‌بایست از سیگنال قوی‌تر 9 که تحت عنوان SIGKILL شناخته می‌شود استفاده کرد. برای مثال، کامند زیر به صورت تضمینی پروسه‌ای با شناسهٔ ۳۱۲۳ را پایان خواهد داد:

kill -9 3123

برای آشنایی با سیگنال‌های مختلف کامند kill، می‌توان دستور زیر را در ترمینال وارد ساخت:

$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

لازم به ذکر است که به عنوان سیگنال، هم می‌توان عدد مربوطه و هم برچسب را در نظر گرفت. به عنوان مثال، اگر بخواهیم سیگنال ۹ را در نظر بگیریم، دستور زیر هم عملکردی مشابه دستوری خواهد داشت که پیش از این بررسی کردیم:

kill -SIGKILL 3123

گرچه روش استاندارد برای متوقف کردن برنامه‌ها از طریق کامندلاین PID است، اما در صورت لزوم از طریق نام برنامه هم می‌توان با استفاده از دستور زیر اقدام به پایان داده به برنامه استفاده کرد:

kill -9 `pgrep firefox`

دستور زیر هم کاری دقیقاً مشابه دستور فوق انجام می‌دهد:

pkill -9 firefox

دستور دیگری هم داریم تحت عنوان killall که یکی از دستورات کاربری برای پایان دادن به برنامه‌ها است. کاری که این دستور انجام می‌دهد این است که این دستور کلیهٔ پروسه‌های مرتبط با یک برنامه (Child Process) و همچنین تمامی Instance یا نمونه‌های اجرا شده از روی یک برنامه را متوقف می‌سازد:

killall firefox

با اجرای دستور فوق، هر تعداد نمونه که از روی برنامهٔ فایرفایکس در حال اجرا باشد به کلی متوقف خواهد شد. با توجه به اینکه دستور killall دستور قدرتمندی است و ما هیچ‌گاه قصد نداریم تا به اشتباه پروسه‌ای را با استفاده از این دستور پایان دهیم، می‌توانیم از آپشن i برای این کامند استفاده نماییم تا قبل از پایان دادن به برنامهٔ‌ مد نظر، از ما پرسیده می‌شود که آیا از کاری که قصد انجام آن را داریم اطمینان داشته یا خیر:

$ killall -i firefox
Kill firefox(3123) ? (y/N) 

می‌بینیم که پیش از پایان دادن به برنامهٔ فایرفاکس، از ما سؤال پرسیده می‌شود که آیا مطمئن هستیم یا خیر.

به خاطر داشته باشید
در لینوکس مواردی مثل سؤال فوق (y/N) که پیش می‌آید (y مخفف yes و N مخفف No) ، حرفی که به صورت بزرگ نوشته شده است دستور پیش فرض ترمینال است که اگر اینتر کنیم آن دستور اجرا می‌شود اما اگر بخواهیم دستوری که با حرف کوچک نوشته شده (y) را اجرا کنیم، حتما می‌بایست آن را تایپ کرده و اینتر کنیم. در مثال فوق، برای پایان دادن به برنامه، حرف y را تایپ می‌کنیم و اینتر می‌نماییم و این در حالی است که اگر فقط اینتر را بزنیم، دستور پیش فرض No اجرا گشته و مسلماً هیچ اتفاقی رخ نخواهد داد.

کامند دیگری هم برای پایان دادن برنامه‌ها در لینوکس داریم تحت عنوان xkill که کاربرد آن به صورت زیر است:

$ xkill
Select the window whose client you wish to kill with button 1 ...

کاری که کامند فوق انجام می‌دهد این است که به محض تایپ کردن آن و اینتر کردن، نشانگر ماوس به شکل یک ضربدر (×) درآمده و از آن پس روی هر پنجره یا برنامه‌ای که کلیک کنید، آن را خواهد بست.

تغییر Priority (اولویت) پروسه‌ها در لینوکس
پیش از این گفتیم که هر پروسه‌ای که در سیستم‌عامل گنو/لینوکس اجرا می‌شود دارای یک اولویت است و این را هم گفتیم که پروسه‌هایی با اولویت بالا داری مقدار Nice Value پایینی هستند (19-) و پروسه‌هایی با اولویت پایین هم دارای Nice Value بالایی (19) می‌باشند. برای روشن‌تر شدن این مسئله، مثالی می‌زنیم. در ادامه می‌بینیم که پروسهٔ مرتبط با فایرفاکس با میزان NI یا Nice Value برابر با ۰ در حال اجرا است:


  PID  USER     PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                  
3123 behzadm+ 20   0  959456 159064  74728 S   0.7  4.0   6:02.19 firefox

حال به منظور تغییر Nice Value این پروسه، می‌بایست به صورت زیر از دستور renice استفاده نماییم:

$ sudo renice -10 3123
3123 (process ID) old priority 0, new priority -10

پیش از هر چیز بایستی بگوییم که برای renice کردن نیاز به سطح دسترسی روت داریم؛ لذا پیش از دستور renice از دستور sudo استفاده می‌‌کنیم. سپس مقدار مد نظر، مثلاً ۱۰-، را نوشته و در نهایت PID پروسه را می‌نویسیم و اینتر می‌کنیم. ابتدا از ما پسورد روت خواسته می‌شود و اگر آن را به درستی وارد کنیم، می‌بینیم که دستور با موفقیت انجام شده و گزارش آن تغییرات هم در معرض دیدمان قرار می‌گیرد. حال اگر مجدد به خروجی کامند top مراجعه نماییم، خواهیم داشت:


  PID  USER     PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                  
3123 behzadm+ 20 -10  959456 159064  74728 S   0.7  4.0   6:02.19 firefox

می‌بینیم که مقدار جدید ۱۰- برای مؤلفهٔ NI برنامه‌ٔ فایرفاکس در نظر گرفته شده است.

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان