گرچه دیدن نمایی استاتیک (ایستا) از اتفاقاتی که در سیستم در حال رخ دادن هستند مفید است، اما گاهیاوقات نیار داریم تا به صورت 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 برنامهٔ فایرفاکس در نظر گرفته شده است.