Majoritatea utilizatorilor Linux știu că /proc există. Puțini îl folosesc efectiv. Dar /proc este unul dintre cele mai utile instrumente de diagnosticare de pe întregul sistem - și nu necesită niciun pachet suplimentar.
/proc este un sistem de fișiere virtual. Nimic din el nu este stocat pe disc. Nucleul generează majoritatea acestor fișiere din mers, în momentul în care le citești. Gândește-te la el ca la o fereastră în timp real spre starea internă a nucleului: procese active, structura memoriei, informații despre procesor, statistici de rețea, întreruperi hardware și multe altele.
Odată ce începi să citești direct din /proc, vei înțelege exact de unde extrag datele unelte precum top, free, vmstat sau ss. Vei putea, de asemenea, să obții informații pe care acele unelte nu le expun.
Nucleul montează /proc ca un pseudo-sistem de fișiere de tip procfs. Apare în arborele de fișiere, dar nimic nu este scris pe disc. Fiecare citire declanșează o funcție din nucleu care asamblează datele în timp real.
Poți confirma tipul de montare cu:
mount | grep proc proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
Sub /proc există două categorii distincte. Prima: directoare numerotate precum /proc/1234/, câte unul pentru fiecare proces activ, unde numărul este PID-ul. A doua: fișiere și directoare globale precum /proc/meminfo, /proc/cpuinfo și /proc/net/, care expun starea la nivel de nucleu.
Totul poate fi citit cu unelte obișnuite: cat, grep, less, awk, chiar și o comandă simplă read din shell. Unele fișiere din /proc/sys/ sunt și inscriptibile, ceea ce este mecanismul prin care funcționează sysctl.
Tot ce știe nucleul despre nucleele procesorului.
cat /proc/cpuinfo
Fiecare CPU logic primește propriul bloc. Câmpuri relevante:
lscpu parsează același fișier și prezintă mai clar soclurile, nucleele și firele de execuțievmx sau svm pentru suport de virtualizare, aes pentru accelerare hardware AES, avx2 pentru suport SIMD AVX2siblings este mai mare decât cpu cores, SMT (hyperthreading) este activ și CPU-urile logice partajează nuclee fiziceNumără rapid CPU-urile logice:
grep -c '^processor' /proc/cpuinfo
Verifică dacă accelerarea hardware AES este prezentă (util înainte de a configura VPN-uri criptate sau criptare de disc):
grep -m1 'aes' /proc/cpuinfo
De aici preia free datele sale. Citind direct, obții mult mai multe detalii.
cat /proc/meminfo
Câmpuri importante:
Afișează rapid memoria disponibilă în megaocteți:
awk '/MemAvailable/ {printf "Available: %.0f MB\n", $2/1024}' /proc/meminfo
cat /proc/loadavg 0.42 0.38 0.35 2/412 29847
Primele trei numere sunt mediile de încărcare pe 1, 5 și 15 minute. Al patrulea câmp arată taskurile rulabile în momentul respectiv față de totalul de taskuri. Ultimul câmp este cel mai recent PID creat. Simplu, dar adesea suficient pentru o verificare rapidă într-un script.
cat /proc/uptime 345621.47 1234089.23
Două valori: secunde de la pornire și totalul de secunde în care toate CPU-urile au fost inactive. Util în scripturi când vrei uptime-ul fără a parsa ieșirea comenzii uptime.
Contoare brute de timp CPU, per CPU și agregat. Comenzile top și vmstat derivă procentele CPU prin eșantionarea acestui fișier de două ori și calcularea deltei.
cat /proc/stat | head -5
Coloanele după cpu: user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice. Coloana iowait merită urmărită pe serverele cu I/O intens.
Statistici I/O per dispozitiv. Aceasta este sursa pentru iostat.
cat /proc/diskstats | grep ' sda '
Câmpurile includ citiri/scrieri finalizate, sectoare citite/scrise și timp petrecut în I/O. Util pentru monitorizare scriptată fără a instala sysstat.
Un director plin de statistici de rețea. Câteva exemple notabile:
/proc/net/dev - contoare de octeți și pachete per interfață; sursă clasică pentru ifconfig și utilă pentru statistici brute de interfață în scripturi/proc/net/tcp și /proc/net/tcp6 - conexiuni TCP active în format hexazecimal de nivel scăzut; unelte mai vechi precum netstat citesc direct acestea; ss modern folosește interfața netlink a nucleului, mai rapidă/proc/net/sockstat - sumar al utilizării socket-urilor: câte TCP, UDP și raw socket-uri sunt în uz/proc/net/snmp - contoare SNMP inclusiv retransmisii, conexiuni eșuate și resetăriVerifică utilizarea totală a socket-urilor:
cat /proc/net/sockstat
Fiecare proces activ primește propriul director sub /proc/ denumit după PID. Acestea sunt de neprețuit pentru depanarea proceselor individuale fără a atașa un debugger.
Două scurtături te scutesc de căutarea PID-ului. /proc/self indică întotdeauna procesul care face citirea - foarte util în interiorul scripturilor:
cat /proc/self/status readlink /proc/self
Și $$ este PID-ul shell-ului curent, deci /proc/$$/ inspectează shell-ul în care tastezi:
cat /proc/$$/status | grep -E 'Pid|PPid'
Pentru orice altceva, găsește mai întâi PID-ul procesului:
pidof nginx 12345 12346 12347
Pentru un serviciu precum nginx sau Apache, primul PID este de obicei procesul master (adesea rulând ca root), iar restul sunt procese worker. Această diferență de proprietar contează: dictează ce fișiere din directoarele /proc ale acestora poți citi fără escaladare de privilegii.
Comanda exactă folosită pentru a lansa procesul, delimitată prin null. Util când ps trunchiază listele de argumente lungi.
cat /proc/12345/cmdline | tr '\0' ' ' nginx: worker process
Un rezumat lizibil al procesului: UID, GID, utilizarea memoriei, numărul de fire de execuție și mastile de semnale.
cat /proc/12345/status
VmRSS este dimensiunea setului rezident: câtă memorie din cea mapată a procesului este în RAM în momentul respectiv. Rețineți că RSS poate include pagini partajate cu alte procese, deci nu este un total pur per-proces. VmSwap arată dacă acest proces specific a fost trimis la swap.
Un director de symlink-uri, câte unul pentru fiecare descriptor de fișier deschis. Aceasta este sursa de date pentru lsof.
ls -la /proc/12345/fd/
Numără descriptorii de fișiere deschisi pentru un proces:
ls /proc/12345/fd | wc -l
Compară cu limita procesului din /proc/12345/limits pentru a vedea dacă te apropii de plafonul de fișiere deschise. Contează pentru servicii cu conexiuni multe, precum nginx sau Redis.
Contabilizarea I/O pe disc pentru proces.
cat /proc/12345/io
read_bytes și write_bytes urmăresc octeții efectiv trecuți prin stratul de stocare, spre deosebire de rchar și wchar de deasupra lor, care numără octeții din apeluri de sistem read/write (inclusiv hit-uri de cache). Util pentru identificarea procesului care suprasolicită discurile când iotop nu este disponibil.
maps afișează fiecare regiune de memorie mapată în proces: cod, stivă, heap, biblioteci partajate și fișiere mapate în memorie. smaps este versiunea detaliată cu RSS, PSS și utilizare swap per regiune. Aceasta este sursa de date pentru unelte ca smem.
grep 'libssl' /proc/12345/maps
Variabilele de mediu cu care a fost lansat procesul, delimitate prin null.
cat /proc/12345/environ | tr '\0' '\n' | grep PATH
Accesul este guvernat de verificările ptrace ale Linux, deci potrivirea UID-ului țintei nu este singurul factor; capabilitățile, namespace-urile și module ca Yama intră și ele în calcul. De reținut: reflectă mediul furnizat la momentul exec, nu neapărat mediul curent al procesului dacă a modificat variabile după pornire.
Symlink-uri la directorul de lucru curent al procesului și la executabilul propriu-zis de pe disc.
readlink /proc/12345/exe readlink /proc/12345/cwd
Astfel identifici binarul din spatele unui proces chiar dacă cmdline a fost modificat, sau dacă un proces rulează dintr-un fișier șters (frecvent la upgrade-urile de binare in-place). Verifică executabile șterse cu:
ls -la /proc/*/exe 2>/dev/null | grep deleted
Nucleul acordă un scor fiecărui proces pentru a ști pe cine să termine primul când memoria se epuizează. /proc/PID/oom_score este scorul curent, iar /proc/PID/oom_score_adj este ajustarea configurabilă (de la -1000 la 1000) pe care o setezi pentru a proteja sau sacrifica un proces.
cat /proc/12345/oom_score cat /proc/12345/oom_score_adj
Setează oom_score_adj la -1000 pentru a exclude un proces complet din selecția OOM killer, sau folosește o valoare pozitivă pentru a face un job batch consumator de memorie mult mai probabil să fie ales primul.
/proc este conștient de namespace-uri. Când ești înăuntrul unui container Docker, procfs reflectă namespace-ul PID al containerului, nu al gazdei. Deci ls /proc înăuntrul unui container arată doar procesele pe care containerul le poate vedea, iar PID 1 este entrypoint-ul containerului, nu init-ul gazdei.
cat /proc/1/cgroup cat /proc/1/status | grep -E 'Name|Pid' ls /proc | grep -E '^[0-9]+$'
Concluzia practică: nu presupune că un PID văzut înăuntrul unui container se mapează la același PID pe gazdă. Nu este așa. Nucleul translatează PID-urile între limitele de namespace, deci același proces are un PID pe gazdă și altul înăuntrul containerului. De aceea cifrele de memorie și CPU din /proc/meminfo și /proc/stat înăuntrul unui container arată adesea totalurile gazdei, nu limitele containerului - exact motivul pentru care uneltele anterioare cgroup-urilor raportează greșit resursele în containere.
Fișierele din /proc/sys/ sunt parametri configurabili ai nucleului inscriptibili. Exact aceasta citește și scrie sysctl.
cat /proc/sys/vm/swappiness echo 10 | sudo tee /proc/sys/vm/swappiness
Aceasta este echivalentul lui sysctl -w vm.swappiness10. Notă cu privire la ''tee: dacă scrii sudo echo 10 > /proc/sys/vm/swappiness, redirectarea este deschisă de shell înainte ca sudo să escaladeze privilegiile, deci eșuează cu permission denied. Direcționarea prin sudo tee este modelul fiabil pentru orice fișier inscriptibil din /proc. Modificările sunt imediate, dar nu persistă la repornire. Pentru a le persista, scrie în /etc/sysctl.conf sau un fișier din ''/etc/sysctl.d/=.
Câțiva parametri utili:
/proc/sys/vm/swappiness - tendința nucleului de a folosi swap; intervalul este 0-200 (era 0-100 pe nucleele mai vechi), implicit 60; valorile peste 100 au sens cu backend-uri swap rapide precum zram sau zswap/proc/sys/vm/vfs_cache_pressure - cât de agresiv să se recupereze obiectele director/inode din cache/proc/sys/net/ipv4/ip_forward - activează IP forwarding (necesar pentru rutare, VPN-uri, Docker etc.)/proc/sys/net/core/somaxconn - valoarea maximă pentru backlog-ul listen() al socket-ului; nucleele moderne au implicit 4096; creșterea ajută workload-urile cu rafale mari de conexiuni/proc/sys/fs/file-max - limita globală a sistemului pentru descriptori de fișiere deschisi/proc/sys/kernel/pid_max - valoarea de wrap pentru alocarea PID-urilor; sistemele mai vechi aveau plafonul la 32768; sistemele moderne rulează mult mai sus, deci verifică în loc să presupuiCâteva comenzi utile în situații reale.
Găsește ce proces folosește un port specific (fără ss sau lsof). Socket-ul inode-ului se află în /proc/net/tcp*, iar același inode apare ca symlink socket:[inode] în directorul fd/ al fiecărui proces:
# Port în hex: 80 '' 0050, 443 '' 01BB. Coloana 10 este inode-ul. inode=$(awk '$2 ~ /:01BB$/ {print $10; exit}' /proc/net/tcp6) ls -l /proc/*/fd/ 2>/dev/null | grep "socket:\[$inode\]"
Verifică dacă un proces este throttled de cgroups. Statisticile de throttling se află în cpu.stat al cgroup-ului, nu în /proc/PID/sched, deci găsește mai întâi cgroup-ul procesului:
cat /proc/12345/cgroup cat /sys/fs/cgroup/system.slice/myservice.service/cpu.stat | grep -E 'nr_throttled|throttled_usec'
Un nr_throttled în creștere înseamnă că procesul atinge cota sa de CPU.
Găsește procese cu fișiere șterse deschise (scurgeri de memorie de la rotația log-urilor sau upgrade-uri de binare):
find /proc/*/fd -ls 2>/dev/null | grep '(deleted)'
Monitorizare în timp real a presiunii memoriei:
watch -n1 'grep -E "MemAvailable|Dirty|Writeback|SwapFree" /proc/meminfo'
Contoare de întreruperi per CPU (util pentru diagnosticarea afinității IRQ și reglarea rețelei):
cat /proc/interrupts | head -20
Vei întâlni și /sys, un sistem de fișiere virtual separat numit sysfs. Dacă /proc este orientat spre procese și de uz general, /sys este structurat specific în jurul modelului de dispozitive al nucleului: drivere, magistrale, dispozitive bloc, management al energiei și topologie hardware.
De exemplu, scalarea frecvenței CPU se află în /sys/devices/system/cpu/cpu0/cpufreq/, nu în /proc. Setările scheduler-ului pentru dispozitive bloc sunt în /sys/block/sda/queue/scheduler. Sunt complementare - merită să le cunoști pe amândouă.
Odată ce te obișnuiești să citești direct din /proc, o mare parte din munca de performanță și depanare Linux devine mai curată. Nu mai depinzi de unelte instalate. Poți scrie scripturi de monitorizare mai rapide și mai simple. Și înțelegi exact ce fac uneltele de nivel înalt sub capotă.
Fișierele-cheie de marcat: /proc/meminfo, /proc/cpuinfo, /proc/stat, /proc/net/dev și structura de directoare per-proces din /proc/PID/.