Ketika datang untuk memecahkan masalah kinerja di Linux, sangat penting untuk mengetahui dasar-dasar dari berbagai output perintah seperti uptime, vmstat. Dalam posting ini, kami akan mencoba memahami rata-rata beban dan menjalankan antrian/antrian yang diblokir dalam hal pemanfaatan CPU. Pertama, mari kita pahami apa itu Load Average:
Rata-rata beban adalah jumlah pekerjaan dalam antrian yang dijalankan (keadaan R) atau menunggu disk I/O (keadaan D) rata-rata selama 1, 5, dan 15 menit. Contoh output dari perintah uptime/top:
# uptime 11:49:14 up 25 days, 5:56, 68 users, load average: 0.03, 0.13, 0.47
# top -b -n 1 top - 11:49:34 up 25 days, 5:56, 68 users, load average: 0.09, 0.14, 0.46 Tasks: 456 total, 1 running, 445 sleeping, 10 stopped, 0 zombie Cpu(s): 0.8%us, 0.4%sy, 0.0%ni, 98.6%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 141823788k total, 140483388k used, 1340400k free, 313452k buffers Swap: 16772092k total, 0k used, 16772092k free, 134695384k cached
Aturan praktisnya adalah:
- Sistem Inti Tunggal – jika rata-rata beban adalah 1,00 berarti sistem telah sepenuhnya digunakan dan jika akan ada lebih banyak tugas yang masuk, mereka akan mengantri dan menunggu eksekusi.
- Sistem Inti Tunggal – jika rata-rata beban 2,00 berarti Sistem sudah digunakan dan beberapa tugas sudah diantrekan dan menunggu eksekusi.
- Sistem multi inti (4 inti) – jika rata-rata beban 1,00 berarti sistem menggunakan 1/4 dari kemampuan CPU-nya, satu tugas aktif berjalan dan masih ada 3 inti pada tahap 'idle'.
- Sistem multi inti (4 inti) – jika rata-rata beban 4,00 berarti sistem menggunakan semua 4 core dan ini menunjukkan bahwa sistem telah digunakan sepenuhnya.
Apakah masih ada ruang kepala yang tersisa dalam kasus di atas? – biasanya tidak – jika rata-rata beban mendekati jumlah inti pada sistem – OS harus ditinjau untuk mencari hambatan aktual dan penyetelan yang hilang atau mungkin OS tidak diskalakan dengan benar untuk melayani tugas APP/DB apa pun.
Bagaimana nilai rata-rata beban dihitung pada OS Aktif? – untuk ini kita perlu mencari run queue yang tersedia melalui perintah vmstat:
Sistem menganggur (sistem 8 inti)
# vmstat 1 6 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 1674516 316588 134364752 0 0 0 1 0 0 1 0 99 0 0 0 0 0 1674624 316588 134364752 0 0 0 0 195 307 0 0 100 0 0 0 0 0 1674624 316596 134364752 0 0 0 12 168 302 0 0 100 0 0 0 0 0 1674624 316596 134364752 0 0 0 0 198 331 0 0 100 0 0 0 0 0 1674624 316596 134364752 0 0 0 0 206 356 0 0 100 0 0 0 0 0 1674624 316600 134364736 0 0 0 12 197 333 0 0 100 0 0
Sistem Aktif (sistem 8 inti)
# vmstat 1 6 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 5 0 0 1674516 316588 134364752 0 0 0 1 0 0 1 0 99 0 0 7 0 0 1674624 316588 134364752 0 0 0 0 195 307 0 0 100 0 0 2 0 0 1674624 316596 134364752 0 0 0 12 168 302 0 0 100 0 0 6 0 0 1674624 316596 134364752 0 0 0 0 198 331 0 0 100 0 0 1 0 0 1674624 316596 134364752 0 0 0 0 206 356 0 0 100 0 0 8 0 0 1674624 316600 134364736 0 0 0 12 197 333 0 0 100 0 0
Keluaran di atas adalah contoh – yang pertama menunjukkan bahwa antrian berjalan saat ini (r) adalah 0 dimana pada sistem aktif antrian berjalan melompat dari 1 ke 8 dalam 6 pemeriksaan.
Apa sebenarnya run queue itu?
jalankan antrian :Jumlah proses aktif ( berjalan ) dan antrian.
Pada contoh kedua ketika sistem aktif kita melihat antrian run 8 – ini sudah batas atas maksimum sistem dengan 8 core harus dijalankan. Tentu saja, antrian run mungkin menunjukkan nilai seperti 36 atau bahkan 101 – mereka akan baik-baik saja jika pada 36 pertama kita memiliki 36 inti dan pada yang kedua 101 kita memiliki lebih dari 101 inti.
Kolom run queue harus selalu lebih rendah/sama dengan jumlah core yang terpasang pada sistem – tentu saja run queue 100 dapat terlihat pada sistem dengan hanya 8 core – itu berarti 8 proses sedang aktif dilayani oleh CPU dan sisanya 92 sedang antri dan menunggu eksekusi. Jika antrian berjalan di atas inti CPU yang terinstal, penyelidikan harus dilakukan dalam hal memeriksa kinerja APP/DB dan penyetelan yang hilang atau dapat menunjukkan bahwa sistem tidak ditingkatkan dengan benar untuk melayani antrian/beban yang dijalankan.
Sama seperti antrian run rata-rata beban harus tetap di bawah jumlah core yang terpasang - tidak menjaga nilai ini di bawah ambang batas maksimum akan menyebabkan kasus pelambatan/gantung atau penggusuran (jika sistem diaktifkan HA) karena OS dapat dengan mudah mengantre pemantauan detak jantung pada disk/jaringan layer karena sibuk melayani tugas-tugas lain. Rata-rata beban yang tinggi dan antrean yang berjalan akan menyebabkan kasus macet/mati secara tiba-tiba – ada baiknya untuk memantau kedua nilai secara aktif melalui alat pemantauan pihak ketiga dan memberi peringatan saat antrean berjalan/memuat rata-rata menghabiskan lebih dari 70% sumber daya CPU yang sebenarnya.
Kolom penting kedua yang juga diambil oleh Load Average adalah status 'b' di vmstat yang menjelaskan proses status yang diblokir – ini dapat dengan mudah ditafsirkan sebagai proses status-D (menunggu IO back-end selesai – biasanya Aktivitas Penyimpanan). Jika Rata-rata beban tinggi dan tidak ada proses yang sedang aktif berjalan dan vmstat menunjukkan nilai status 'b' yang tidak normal, maka saatnya untuk meninjau kinerja SAN atau verifikasi komponen OS apa pun seperti ISCSI/NFS/NIC/HBA yang mungkin mengalami beberapa masalah dan menyebabkan negara diblokir serius di bawah Linux. Misalnya NFS Server mungkin sibuk pada tingkat CPU dan semua proses/tugas klien (Linux) akan mengantri di state-d ( b ) yang mengarah ke 'antrian' yang kemudian mungkin merilis run-queue besar-besaran setelahnya – karena semua proses sebelumnya menunggu IO back-end selesai nanti, mereka mungkin kembali beralih ke Running yang mengarah ke run-queue besar-besaran yang dapat menyebabkan keadaan hang/panik atau menyebabkan kasus pengusiran sesudahnya.
Throughput jaringan dan lalu lintas TCP/UDP juga akan terpengaruh karena Rata-Rata Beban yang tinggi – karena sistem hanya akan sibuk melayani tugas lain selain mengonfirmasi koneksi masuk/keluar dan memprioritaskan lalu lintas IO Jaringan yang masuk melalui NFS/ISCSI, dll. Dalam beberapa kasus, TOP mungkin ditampilkan naikkan nilai %CPU menjadi lebih besar dari 100 ini baik-baik saja karena perintah TOP secara default di Linux menunjukkan operasi inti tunggal sehingga dalam pengaturan multi-inti nilai %CPU bisa lebih besar dari 100%. Misalnya, Jika PID menggunakan 4 core sepenuhnya maka nilai %CPU akan menunjukkan 400
# top top - 11:49:34 up 25 days, 5:56, 68 users, load average: 0.09, 0.14, 0.46 Tasks: 456 total, 1 running, 445 sleeping, 10 stopped, 0 zombie Cpu(s): 0.8%us, 0.4%sy, 0.0%ni, 98.6%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 141823788k total, 140483388k used, 1340400k free, 313452k buffers Swap: 16772092k total, 0k used, 16772092k free, 134695384k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1438 java 20 0 945m 4220 2528 S 400.5 0.0 56:31.95 java <---
Info tentang %CPU:
## %CPU -- CPU Usage The task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time. In a true SMP environment, if a process is multi-threaded and top is not operating in Threads mode, amounts greater than 100% may be reported. You toggle Threads mode with the 'H' interactive command. ##
Untuk membuat daftar proses yang berjalan/diblokir dengan cepat, gunakan perintah ps di bawah ini:
# ps r -Af
Untuk membuat daftar utas proses untuk memverifikasi apakah beberapa utas yang dihasilkan oleh PID induk tidak menyebabkan masalah lonjakan CPU, jalankan:
# ps -e -To pid,ppid,state,pcpu,command
atau
# ps -elfL
Juga untuk memverifikasi apakah CPU OS melayani secara aktif Ruang Pengguna ( AS ) gunakan contoh perintah di bawah ini:
# sar -P ALL 1 Linux 3.8.13-118.13.3.el6uek.x86_64 (lgeeklab) 01/08/2017 _x86_64_ (8 CPU) 02:40:38 PM CPU %user %nice %system %iowait %steal %idle 02:40:39 PM all 12.62 0.00 0.12 6.88 0.00 80.38 02:40:39 PM 0 0.00 0.00 0.00 54.55 0.00 45.45 02:40:39 PM 1 0.00 0.00 0.00 0.00 0.00 100.00 02:40:39 PM 2 0.99 0.00 0.00 0.00 0.00 99.01 02:40:39 PM 3 0.00 0.00 0.00 0.00 0.00 100.00 02:40:39 PM 4 100.00 0.00 0.00 0.00 0.00 0.00 02:40:39 PM 5 0.98 0.00 0.98 0.00 0.00 98.04 02:40:39 PM 6 0.00 0.00 0.00 0.00 0.00 100.00 02:40:39 PM 7 0.00 0.00 0.00 0.00 0.00 100.00 Average: CPU %user %nice %system %iowait %steal %idle Average: all 12.63 0.00 0.13 6.00 0.00 81.24 Average: 0 0.00 0.00 0.00 45.23 0.00 54.77 Average: 1 0.50 0.00 0.00 3.00 0.00 96.50 Average: 2 0.50 0.00 0.00 0.00 0.00 99.50 Average: 3 0.00 0.00 0.00 0.50 0.00 99.50 Average: 4 100.00 0.00 0.00 0.00 0.00 0.00 Average: 5 0.50 0.00 0.50 0.00 0.00 99.00 Average: 6 0.00 0.00 0.00 0.00 0.00 100.00 Average: 7 0.00 0.00 0.00 0.00 0.00 100.00
# mpstat -P ALL Linux 3.8.13-118.13.3.el6uek.x86_64 (geeklab) 01/08/2017 _x86_64_ (8 CPU) 02:41:26 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 02:41:26 PM all 0.79 0.00 0.10 1.18 0.00 0.02 0.00 0.00 97.92 02:41:26 PM 0 0.94 0.00 0.14 2.84 0.00 0.02 0.00 0.00 96.06 02:41:26 PM 1 0.94 0.00 0.14 2.70 0.00 0.02 0.00 0.00 96.20 02:41:26 PM 2 0.93 0.00 0.14 1.13 0.00 0.03 0.00 0.00 97.77 02:41:26 PM 3 0.94 0.00 0.13 2.71 0.00 0.02 0.00 0.00 96.20 02:41:26 PM 4 0.65 0.00 0.06 0.01 0.00 0.01 0.00 0.00 99.28 02:41:26 PM 5 0.65 0.00 0.06 0.01 0.00 0.01 0.00 0.00 99.27 02:41:26 PM 6 0.65 0.00 0.06 0.01 0.00 0.01 0.00 0.00 99.27 02:41:26 PM 7 0.64 0.00 0.05 0.01 0.00 0.01 0.00 0.00 99.29
Selain itu, sakelar perintah TOP di bawah ini dapat digunakan untuk mendapatkan info utas PID dan juga inti mana yang melayani PID terakhir kali:
Untuk menampilkan utas di TOP:
# top -H
Untuk menampilkan PID inti mana yang terakhir kali dijalankan:
# top
Kemudian tekan 'F ' dan tekan 'J ' dan tekan enter untuk mendapatkan output di bawah ini di mana 'P ' baris akan menjadi CPU yang terakhir digunakan.
Tasks: 1045 total, 2 running, 1043 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 93.6%id, 5.9%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 16159656k total, 15349888k used, 809768k free, 597960k buffers Swap: 8232956k total, 218784k used, 8014172k free, 9840192k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ P COMMAND 10428 root 20 0 15228 2228 1724 S 0.7 0.0 0:26.86 2 top 10838 oracle 20 0 4921m 585m 5708 S 0.7 3.7 137:11.13 3 mysqld 15360 root 20 0 15888 2792 1724 R 0.7 0.0 0:00.55 6 top 528 root 20 0 0 0 0 S 0.3 0.0 76:39.23 0 jbd2/dm-0-8 9003 root 20 0 0 0 0 S 0.3 0.0 8:49.33 2 jbd2/dm-3-8 10815 oracle 20 0 4921m 585m 5708 S 0.3 3.7 13:35.18 1 mysqld 14902 oracle 20 0 9431m 2.4g 28m S 0.3 15.5 19:54.77 3 java 15021 oracle 20 0 9431m 2.4g 28m S 0.3 15.5 20:09.19 1 java 15094 oracle 20 0 9431m 2.4g 28m S 0.3 15.5 6:54.88 3 java 32045 enduser 20 0 15228 2220 1724 S 0.3 0.0 9:32.73 5 top 32278 root 20 0 15228 2212 1724 S 0.3 0.0 9:32.96 1 top
FAQ
Haruskah sistem berjalan dengan batas atas seperti 8 proses yang berjalan dengan rata-rata beban pada nilai yang sama pada sistem 8 inti?
Jawaban - Tidak
Sistem harus ditingkatkan dengan benar dan tidak melebihi 70% dari kemungkinannya -jadi ada ruang utama untuk setiap tugas baru yang akan dieksekusi - ini sangat penting untuk Server yang mendukung HA dan untuk sistem di mana ada High-End Komponen IO/Jaringan yang mungkin secara tidak sengaja diantrekan oleh OS yang aktif. Untuk pemeriksaan mendalam ini harus dilakukan oleh tim APP/DB untuk memverifikasi apa yang sebenarnya berjalan aktif di bawah OS.
Apakah hanya tugas APP/DB yang menyebabkan rata-rata antrean / beban berjalan tinggi
Jawaban - Tidak
Beberapa tugas OS mungkin menyebabkan antrian berjalan tinggi atau memuat rata-rata - tetapi ini adalah kasus yang sangat jarang terjadi. Dalam hal ini, perintah atas akan berguna untuk memantau nilai US /SY / NI / ID / WA / HI / SI / ST dan fokus pada bagian SY ( System ) yang memberitahukan berapa banyak waktu prosesor yang dihabiskan di tingkat kernel. Pastikan selalu lebih rendah dari penggunaan AS ( Pengguna ) yang sebenarnya dan SY tidak, misalnya, menggunakan 20-30% CPU (tergantung pada pengaturan CPU dan kasus aktual).
Misalnya, %SY tinggi mungkin terlihat selama operasi IO/Jaringan Tinggi atau selama kasus kekurangan memori - contoh prosesnya adalah:kjorunald. %SY tinggi mungkin juga terlihat selama beban sistem yang berat - misalnya, antrian yang berjalan tinggi atau antrian yang diblokir yang disebabkan oleh tugas APP/DB - sebagian besar kemudian diamati bahwa %SY akan berada di sekitar 20-30% di mana %US akan menjadi jauh lebih tinggi.
%SY yang lebih tinggi tidak selalu berarti ada masalah kernel atau OS - misalnya, mungkin ada kode Aplikasi/Database yang menyebabkan banyak panggilan sys dilakukan di sekitar fungsi kernel tertentu - untuk men-debug strace atau perf lebih lanjut ini harus digunakan untuk verifikasi interaksi PID tertentu.
Apakah ini berarti single core hanya dapat melayani tugas proses tunggal pada saat itu?
Jawaban - Ya/Tidak
CPU dirancang untuk multitasking - bahkan dengan sistem inti tunggal, pengguna masih dapat menjalankan banyak tugas dan memulai beberapa aplikasi - dalam pengaturan inti tunggal 'pengirisan waktu' digunakan yang memungkinkan tugas dijalankan untuk waktu tertentu sementara tugas lain akan menunggu dieksekusi (ini bisa terjadi beberapa kali per detik).
Sistem modern akan menggunakan fitur multicore/multithreading untuk membuat dampak peralihan ini kurang terlihat - maka pada Sistem Perusahaan, pengguna memiliki pengaturan multi-core di mana aplikasi dapat membuat utas yang lebih kecil yang akan mencapai operasi multitugas yang sebenarnya (setiap inti dapat melayani tugas yang berbeda) yang mengarah ke lebih banyak lagi lebih sedikit beban rata-rata pada sistem dan antrian tugas yang lebih rendah - Misalnya sistem inti ganda dapat membagi aplikasi/utas/tugas menjadi dua inti terpisah yang memungkinkan inti untuk beralih hanya setengah dari tugas dibandingkan dengan sistem inti tunggal yang menyebabkan dampak yang jauh lebih kecil pada kinerja sistem.