GNU/Linux >> Belajar Linux >  >> Linux

Analisis kinerja startup Linux

Bagian dari tugas administrator sistem adalah menganalisis kinerja sistem dan menemukan serta menyelesaikan masalah yang menyebabkan kinerja buruk dan waktu mulai yang lama. Sysadmin juga perlu memeriksa aspek lain dari konfigurasi dan penggunaan systemd.

Sistem init systemd menyediakan systemd-analyze alat yang dapat membantu mengungkap masalah kinerja dan informasi sistem penting lainnya. Di artikel sebelumnya, Menganalisis kalender dan rentang waktu sistem , saya menggunakan systemd-analyze untuk menganalisis stempel waktu dan rentang waktu di pengatur waktu systemd, tetapi alat ini memiliki banyak kegunaan lain, beberapa di antaranya akan saya jelajahi dalam artikel ini.

Ikhtisar permulaan

Urutan startup Linux adalah tempat yang baik untuk mulai menjelajah karena banyak systemd-analyze fungsi alat ditargetkan saat startup. Tetapi pertama-tama, penting untuk memahami perbedaan antara boot dan startup. Urutan boot dimulai dengan BIOS power-on self test (POST) dan berakhir ketika kernel selesai memuat dan mengambil kendali dari sistem host, yang merupakan awal dari startup dan titik ketika jurnal systemd dimulai.

Pada artikel kedua dalam seri ini, Memahami systemd saat startup di Linux , saya membahas startup secara lebih mendetail sehubungan dengan apa yang terjadi dan dalam urutan apa. Dalam artikel ini, saya ingin memeriksa urutan startup untuk melihat jumlah waktu yang diperlukan untuk melalui startup dan tugas mana yang paling memakan waktu.

Hasil yang akan saya tunjukkan di bawah ini berasal dari workstation utama saya, yang jauh lebih menarik daripada hasil mesin virtual. Workstation ini terdiri dari motherboard ASUS TUF X299 Mark 2, CPU Intel i9-7960X dengan 16 core dan 32 CPU (thread), dan RAM 64GB. Beberapa perintah di bawah ini dapat dijalankan oleh pengguna non-root, tetapi saya akan menggunakan root dalam artikel ini untuk mencegah keharusan beralih antar pengguna.

Ada beberapa opsi untuk memeriksa urutan startup. Bentuk paling sederhana dari systemd-analyze perintah menampilkan ikhtisar jumlah waktu yang dihabiskan di setiap bagian utama startup, startup kernel, memuat dan menjalankan initrd (yaitu, ramdisk awal, citra sistem sementara yang digunakan untuk menginisialisasi beberapa perangkat keras dan memasang / [root] filesystem), dan userspace (di mana semua program dan daemon yang diperlukan untuk membawa host ke status yang dapat digunakan dimuat). Jika tidak ada sub-perintah yang diteruskan ke perintah, systemd-analyze time tersirat:

[root@david ~]$ systemd-analyze 
Startup finished in 53.921s (firmware) + 2.643s (loader) + 2.236s (kernel) + 4.348s (initrd) + 10.082s (userspace) = 1min 13.233s
graphical.target reached after 10.071s in userspace
[root@david ~]#

Data yang paling menonjol dalam output ini adalah jumlah waktu yang dihabiskan dalam firmware (BIOS):hampir 54 detik. Ini adalah jumlah waktu yang luar biasa, dan tidak ada sistem fisik saya yang lain yang membutuhkan waktu lama untuk melewati BIOS.

Laptop System76 Oryx Pro saya hanya menghabiskan 8,506 detik di BIOS, dan semua sistem buatan rumah saya membutuhkan waktu kurang dari 10 detik. Setelah beberapa pencarian online, saya menemukan bahwa motherboard ini dikenal dengan waktu booting BIOS yang sangat lama. Motherboard saya tidak pernah "hanya boot." Itu selalu hang, dan saya perlu melakukan siklus mati/hidup, dan kemudian BIOS dimulai dengan kesalahan, dan saya perlu menekan F1 untuk masuk ke konfigurasi BIOS, dari mana saya dapat memilih drive boot dan menyelesaikan boot. Dari sinilah waktu ekstra itu berasal.

Tidak semua host menampilkan data firmware. Eksperimen tidak ilmiah saya membuat saya percaya bahwa data ini hanya ditampilkan untuk prosesor Intel generasi 9 atau lebih tinggi. Tapi itu bisa saja salah.

Ikhtisar proses boot startup ini menarik dan memberikan informasi yang baik (walaupun terbatas), tetapi ada lebih banyak informasi yang tersedia tentang startup, seperti yang akan saya jelaskan di bawah.

Menetapkan kesalahan

Anda dapat menggunakan systemd-analyze blame untuk menemukan unit systemd mana yang membutuhkan waktu paling banyak untuk inisialisasi. Hasilnya ditampilkan secara berurutan berdasarkan jumlah waktu yang diperlukan untuk inisialisasi, dari yang paling banyak hingga yang paling sedikit:

[root@david ~]$ systemd-analyze blame                                                                         
       5.417s NetworkManager-wait-online.service                                                      
       3.423s dracut-initqueue.service                                                                
       2.715s systemd-udev-settle.service                                                              
       2.519s fstrim.service                                                                          
       1.275s udisks2.service                                                                          
       1.271s smartd.service                                                                          
        996ms upower.service                                                                          
        637ms lvm2-monitor.service                                                                    
        533ms lvm2-pvscan@8:17.service                                                                
        520ms dmraid-activation.service                                                                
        460ms vboxdrv.service                                                                          
        396ms initrd-switch-root.service
<SNIP – removed lots of entries with increasingly small times>

Karena banyak dari layanan ini dimulai secara paralel, jumlahnya mungkin bertambah jauh lebih banyak daripada total yang diberikan oleh systemd-analyze time untuk semuanya setelah BIOS. Semua ini adalah angka kecil, jadi saya tidak dapat menemukan penghematan yang signifikan di sini.

Data dari perintah ini dapat memberikan indikasi tentang layanan mana yang mungkin Anda pertimbangkan untuk meningkatkan waktu boot. Layanan yang tidak digunakan dapat dinonaktifkan. Tampaknya tidak ada layanan tunggal yang memakan waktu terlalu lama selama urutan startup ini. Anda mungkin melihat hasil yang berbeda untuk setiap boot dan startup.

Rantai kritis

Seperti jalur kritis dalam manajemen proyek, rantai kritis menunjukkan rantai waktu kritis peristiwa yang terjadi selama startup. Ini adalah unit systemd yang ingin Anda lihat jika startup lambat, karena merekalah yang akan menyebabkan penundaan. Alat ini tidak menampilkan semua unit yang dimulai, hanya unit yang berada dalam rangkaian peristiwa penting ini:

[root@david ~]# systemd-analyze critical-chain 
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.

graphical.target @10.071s
└─lxdm.service @10.071s
  └─plymouth-quit.service @10.047s +22ms
    └─systemd-user-sessions.service @10.031s +7ms
      └─remote-fs.target @10.026s
        └─remote-fs-pre.target @10.025s
          └─nfs-client.target @4.636s
            └─gssproxy.service @4.607s +28ms
              └─network.target @4.604s
                └─NetworkManager.service @4.383s +219ms
                  └─dbus-broker.service @4.434s +136ms
                    └─dbus.socket @4.369s
                      └─sysinit.target @4.354s
                        └─systemd-update-utmp.service @4.345s +9ms
                          └─auditd.service @4.301s +42ms
                            └─systemd-tmpfiles-setup.service @4.254s +42ms
                              └─import-state.service @4.233s +19ms
                                └─local-fs.target @4.229s
                                  └─Virtual.mount @4.019s +209ms
                                    └─systemd-fsck@dev-mapper-vg_david2\x2dVirtual.service @3.742s +274ms
                                      └─local-fs-pre.target @3.726s
                                        └─lvm2-monitor.service @356ms +637ms
                                          └─dm-event.socket @319ms
                                            └─-.mount
                                              └─system.slice
                                                └─-.slice
[root@david ~]#

Angka yang diawali dengan @ menunjukkan jumlah detik mutlak sejak startup dimulai saat unit menjadi aktif. Angka yang diawali dengan + tunjukkan jumlah waktu yang dibutuhkan unit untuk memulai.

Status sistem

Terkadang Anda perlu menentukan status sistem saat ini. systemd-analyze dump perintah membuang besar jumlah data tentang status sistem saat ini. Ini dimulai dengan daftar stempel waktu boot utama, daftar setiap unit systemd, dan deskripsi lengkap tentang status masing-masing:

[root@david ~]# systemd-analyze dump
Timestamp firmware: 1min 7.983523s
Timestamp loader: 3.872325s
Timestamp kernel: Wed 2020-08-26 12:33:35 EDT
Timestamp initrd: Wed 2020-08-26 12:33:38 EDT
Timestamp userspace: Wed 2020-08-26 12:33:42 EDT
Timestamp finish: Wed 2020-08-26 16:33:56 EDT
Timestamp security-start: Wed 2020-08-26 12:33:42 EDT
Timestamp security-finish: Wed 2020-08-26 12:33:42 EDT
Timestamp generators-start: Wed 2020-08-26 16:33:42 EDT
Timestamp generators-finish: Wed 2020-08-26 16:33:43 EDT
Timestamp units-load-start: Wed 2020-08-26 16:33:43 EDT
Timestamp units-load-finish: Wed 2020-08-26 16:33:43 EDT
Timestamp initrd-security-start: Wed 2020-08-26 12:33:38 EDT
Timestamp initrd-security-finish: Wed 2020-08-26 12:33:38 EDT
Timestamp initrd-generators-start: Wed 2020-08-26 12:33:38 EDT
Timestamp initrd-generators-finish: Wed 2020-08-26 12:33:38 EDT
Timestamp initrd-units-load-start: Wed 2020-08-26 12:33:38 EDT
Timestamp initrd-units-load-finish: Wed 2020-08-26 12:33:38 EDT
-> Unit system.slice:
        Description: System Slice
        Instance: n/a
        Unit Load State: loaded
        Unit Active State: active
        State Change Timestamp: Wed 2020-08-26 12:33:38 EDT
        Inactive Exit Timestamp: Wed 2020-08-26 12:33:38 EDT
        Active Enter Timestamp: Wed 2020-08-26 12:33:38 EDT
        Active Exit Timestamp: n/a
        Inactive Enter Timestamp: n/a
        May GC: no
<SNIP – Deleted a bazillion lines of output>

Di stasiun kerja utama saya, perintah ini menghasilkan aliran 49.680 baris dan sekitar 1,66MB. Perintah ini sangat cepat, jadi Anda tidak perlu menunggu hasilnya.

Lebih banyak sumber daya Linux

  • Lembar contekan perintah Linux
  • Lembar contekan perintah Linux tingkat lanjut
  • Kursus online gratis:Ikhtisar Teknis RHEL
  • Lembar contekan jaringan Linux
  • Lembar contekan SELinux
  • Lembar contekan perintah umum Linux
  • Apa itu container Linux?
  • Artikel Linux terbaru kami

Saya suka kekayaan detail yang disediakan untuk berbagai perangkat yang terhubung, seperti penyimpanan. Setiap unit systemd memiliki bagian dengan detail seperti mode untuk berbagai runtime, cache, dan direktori log, baris perintah yang digunakan untuk memulai unit, ID proses (PID), stempel waktu mulai, serta batas memori dan file.

Halaman manual untuk systemd-analyze menunjukkan systemd-analyze --user dump opsi, yang dimaksudkan untuk menampilkan informasi tentang keadaan internal manajer pengguna. Ini gagal untuk saya, dan pencarian internet menunjukkan bahwa mungkin ada masalah dengannya. Di systemd, --user instance digunakan untuk mengelola dan mengontrol sumber daya untuk hierarki proses milik setiap pengguna. Proses untuk setiap pengguna adalah bagian dari grup kontrol, yang akan saya bahas di artikel mendatang.

Grafik analitik

Kebanyakan bos berambut runcing (PHB) dan banyak manajer yang baik menemukan grafik yang cantik lebih mudah dibaca dan dipahami daripada data kinerja sistem berbasis teks yang biasanya saya sukai. Namun, terkadang saya menyukai grafik yang bagus, dan systemd-analyze menyediakan kemampuan untuk menampilkan data boot/startup dalam grafik grafik vektor SVG.

Perintah berikut menghasilkan file grafik vektor yang menampilkan peristiwa yang terjadi selama boot dan startup. Hanya perlu beberapa detik untuk menghasilkan file ini:

[root@david ~]# systemd-analyze plot > /tmp/bootup.svg

Perintah ini membuat SVG, yang merupakan file teks yang mendefinisikan serangkaian vektor grafik yang digunakan aplikasi, termasuk Penampil Gambar, Ristretto, Okular, Eye of Mate, LibreOffice Draw, dan lainnya, untuk menghasilkan grafik. Aplikasi ini memproses file SVG untuk membuat gambar.

Saya menggunakan LibreOffice Draw untuk membuat grafik. Grafiknya sangat besar, dan Anda perlu memperbesar untuk melihat detail apa pun. Ini sebagian kecilnya:

Urutan boot-up berada di sebelah kiri nol (0) pada garis waktu dalam grafik, dan urutan startup berada di sebelah kanan nol. Bagian kecil ini menunjukkan kernel, initrd , dan proses initrd dimulai.

Grafik ini menunjukkan sekilas apa yang dimulai kapan, berapa lama waktu yang dibutuhkan untuk memulai, dan dependensi utama. Jalur kritis disorot dengan warna merah.

Perintah lain yang menghasilkan output grafis adalah systemd-analyze plot . Ini menghasilkan deskripsi grafik ketergantungan tekstual dalam format DOT. Aliran data yang dihasilkan kemudian disalurkan melalui dot utilitas, yang merupakan bagian dari keluarga program yang dapat digunakan untuk menghasilkan file grafik vektor dari berbagai jenis data. File SVG ini juga dapat diproses oleh alat yang tercantum di atas.

Pertama, buat file . Ini memakan waktu hampir sembilan menit di stasiun kerja utama saya:

[root@david ~]# time systemd-analyze dot | dot -Tsvg > /tmp/test.svg
   Color legend: black     = Requires
                 dark blue = Requisite
                 dark grey = Wants
                 red       = Conflicts
                 green     = After

real    8m37.544s
user    8m35.375s
sys     0m0.070s
[root@david ~]#

Saya tidak akan mereproduksi output di sini karena grafik yang dihasilkan cukup banyak spageti. Tetapi Anda harus mencobanya dan melihat hasilnya untuk melihat apa yang saya maksud.

Ketentuan

Salah satu kemampuan yang lebih menarik, namun agak umum, yang saya temukan saat membaca systemd-analyze(1) halaman manual adalah condition sub-perintah. (Ya—saya memang membaca halaman manual, dan sungguh menakjubkan apa yang telah saya pelajari dengan cara ini!) condition ini subcommand dapat digunakan untuk menguji kondisi dan pernyataan yang dapat digunakan dalam file unit systemd.

Ini juga dapat digunakan dalam skrip untuk mengevaluasi satu atau lebih kondisi—ini mengembalikan nol (0) jika semua terpenuhi atau satu (1) jika ada kondisi yang tidak terpenuhi. Dalam kedua kasus, itu juga memuntahkan teks tentang temuannya.

Contoh di bawah, dari halaman manual, agak rumit. Ini menguji versi kernel antara 4.0 dan 5.1, bahwa host berjalan pada daya AC, bahwa arsitektur sistem tidak lain adalah ARM, dan bahwa direktori /etc/os-release ada. Saya menambahkan echo $? pernyataan untuk mencetak kode pengembalian.

[root@david ~]# systemd-analyze condition 'ConditionKernelVersion = ! <4.0' \
                    'ConditionKernelVersion = >=5.1' \
                    'ConditionACPower=|false' \
                    'ConditionArchitecture=|!arm' \
                    'AssertPathExists=/etc/os-release' ; \
echo $?
test.service: AssertPathExists=/etc/os-release succeeded.
Asserts succeeded.
test.service: ConditionArchitecture=|!arm succeeded.
test.service: ConditionACPower=|false failed.
test.service: ConditionKernelVersion=>=5.1 succeeded.
test.service: ConditionKernelVersion=!<4.0 succeeded.
Conditions succeeded.
0
[root@david ~]#

Daftar kondisi dan pernyataan dimulai sekitar baris 600 pada systemd.unit(5) halaman manual.

Mendaftarkan file konfigurasi

systemd-analyze alat menyediakan cara untuk mengirim konten berbagai file konfigurasi ke STDOUT , seperti yang ditunjukkan di sini. Direktori dasarnya adalah /etc/ :

[root@david ~]# systemd-analyze cat-config systemd/system/display-manager.service
# /etc/systemd/system/display-manager.service
[Unit]
Description=LXDM (Lightweight X11 Display Manager)
#Documentation=man:lxdm(8)
[email protected]
After=systemd-user-sessions.service [email protected] plymouth-quit.service livesys-late.service
#Conflicts=plymouth-quit.service

[Service]
ExecStart=/usr/sbin/lxdm
Restart=always
IgnoreSIGPIPE=no
#BusName=org.freedesktop.lxdm

[Install]
Alias=display-manager.service
[root@david ~]#

Ini banyak mengetik untuk melakukan tidak lebih dari cat standar perintah tidak. Saya menemukan perintah selanjutnya sedikit membantu. Itu dapat mencari file dengan pola yang ditentukan dalam lokasi systemd standar:

[root@david ~]# systemctl cat backup*
# /etc/systemd/system/backup.timer
# This timer unit runs the local backup program
# (C) David Both
# Licensed under GPL V2
#

[Unit]
Description=Perform system backups
Requires=backup.service

[Timer]
Unit=backup.service
OnCalendar=*-*-* 00:15:30

[Install]
WantedBy=timers.target


# /etc/systemd/system/backup.service
# This service unit runs the rsbu backup program
# By David Both
# Licensed under GPL V2
#

[Unit]
Description=Backup services using rsbu
Wants=backup.timer

[Service]
Type=oneshot
Environment="HOME=/root"
ExecStart=/usr/local/bin/rsbu -bvd1
ExecStart=/usr/local/bin/rsbu -buvd2

[Install]
WantedBy=multi-user.target

[root@david ~]#

Kedua perintah ini mengawali isi setiap file dengan baris komentar yang berisi path lengkap dan nama file.

Verifikasi file unit

Setelah membuat file unit baru, akan sangat membantu untuk memverifikasi bahwa sintaksnya benar. Inilah yang verify sub-perintah tidak. Itu dapat mencantumkan arahan yang dieja dengan salah dan memanggil unit layanan yang hilang:

[root@david ~]# systemd-analyze verify /etc/systemd/system/backup.service

Mengikuti filosofi Unix/Linux bahwa "diam adalah emas", kurangnya pesan keluaran berarti tidak ada kesalahan dalam file yang dipindai.

Keamanan

security subcommand memeriksa tingkat keamanan layanan tertentu. Ini hanya berfungsi pada unit layanan dan tidak pada jenis file unit lainnya:

[root@david ~]# systemd-analyze security display-manager 
  NAME                                                        DESCRIPTION                                                     >
✗ PrivateNetwork=                                             Service has access to the host's network                        >
✗ User=/DynamicUser=                                          Service runs as root user                                       >
✗ CapabilityBoundingSet=~CAP_SET(UID|GID|PCAP)                Service may change UID/GID identities/capabilities              >
✗ CapabilityBoundingSet=~CAP_SYS_ADMIN                        Service has administrator privileges                            >
✗ CapabilityBoundingSet=~CAP_SYS_PTRACE                       Service has ptrace() debugging abilities                        >
✗ RestrictAddressFamilies=~AF_(INET|INET6)                    Service may allocate Internet sockets                           >
✗ RestrictNamespaces=~CLONE_NEWUSER                           Service may create user namespaces                              >
✗ RestrictAddressFamilies=~…                                  Service may allocate exotic sockets                             >
✗ CapabilityBoundingSet=~CAP_(CHOWN|FSETID|SETFCAP)           Service may change file ownership/access mode/capabilities unres>
✗ CapabilityBoundingSet=~CAP_(DAC_*|FOWNER|IPC_OWNER)         Service may override UNIX file/IPC permission checks            >
✗ CapabilityBoundingSet=~CAP_NET_ADMIN                        Service has network configuration privileges                    >
✗ CapabilityBoundingSet=~CAP_SYS_MODULE                       Service may load kernel modules
<SNIP>
✗ CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG                   Service may issue vhangup()                                     >
✗ CapabilityBoundingSet=~CAP_WAKE_ALARM                       Service may program timers that wake up the system              >
✗ RestrictAddressFamilies=~AF_UNIX                            Service may allocate local sockets                              >

→ Overall exposure level for backup.service: 9.6 UNSAFE ?
lines 34-81/81 (END)

Ya, emoji adalah bagian dari output. Namun, tentu saja, banyak layanan membutuhkan akses yang cukup lengkap ke segala sesuatu untuk melakukan pekerjaan mereka. Saya menjalankan program ini terhadap beberapa layanan, termasuk layanan cadangan saya sendiri; hasilnya mungkin berbeda, tetapi intinya tampaknya sebagian besar sama.

Alat ini akan sangat berguna untuk memeriksa dan memperbaiki unit layanan ruang pengguna di lingkungan yang kritis terhadap keamanan. Saya tidak berpikir itu memiliki banyak hal untuk ditawarkan bagi kebanyakan dari kita.

Pemikiran terakhir

Alat canggih ini menawarkan beberapa opsi yang menarik dan sangat berguna. Sebagian besar dari apa yang dieksplorasi artikel ini adalah tentang menggunakan systemd-analyze untuk memberikan wawasan tentang kinerja startup Linux menggunakan systemd. Itu juga dapat menganalisis aspek lain dari systemd.

Beberapa dari alat ini penggunaannya terbatas, dan beberapa harus dilupakan sepenuhnya. Tetapi sebagian besar dapat digunakan untuk efek yang baik saat menyelesaikan masalah dengan startup dan fungsi systemd lainnya.

Sumber daya

Ada banyak informasi tentang systemd yang tersedia di internet, tetapi banyak yang singkat, tumpul, atau bahkan menyesatkan. Selain sumber daya yang disebutkan dalam artikel ini, halaman web berikut menawarkan informasi yang lebih detail dan andal tentang startup systemd. Daftar ini telah berkembang sejak saya memulai rangkaian artikel ini untuk mencerminkan penelitian yang telah saya lakukan.

  • Halaman manual systemd.unit(5) berisi daftar bagian file unit yang bagus dan opsi konfigurasinya bersama dengan deskripsi singkat masing-masing.
  • Proyek Fedora memiliki panduan praktis yang baik untuk systemd. Ini memiliki hampir semua yang perlu Anda ketahui untuk mengonfigurasi, mengelola, dan memelihara komputer Fedora menggunakan systemd.
  • Proyek Fedora juga memiliki lembar contekan bagus yang merujuk silang perintah SystemV lama ke perintah systemd yang sebanding.
  • Dokumentasi Red Hat berisi deskripsi yang baik tentang struktur file Unit serta informasi penting lainnya.
  • Untuk informasi teknis terperinci tentang systemd dan alasan pembuatannya, lihat deskripsi Freedesktop.org tentang systemd.
  • "Lebih banyak sistem menyenangkan" dari Linux.com menawarkan informasi dan tips sistem yang lebih canggih.

Ada juga serangkaian artikel yang sangat teknis untuk sysadmin Linux oleh Lennart Poettering, perancang dan pengembang utama systemd. Artikel-artikel ini ditulis antara April 2010 dan September 2011, tetapi masih relevan sekarang seperti dulu. Banyak hal bagus lainnya yang telah ditulis tentang systemd dan ekosistemnya didasarkan pada makalah ini.

  • Memikirkan kembali PID 1
  • systemd untuk Administrator, Bagian I
  • systemd untuk Administrator, Bagian II
  • systemd untuk Administrator, Bagian III
  • systemd untuk Administrator, Bagian IV
  • systemd untuk Administrator, Bagian V
  • systemd untuk Administrator, Bagian VI
  • systemd untuk Administrator, Bagian VII
  • systemd untuk Administrator, Bagian VIII
  • systemd untuk Administrator, Bagian IX
  • systemd untuk Administrator, Bagian X
  • systemd untuk Administrator, Bagian XI

Linux
  1. Tingkatkan kinerja sistem Linux dengan noatime

  2. Mengganti rc.local di systemd sistem Linux

  3. Cara Menggunakan journalctl untuk Menganalisis Log di Linux

  1. Analisis kernel Linux dengan ftrace

  2. Memahami systemd saat startup di Linux

  3. kinerja dd di Mac OS X vs. Linux

  1. 10 cara untuk menganalisis file biner di Linux

  2. Pemecahan masalah Linux 101:Kinerja sistem

  3. 10 Contoh pidstat untuk Debug Masalah Kinerja Proses Linux