1 poin oleh GN⁺ 5 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • Dengan layar htop di Ubuntu Server 16.04 x64 sebagai titik awal, artikel ini menelusuri apa sebenarnya arti uptime, load average, Tasks, PID, tree proses, status, waktu CPU, prioritas, dan metrik memori melalui /proc serta keluaran perintah
  • Banyak nilai di layar berasal dari procfs dan file sistem seperti /etc/passwd, /etc/group, /etc/shadow, /etc/nsswitch.conf; dengan strace Anda dapat memeriksa file apa saja yang dibaca program
  • Load average bukan nilai yang sama dengan penggunaan CPU, melainkan moving average dengan peluruhan eksponensial yang mencakup proses yang sedang berjalan, menunggu dijalankan, serta proses dalam status uninterruptible
  • Kode status seperti R, S, D, Z, T, t terkait dengan signal, kill, dan perilaku fork/exec/wait, sehingga menjadi petunjuk untuk menilai mengapa proses berhenti atau tetap tersisa
  • VIRT, RES, SHR, MEM% menampilkan memori virtual, memori fisik, dan memori yang dapat dibagikan dari sudut pandang berbeda, sehingga sulit menyimpulkan penggunaan memori aktual hanya dari satu angka

Dari mana nilai htop berasal

  • uptime menunjukkan sudah berapa lama sistem berjalan, dan informasi yang sama juga dapat dilihat dengan perintah uptime
  • Program uptime membaca /proc/uptime
    • Angka pertama adalah total waktu dalam detik sejak sistem dinyalakan
    • Angka kedua adalah waktu dalam detik ketika sistem berada dalam keadaan idle
    • Pada sistem multicore, waktu idle dijumlahkan per core sehingga dapat lebih besar daripada total uptime
  • Dengan strace uptime 2>&1 | grep open atau strace -e open uptime, Anda dapat melihat file yang dibuka oleh uptime
    • Contoh keluarannya mencakup /proc/uptime, /var/run/utmp, /proc/loadavg
  • Angka di /proc/uptime cocok digunakan oleh program atau skrip, sedangkan keluaran uptime diformat agar mudah dibaca manusia

Load average dan penggunaan CPU

  • Tiga nilai pertama di /proc/loadavg menunjukkan load average sistem selama 1 menit, 5 menit, dan 15 menit terakhir
  • Nilai keempat menampilkan jumlah proses yang saat ini sedang berjalan dan total jumlah proses dalam bentuk seperti 1/120, sedangkan nilai terakhir adalah PID terakhir yang digunakan
  • Saat proses baru dijalankan, PID akan dialokasikan; PID biasanya meningkat lalu digunakan ulang ketika habis
    • PID 1 dimiliki oleh /sbin/init yang dimulai saat boot
  • Jika di htop hanya terlihat satu proses yang sedang berjalan, proses itu bisa jadi htop itu sendiri
  • sleep 30 tidak sedang berjalan, melainkan berada dalam status sleep, sehingga tidak menambah jumlah running process
  • Pekerjaan yang terus menggunakan CPU seperti cat /dev/urandom > /dev/null menaikkan jumlah running process dan load average
  • Load number adalah nilai yang menghitung proses yang sedang berjalan atau menunggu dijalankan, serta proses dalam status uninterruptible
  • Load average bukan rata-rata sederhana, melainkan moving average dengan peluruhan eksponensial
    • Load average 1 menit pun tidak hanya mencerminkan 60 detik terakhir; ia memberi bobot lebih besar pada 1 menit terbaru sambil tetap memasukkan sebagian aktivitas sebelumnya
  • Pada sistem CPU tunggal, jika ada satu proses CPU-bound, load average 1.00 dapat disederhanakan sebagai penggunaan CPU 100%
    • Pada sistem 2-core, situasi yang sama dapat dianggap sebagai penggunaan CPU 50%
    • Load average yang setara dengan penggunaan CPU 100% pada sistem 2-core dapat disederhanakan menjadi 2.00
  • Penyederhanaan ini tidak selalu benar karena proses dalam status uninterruptible ikut dihitung dalam load
    • Situasi load average tinggi tetapi penggunaan CPU tidak tinggi juga mungkin terjadi
  • Penggunaan CPU sesaat dapat diperiksa dengan mpstat
    • sudo apt install sysstat -y
    • mpstat 1

Tasks, PID, tree proses

  • Tasks di kanan atas htop menunjukkan total jumlah proses dan jumlah proses yang sedang berjalan
  • Kernel Linux secara internal menyebut proses sebagai task, dan htop menggunakan Tasks alih-alih Processes untuk menghemat ruang layar
  • Tampilan thread dapat di-toggle dengan Shift+H
    • Jika terlihat seperti Tasks: 23, 10 thr, berarti thread sedang ditampilkan
  • Tampilan kernel thread dapat di-toggle dengan Shift+K
    • Jika terlihat seperti Tasks: 23, 40 kthr, berarti kernel thread sedang ditampilkan
  • Setiap kali proses baru dimulai, PID dialokasikan
    • Jika dijalankan di background seperti sleep 1000 &, nomor job dan PID akan ditampilkan
    • $! di bash diekspansi menjadi ID proses background terakhir
  • Informasi terkait proses berada di bawah /proc/<pid>/
    • /proc/<pid>/cmdline berisi perintah yang dijalankan, dan argumen dipisahkan dengan byte \0
    • Anda dapat melihatnya agar mudah dibaca dengan tr '\0' '\n' < /proc/<pid>/cmdline atau strings /proc/<pid>/cmdline
    • /proc/<pid>/cwd adalah link ke direktori kerja saat ini, dan /proc/<pid>/exe adalah link ke binary yang dijalankan
  • Tool diagnostik seperti htop, top, ps membaca detail proses dari /proc/<pid>/<file>
  • Pihak yang membuat proses baru disebut parent process, sedangkan yang baru dibuat disebut child process; hubungan ini membentuk tree proses
  • Dengan menekan F5 di htop, Anda dapat melihat hierarki proses
    • ps f dan pstree -a juga menampilkan hubungan yang sama
  • Saat menjalankan date di bash, bash membuat salinan dirinya dengan fork, memuat /bin/date ke memori dengan exec, lalu bash sebagai parent menunggu child selesai
  • /sbin/init dimulai saat boot dan menjalankan sshd; saat koneksi SSH dibuat, sshd membuat proses sesi, lalu sesi tersebut menjalankan shell bash

Pengguna dan hak akses proses

  • Setiap proses dimiliki oleh pengguna, dan pengguna direpresentasikan dengan ID numerik
  • ID pengguna suatu proses dapat dilihat pada entri Uid di /proc/<pid>/status
  • Perintah seperti id 1000 menampilkan nama pengguna dan grup yang sesuai dengan ID numerik tersebut
  • id memilih sumber resolusi nama sesuai pengaturan /etc/nsswitch.conf
    • Pada sistem contoh, perintah ini membaca /etc/passwd dan /etc/group
    • compat adalah Compatibility mode; sama seperti files, tetapi mengizinkan entri khusus
    • Informasi pengguna juga dapat disimpan di database atau layanan lain seperti LDAP
  • /etc/passwd dan /etc/group adalah file teks biasa yang memetakan ID numerik ke nama yang dapat dibaca manusia
  • Informasi kata sandi sebenarnya berada di /etc/shadow
    • $6$ berarti algoritme hashing sha512
    • Setelah itu diikuti salt acak untuk mencegah serangan rainbow table, serta hash dari password+salt
  • Secara default, program dijalankan dengan hak akses pengguna yang menjalankannya
    • Hal ini tetap sama meskipun pemilik file executable adalah pengguna lain
  • Untuk menjalankan sebagai pengguna lain atau root, gunakan sudo
    • sudo id dijalankan dengan UID 0 milik root
    • Dapat dijalankan sebagai pengguna tertentu seperti sudo -u daemon id
  • Jika mencoba menulis langsung ke /etc/sudoers dengan redirect, hanya echo yang dijalankan sebagai root sementara append dilakukan sebagai pengguna saat ini, sehingga bisa gagal
    • echo "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers
    • sudo bash -c "echo '$USER ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers"
  • /etc/sudoers harus diedit dengan sudo visudo
    • Ini memvalidasi isi sebelum disimpan, sehingga mencegah kesalahan yang membuat sudo tidak bisa digunakan
  • /usr/bin/passwd dapat menulis ke /etc/shadow meskipun dijalankan oleh pengguna biasa
    • Karena ada s pada permission file, file ini berjalan sebagai executable setuid
    • Program dijalankan dengan hak akses root, yaitu pemilik file executable tersebut
    • Executable setuid milik root dapat ditemukan dengan find /bin -user root -perm -u+s

Kode status proses

  • Kolom status di htop ditampilkan dengan nama S, dan nilai utamanya adalah sebagai berikut
    • R: running atau runnable, sedang berjalan atau menunggu di run queue
    • S: interruptible sleep, menunggu penyelesaian event
    • D: uninterruptible sleep, biasanya menunggu I/O
    • Z: defunct zombie, sudah selesai tetapi belum di-reap oleh parent
    • T: dihentikan oleh job control signal
    • t: dihentikan oleh debugger saat tracing
    • X: dead, status yang seharusnya tidak terlihat
  • ps juga menampilkan substate seperti Ss, R+, Ss+
  • R: sedang berjalan atau dapat dijalankan

    • Status R berarti proses sedang berjalan saat ini atau menunggu di antrean eksekusi
    • Kode sumber program setelah dikompilasi menjadi instruksi CPU, lalu saat dijalankan dimuat ke memori dan CPU mengeksekusi instruksi tersebut
    • Sedang berjalan berarti CPU secara fisik mengeksekusi instruksi
  • S: sleep yang dapat diinterupsi

    • Pada status S, instruksi proses tidak dieksekusi oleh CPU dan proses menunggu event atau kondisi
    • Ketika event terjadi, kernel mengubah statusnya menjadi running
    • sleep 1000 adalah contoh menunggu selama waktu yang ditentukan
    • Status ini dapat diinterupsi dengan signal
    • Di htop, signal dapat dikirim dengan menekan F9
    • kill adalah system call untuk mengirim signal, dan /bin/kill adalah program di userland yang memanggilnya
    • Signal default adalah TERM, yang meminta proses untuk berhenti
    • Signal adalah angka; namanya biasanya ditulis dengan huruf besar dan dapat diberi prefix SIG
    • Contoh: INT, KILL, STOP, CONT, HUP
    • kill -INT 10089, kill -2 10089, dan /bin/kill -2 10089 melakukan hal yang sama
    • Saat menekan CTRL+C, bash mengirim SIGINT ke foreground process
    • Mengirim SIGINT atau SIGTERM tidak berarti proses pasti berhenti
    • Program dapat memasang signal handler untuk melakukan pekerjaan pembersihan lalu berhenti
    • SIGKILL atau 9 membuat kernel memaksa proses berhenti tanpa memberi kesempatan untuk merespons
  • D: sleep yang tidak dapat diinterupsi

    • Status D tidak dapat dibangunkan dengan signal, dan karena SIGKILL juga merupakan signal, proses seperti ini tidak dapat di-kill
    • Status ini digunakan ketika proses harus menunggu tanpa terputus, atau ketika event diperkirakan akan terjadi dengan cepat
    • Contoh: disk read/write
    • Uninterruptible process biasanya bisa berada dalam kondisi menunggu I/O setelah page fault
    • Status ini dapat muncul saat ada keterlambatan baca/tulis NFS
    • Juga dapat muncul ketika memori yang tersedia terlalu sedikit sehingga proses banyak melakukan swap
    • Sebagai contoh, jika menjalankan sudo mount 8.8.8.8:/tmp /tmp &, /sbin/mount.nfs akan berada dalam status D
    • Jika dilihat dengan strace, system call mount memblokir proses
    • Dengan memberi opsi intr pada mount, proses dapat dijalankan secara interruptible
    • sudo mount 8.8.8.8:/tmp /tmp -o intr
  • Z: proses zombie

    • Status Z berarti proses sudah selesai tetapi parent belum me-reap proses tersebut
    • Proses zombie bisa normal jika hanya ada sebentar
    • Proses zombie yang tersisa lama dapat menunjukkan bug pada program
    • Proses zombie tidak mengonsumsi memori dan hanya memakai PID
    • Proses zombie itu sendiri tidak dapat di-kill
    • Anda dapat mengirim SIGCHLD ke parent process untuk meminta parent me-reap zombie
    • Jika parent process di-kill, parent dan zombie-nya dapat dihapus
    • Status zombie dapat direproduksi dengan program C yang setelah fork, child melakukan exit(0) dan parent melakukan sleep(20)
    • Setelah parent selesai, zombie akan hilang
    • Alasan zombie dipertahankan adalah agar parent dapat memeriksa exit code child melalui system call wait
  • T dan t: proses yang dihentikan

    • Status T berarti proses dihentikan oleh job control signal
    • Jika menekan CTRL+Z saat menjalankan cat /dev/urandom > /dev/null, proses menjadi status T
    • Dapat dijalankan kembali dengan fg
    • Proses juga dapat dihentikan dengan signal STOP dan dilanjutkan dengan signal CONT
    • Status t berarti proses dihentikan saat sedang di-trace oleh debugger
    • Jika attach dengan sudo gdb -p <pid> ke proses yang dijalankan dengan nc -l 1234 &, proses tersebut menjadi status t

Waktu CPU, niceness, priority

  • Linux adalah sistem operasi multitasking, sehingga bahkan pada satu CPU pun beberapa proses tampak berjalan secara bersamaan
  • Pada kenyataannya, satu CPU hanya bisa menjalankan satu instruksi pada satu waktu, sehingga digunakan time sharing
    • Satu proses berjalan sebentar lalu dihentikan
    • Proses lain yang menunggu untuk dijalankan dieksekusi secara bergiliran
    • Interval singkat ketika satu proses berjalan disebut time slice
  • Time slice biasanya hanya beberapa milidetik, jadi tidak terlalu terasa jika load sistem tidak tinggi
  • Pada satu core, jika load average adalah 1.0, CPU dapat dianggap digunakan 100%
    • Jika lebih tinggi dari 1.0, jumlah proses yang ingin berjalan lebih banyak daripada yang dapat ditangani CPU, sehingga bisa terjadi slowdown atau delay
    • Jika lebih rendah dari 1.0, CPU kadang berada dalam keadaan idle
  • Alasan running time proses bisa tidak persis sama dengan waktu yang benar-benar berlalu juga dapat dijelaskan dengan time sharing
  • Jika task yang ingin dijalankan lebih banyak daripada jumlah CPU core yang tersedia, harus ditentukan task mana yang dijalankan lebih dulu
  • Scheduler kernel Linux memilih proses berikutnya dari run queue, bergantung pada algoritme scheduler kernel
  • Secara umum scheduler tidak bisa dikendalikan langsung, tetapi kita bisa memberi tahu proses mana yang lebih penting
  • Niceness yang ditampilkan sebagai NI adalah priority di user-space
    • Rentangnya dari -20 hingga 19
    • -20 adalah prioritas tertinggi dan 19 adalah prioritas terendah
    • Proses yang lebih nice dapat dianggap lebih banyak mengalah kepada proses yang kurang nice
  • PRI adalah priority di kernel-space yang digunakan kernel Linux
    • Rentangnya dari 0 hingga 139
    • 0~99 adalah real time, 100~139 adalah rentang untuk user
  • Hubungan antara nilai nice dan priority dijelaskan sebagai PR = 20 + NI
    • -20~+19 pada NI menjadi 0~39 pada PR, dan ini dipetakan ke 100~139
  • Niceness sebelum eksekusi diatur dengan nice -n niceness program
  • Niceness proses yang sedang berjalan diubah dengan renice -n niceness -p PID
  • Warna penggunaan CPU adalah sebagai berikut
    • Blue: thread berprioritas rendah, nice > 0
    • Green: thread berprioritas normal
    • Red: kernel thread

Metrik memori: VIRT, RES, SHR, MEM%

  • Proses tampak seolah-olah berada sendirian di memori, dan ini diimplementasikan dengan memori virtual
  • Proses tidak mengakses memori fisik secara langsung, melainkan memiliki virtual address space sendiri
  • Kernel dapat menerjemahkan virtual memory address menjadi physical memory atau memetakan sebagian ke disk
  • Karena itu, proses bisa terlihat menggunakan memori lebih banyak daripada memori yang terpasang di komputer
  • Penggunaan memori proses berbeda-beda tergantung apakah mencakup item berikut
    • shared library
    • disk-mapped memory
    • swapped out memory
  • Warna penggunaan memori adalah sebagai berikut
    • Green: used memory
    • Blue: buffers
    • Orange: cache
  • VIRT/VSZ

    • VIRT adalah total jumlah virtual memory yang digunakan task
    • Mencakup code, data, shared library, swapped out page, page yang sudah di-mapped tetapi belum digunakan
    • Meski aplikasi meminta 1GB dan hanya menggunakan 1MB, VIRT bisa tampil sebagai 1GB
    • Meski file 1GB di-mmap dan tidak benar-benar digunakan, VIRT bisa ditampilkan sebagai 1GB
    • Dalam sebagian besar kasus, VIRT bukan angka yang berguna
  • RES/RSS

    • RES adalah physical memory yang tidak di-swapped out, yaitu penggunaan resident memory yang saat ini berada di memori fisik
    • RES dapat merepresentasikan penggunaan memori aktual lebih baik daripada VIRT, tetapi tetap memiliki keterbatasan
    • Tidak mencakup swapped out memory
    • Sebagian memori dapat dibagikan dengan proses lain
    • Jika sebuah proses menggunakan memori 1GB lalu melakukan fork(), RES kedua proses masing-masing bisa terlihat 1GB, tetapi karena copy-on-write di Linux, sebenarnya yang digunakan mungkin hanya 1GB
  • SHR

    • SHR adalah jumlah shared memory yang digunakan task
    • Mencerminkan memori yang berpotensi dapat dibagikan dengan proses lain
    • Contoh program C menunjukkan bagaimana nilai VIRT, RES, SHR berubah melalui malloc, penggunaan sebagian memori, fork, dan penulisan memori tambahan
    • Bagian contoh memori tersebut masih ditinggalkan sebagai TODO
  • MEM%

    • MEM% adalah persentase available physical memory yang saat ini digunakan task
    • Nilainya adalah RES dibagi total RAM
    • Contoh: jika RES adalah 400M dan RAM 8GB, maka 400/8192*100 = 4.88%

Proses bawaan Ubuntu Server 16.04

  • Meneliti proses yang dimulai pada Ubuntu Server 16.04.1 LTS x64 di droplet Digital Ocean yang masih fresh

  • /sbin/init

    • /sbin/init mengoordinasikan sisa proses boot dan menyusun lingkungan pengguna
    • Menjadi parent atau grandparent dari proses-proses yang dimulai otomatis
    • Hasil dpkg -S /sbin/init adalah systemd-sysv: /sbin/init, sehingga pada sistem tersebut ini adalah systemd
    • Tidak terjadi apa-apa meskipun di-kill
  • /lib/systemd/systemd-journald

    • systemd-journald adalah system service yang mengumpulkan dan menyimpan data logging
    • Membuat dan memelihara journal yang terstruktur dan terindeks berdasarkan informasi log yang diterima dari berbagai source
    • Menggunakan format file khusus yang dioptimalkan untuk pesan log, bukan file log teks biasa yang sederhana
    • Dilihat dengan journalctl
    • journalctl _COMM=sshd
    • journalctl _COMM=sshd -o json-pretty
    • journalctl --since yesterday
    • journalctl -b
    • journalctl -f
    • journalctl --disk-usage
    • journalctl --vacuum-size=1G
    • Sepertinya tidak bisa dihapus atau dinonaktifkan; yang bisa dilakukan hanya mematikan logging
  • /sbin/lvmetad -f

    • lvmetad melakukan cache metadata LVM agar perintah LVM dapat membaca metadata tanpa disk scan
    • Disk scan memakan waktu dan dapat mengganggu operasi normal sistem serta disk
    • LVM dapat dipandang sebagai “dynamic partitions” yang memungkinkan pembuatan, resize, dan penghapusan logical volume saat Linux sedang berjalan
    • Disimpulkan bahwa ini perlu dipertahankan jika sedang menggunakan LVM
  • /lib/systemd/udevd

    • systemd-udevd mendengarkan kernel uevent dan, untuk setiap event, menjalankan instruksi yang cocok dari udev rules
    • udev adalah device manager kernel Linux dan terutama mengelola device node di directory /dev
    • Tidak yakin apakah diperlukan di virtual server
  • /lib/systemd/timesyncd

    • systemd-timesyncd adalah system service yang menyinkronkan local system clock dengan remote NTP server
    • Menggantikan ntpd
    • Pada sistem contoh, timedatectl status menunjukkan network time dan NTP synchronized sebagai yes
    • Pada output netstat, hanya port SSH yang terlihat dalam status listening, dan tidak membuka banyak port UDP 123 seperti ntpd di Ubuntu 14.04
  • /usr/sbin/atd -f

    • atd menjalankan job yang dimasukkan ke queue untuk dijalankan nanti
    • at dan batch membaca perintah dari stdin atau file untuk dijalankan nanti
    • Berbeda dari cron yang menjadwalkan eksekusi berulang, at berjalan satu kali pada waktu tertentu
    • Dalam contoh, file dibuat 1 menit kemudian dengan echo "touch /tmp/yolo.txt" | at now + 1 minute
    • Jika tidak digunakan, hapus dengan sudo apt remove at -y --purge
  • /usr/lib/snapd/snapd

    • Snappy Ubuntu Core diperkenalkan sebagai rendition Ubuntu yang menggunakan transactional update
    • snap dijelaskan sebagai universal Linux package format yang memungkinkan satu binary package berjalan di desktop, server, cloud, dan device Linux
    • Dapat dipahami seperti deb package yang disederhanakan, dengan dependency dibundel dalam satu snap untuk didistribusikan
    • Karena belum pernah men-deploy atau mendistribusikan aplikasi dengan snappy di server, dihapus dengan sudo apt remove snapd -y --purge
  • /usr/bin/dbus-daemon

    • D-Bus adalah mekanisme IPC dan RPC antara beberapa process yang berjalan bersamaan pada machine yang sama
    • Diperlukan untuk desktop environment, tetapi dipertanyakan apakah diperlukan pada server yang menjalankan web app
    • Setelah menghapus dbus, timedatectl status gagal dengan Failed to create bus connection: No such file or directory
    • Karena itu disimpulkan sebaiknya tetap dipertahankan
  • /lib/systemd/systemd-logind

    • systemd-logind adalah system service yang mengelola login user
  • /usr/sbin/cron -f

    • cron adalah daemon yang menjalankan scheduled command
    • -f berarti foreground mode, tidak melakukan daemonize
    • Pekerjaan yang perlu dijalankan secara berkala dapat dijadwalkan dengan cron
    • crontab -e
    • Di Ubuntu, disimpulkan bahwa biasanya menggunakan /etc/cron.hourly, /etc/cron.daily, dan sejenisnya
    • Log dapat dilihat dengan cara berikut
    • grep cron /var/log/syslog
    • journalctl _COMM=cron
    • journalctl _COMM=cron --since="date" --until="date"
    • Kemungkinan besar cron akan dipertahankan
    • Jika tidak dihapus, dapat dihentikan dan dinonaktifkan dengan sudo systemctl stop cron, sudo systemctl disable cron
    • apt remove cron dapat mencoba menginstal postfix dan lainnya
    • Itu karena cron menyarankan mail transport agent
  • /usr/sbin/rsyslogd -n

    • rsyslogd adalah system utility yang mendukung message logging
    • Berperan mengisi file log di /var/log/, seperti /var/log/auth.log
    • File konfigurasi berada di /etc/rsyslog.d
    • Dapat mengirim log ke server jarak jauh untuk menyusun centralized logging
    • Dengan perintah logger, background script dapat meninggalkan pesan di /var/log/syslog
    • Meskipun systemd-journald sudah ada, rsyslog dan journal memiliki karakteristik yang berbeda, sehingga situasi penggunaan keduanya bersama bisa berguna
    • Karena itu untuk sementara dipertahankan
  • /usr/sbin/acpid

    • acpid adalah ACPI event daemon
    • Dirancang untuk memberi tahu user-space program tentang ACPI event
    • ACPI digunakan untuk hardware component discovery/configuration, power management, status monitoring, dan sebagainya
    • Karena tidak berniat melakukan suspend/resume di virtual server, dicoba untuk menghapusnya
    • reboot berhasil, tetapi setelah halt, Digital Ocean masih dikenali sebagai menyala sehingga harus Power Off dari web interface
    • Karena itu disimpulkan sebaiknya dipertahankan
  • /usr/bin/lxcfs /var/lib/lxcfs/

    • lxcfs adalah FUSE filesystem yang dirancang untuk LXC container
    • Menyediakan virtualized view untuk sebagian file /proc dan filtered access ke host cgroup filesystem
    • Membuat uptime, top, dan lainnya di dalam container memiliki hasil yang lebih “correct”
    • Jika tidak memakai LXC container, dapat dihapus dengan sudo apt remove lxcfs -y --purge
  • /usr/lib/accountservice/accounts-daemon

    • AccountsService menyediakan D-Bus interface dan implementasi untuk melakukan query dan manipulasi informasi user account
    • Implementasinya berbasis perintah usermod(8), useradd(8), userdel(8)
  • Setelah dihapus, apa yang akan rusak dibiarkan dengan ungkapan “Time will tell”

  • /sbin/mdadm

    • mdadm adalah utilitas Linux untuk mengelola dan memantau software RAID device
    • RAID adalah metode menggunakan beberapa hard drive seolah-olah satu drive
    • RAID 0 memperluas drive capacity
    • RAID 1, RAID 5, RAID 6, dan RAID 10 bertujuan mencegah data loss saat terjadi drive failure
    • Dapat dihapus dengan sudo apt remove mdadm -y --purge
  • /usr/lib/policykit-1/polkitd --no-debug

    • polkitd adalah daemon PolicyKit, dan polkit adalah Authorization Framework
    • Bisa dipahami seperti sudo yang fine-grained
    • Dapat memberikan hak kepada non-privileged user untuk melakukan action tertentu sebagai root
    • Contoh: mengizinkan reboot di desktop Linux
    • Di server, dirangkum bahwa ini dapat dihapus dengan sudo apt remove policykit-1 -y --purge
    • Apa yang akan rusak masih tetap menjadi pertanyaan
  • /usr/sbin/sshd -D

    • sshd adalah OpenSSH Daemon
    • Opsi -D membuatnya tidak detach dan tidak menjadi daemon, sehingga memudahkan monitoring
  • /sbin/iscsid

    • iscsid adalah background daemon yang berjalan sesuai configuration iSCSI dan mengelola connection
    • iSCSI adalah standard storage networking berbasis IP, yang meneruskan SCSI command melalui IP network agar remote storage dapat digunakan seperti local disk
    • Dapat dihapus dengan sudo apt remove open-iscsi -y --purge
  • /sbin/agetty --noclear tty1 linux

    • agetty adalah alternative Linux getty
    • getty mengelola physical atau virtual terminal, dan ketika koneksi terdeteksi, menampilkan username prompt lalu menjalankan program login
    • Di Digital Ocean, terminal ini dapat diakses dan diinteraksikan dari browser melalui Console pada droplet details
    • Setelah menghapus file terkait getty@tty1.service dan reboot, koneksi SSH masih bisa dilakukan, tetapi login melalui web console Digital Ocean tidak bisa
  • Sesi SSH, bash, htop

    • sshd: root@pts/0 berarti SSH session pengguna root disiapkan pada pseudoterminal pts/0
    • pseudoterminal meng-emulate text terminal nyata
    • bash adalah shell yang sedang digunakan
    • Jika diawali dash seperti -bash, artinya shell dimulai sebagai login shell
    • Shell yang karakter pertama argument zero-nya adalah - atau dimulai dengan opsi --login adalah login shell
    • Dalam kasus ini, shell membaca set configuration file yang berbeda
    • htop adalah interactive process viewer yang sedang berjalan di screenshot

Eksperimen penghapusan layanan

  • Daftar penghapusan umum adalah sebagai berikut
    • sudo apt remove lvm2 -y --purge
    • sudo apt remove at -y --purge
    • sudo apt remove snapd -y --purge
    • sudo apt remove lxcfs -y --purge
    • sudo apt remove mdadm -y --purge
    • sudo apt remove open-iscsi -y --purge
    • sudo apt remove accountsservice -y --purge
    • sudo apt remove policykit-1 -y --purge
  • Edisi Extreme mencakup pekerjaan berikut
    • sudo apt remove dbus -y --purge
    • sudo apt remove rsyslog -y --purge
    • sudo apt remove acpid -y --purge
    • sudo systemctl stop cron && sudo systemctl disable cron
    • sudo rm /etc/systemd/system/getty.target.wants/getty@tty1.service
    • sudo rm /lib/systemd/system/getty@.service
  • Konfigurasi nginx, PHP7, dan MySQL yang mengikuti panduan unattended installation of WordPress on Ubuntu Server berfungsi

Lampiran: alat investigasi dan perilaku shell

  • Mencari source code

    • Jika strace saja tidak cukup, source code dapat dilihat
    • Cari lokasi binary dengan which uptime, lalu cari Ubuntu package dengan dpkg -S /usr/bin/uptime
    • Dalam contoh, uptime termasuk dalam package procps
    • Di packages.ubuntu.com, Anda dapat mencari package dan menemukan link source repository
  • file descriptor dan redirection

    • Untuk me-redirect stderr ke stdout, gunakan 2>&1
    • echo something > file berarti menulis stdout ke file, sama dengan echo something 1> file
    • echo something 2> file menulis stderr ke file
    • echo something 2>1 berarti me-redirect stderr ke filename bernama 1
    • Pada 2>&1 yang diberi &, 1 bukan filename, melainkan stream ID
  • Masalah warna PuTTY

    • Jika elemen htop tampak hilang di PuTTY, ini dapat diatasi di pengaturan Window → Colours
    • Klik kanan title bar
    • Change settings...
    • Window → Colours
    • Pilih Both radio button
    • Apply
  • Shell sederhana yang dibuat dengan C

    • Shell sederhana yang ditulis dalam C menunjukkan penggunaan system call fork, exec, dan wait
    • Jika input adalah exit, shell keluar sebagai built-in
    • Perintah lainnya dijalankan dengan execlp di child setelah fork, sementara parent menunggu status selesai dengan waitpid
    • Contoh eksekusi date, true, dan false masing-masing menampilkan child exit code
    • Alasan pesan selesainya background process seperti sleep 1 & baru terlihat setelah menekan Enter adalah karena shell menunggu input, lalu memeriksa status background process saat perintah dimasukkan

Item investigasi tersisa dan riwayat revisi

  • Item yang ingin ditelusuri lebih lanjut meliputi process state substatus, kernel thread, /dev/pts, memori CODE·DATA·SWAP, panjang time slice, algoritme Linux scheduler, core pinning, manual page, warna bar CPU/memory, process ID limit dan fork bomb, lsof, ionice, schedtool, dan lainnya
  • Revisi dan pembaruan utama mencakup hal-hal berikut
    • idle time /proc/uptime adalah total dari semua core
    • printf parent/child pada contoh C zombie diperbaiki
    • Ditambahkan bahwa apt remove cron mencoba menginstal postfix karena dependency MTA
    • id dapat memuat informasi dari source lain selain /etc/passwd melalui /etc/nsswitch.conf
    • Penjelasan format password hash /etc/shadow ditambahkan
    • /etc/sudoers harus diedit dengan aman menggunakan visudo
    • Penjelasan MEM% ditambahkan
    • Bagian load average ditulis ulang
    • Signal default untuk kill 1234 diperbaiki dari INT menjadi TERM
    • Penjelasan color bar CPU dan memory ditambahkan

1 komentar

 
GN⁺ 5 jam lalu
Komentar Hacker News
  • Belakangan saya pindah ke btop; antarmukanya terasa cukup modern, berguna, dan informatif sesuai kebutuhan
    Seperti yang dikatakan orang lain, tampaknya juga menampilkan konsumsi daya (Watts), serta informasi jaringan, GPU, dan disk
    https://github.com/aristocratos/btop

    • btop bagus, tapi ada juga kekurangannya: tidak ada statistik zram/zswap (htop juga hanya mendukung zram), tidak ada pemecahan detail statistik ZFS, dan belum mendukung GPU Arc
      Bilah penggunaan disk tidak bisa dimatikan, jadi kalau jendela konsol tidak sangat besar, grafik kecepatan I/O terlihat sangat tertekan
    • Saya sudah lama memakai btop, dan yang terasa kurang paling hanya satu kolom port di sebelah kolom-kolom lain
      Grafik CPU/GPU mengambil ruang terlalu besar, dan secara keseluruhan saya ingin tabel file terbuka mendapat lebih banyak ruang
    • Saya kadang masih memakai Alpine sebagai image dasar container, tetapi btop tampaknya tidak mendukung musl, jadi tersisih
    • Karena saya penggemar btop, di MacBook baru bahkan saya menggantikan iStatMenu dengannya
  • Ada 2 pengaturan yang selalu saya ubah setiap memakai htop, dan dampaknya besar
    Pertama, mematikan thread pengguna. Umumnya itu hanya membuat tampilan htop berantakan dan hampir tidak memberi informasi berguna
    Kedua, mengaktifkan tampilan pohon proses. Dari mana sebuah proses dimulai sering kali lebih penting daripada informasi lain, dan proses seperti compiler yang memproses banyak file sambil memakan CPU juga jadi lebih mudah dilacak
    Secara pribadi, menurut saya keduanya seharusnya menjadi perilaku bawaan htop

    • Tampilan pohon proses memang bagus, tapi sayangnya saat diaktifkan, pembaruan dinamis dan pengurutan ulang daftar proses berhenti
  • Senang melihat penjelasan bahwa memori virtual sulit dipercaya. Cara yang ditampilkan Windows Task Manager secara default mengarah ke sini, dan itu buruk
    Resident Set Size (RSS) adalah indikator yang paling dapat dipercaya, sementara nilai lain bisa menggelembung keliru karena hal-hal seperti file yang dipetakan ke memori yang sebenarnya tidak menimbulkan masalah
    Misalnya, meski file log 2GB dipetakan ke memori, bagian itu hanya naik ke page saat dibaca, jadi sebenarnya tidak memakai memori nyata; tetapi pengguna melihat prosesnya lalu berkata, “kenapa aplikasi ini memakai memori sebanyak ini?”
    Chrome juga sempat mengalami masalah ini sehingga mengurangi penggunaan file yang dipetakan ke memori; bukan karena file yang dipetakan ke memori itu buruk, melainkan karena pengguna bereaksi berlebihan saat melihat angka yang bukan penggunaan memori fisik sebenarnya
    Di web bahkan ada panduan yang menyarankan menilai penggunaan dari alokasi memori virtual, tetapi tulisan ini setidaknya menunjukkan bagian itu dengan benar

    • Sebenarnya Proportional Set Size (PSS) lebih akurat daripada RSS
      Referensi: https://en.wikipedia.org/wiki/Proportional_set_size
    • Jika memakai file yang dipetakan ke memori, page yang di-cache masuk ke Resident Set Size proses tersebut
      Kalau memakai I/O file biasa, itu tidak ikut dihitung. Ini menghasilkan konsekuensi yang cukup menarik di cluster HPC yang memantau penggunaan memori tiap job lalu mematikannya jika melebihi jumlah yang diminta
    • Resident Set Size bukan jumlah memori yang diinginkan proses, melainkan jumlah yang diputuskan sistem operasi untuk diberikan kepada proses itu
      Begitu tekanan memori mulai terjadi, nilainya tidak lagi representatif. Saya sudah beberapa kali melihat keputusan keliru karena salah paham ini, dan pernah menghapus nilai ini dari chart untuk mencegah rekan tim mengambil kesimpulan sebaliknya
    • Tepatnya, Windows Task Manager memakai Private Working Set sebagai nilai default penggunaan memori proses, dan tidak memasukkan page yang dibagikan dengan proses lain seperti library atau file yang dipetakan ke memori
      Seperti namanya, ia hanya menunjukkan bagian yang dipetakan ke memori fisik yang dialokasikan secara privat per proses, dan lebih dekat dengan Resident Set di Unix
      Mungkin yang dimaksud adalah penggunaan memori di tab Performance, tetapi bisa disalahpahami sebagai semua item penggunaan memori, jadi saya bedakan di sini
  • Di top, menggunakan karakter > akan membuatnya diurutkan berdasarkan penggunaan memori
    Saya sesekali memakainya saat mencari penyebab host melambat, dan bisa juga melihat swapd memakan CPU

    • Untuk memori, saya lebih suka memakai M huruf besar, dan untuk CPU P huruf besar
  • Membaca tulisan seperti ini membuat saya sadar bahwa meski sudah memakai Linux setiap hari selama lebih dari 20 tahun, saya masih baru memanfaatkan sebagian kecil dari potensinya. Tulisan yang bagus

  • Rasanya HN mulai pulih lagi
    Semoga ini bukan masa zombie berjalan HN

    • Ada 3 artikel terkait AI di halaman depan, tapi salah satunya mengkritik keluaran berkualitas rendah, jadi saya mencoba berharap
    • Sepertinya sedang pulih dengan kembali ke tulisan pra-slop 7 tahun lalu
  • Bagi yang belum tahu nmon, ini juga layak dilihat
    Menekan h menampilkan daftar monitor yang tersedia, menekannya lagi menyembunyikannya, dan q untuk keluar
    https://nmon.sourceforge.io/pmwiki.php
    Khususnya throughput disk dan I/O yang dilihat dengan tombol d dan D cukup berguna

    • Saya mengetahuinya dari mesin-mesin AIX di kantor, dan jadi teringat topas juga
    • Ini alat yang sangat berguna, jadi saya memasangnya di semua mesin yang bisa saya kendalikan
      Saya suka karena grafik penggunaan Wide CPU menangani jumlah core besar dengan mudah
  • Dengan cara penggunaan yang berbeda dari keluarga *top, saya jadi lebih menyukai laporan diferensial ala ps yang tenang dan laporan seluruh sistem seperti vmstat
    Dengan begitu, semuanya tetap ada di buffer scrollback terminal: https://github.com/c-blake/procs
    Ditulis dalam bahasa Nim yang tidak umum tetapi efisien dan ekspresif

  • Saya mem-bookmark tulisan ini sejak 2016, dan selama bertahun-tahun sudah berkali-kali kembali menjadikannya rujukan