Diferențe
Aici sunt prezentate diferențele dintre versiunile selectate și versiunea curentă a paginii.
| Urmatoarea versiune | Versiuni anterioare | ||
| sistemul_de_fisiere_proc [2026/08/18 05:29] – creat thinkroot | sistemul_de_fisiere_proc [2026/08/18 05:33] (curent) – [Vezi și] thinkroot | ||
|---|---|---|---|
| Linia 1: | Linia 1: | ||
| ====== Sistemul de fișiere /proc în Linux ====== | ====== Sistemul de fișiere /proc în Linux ====== | ||
| - | 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. | + | Majoritatea utilizatorilor Linux știu că '' |
| - | =/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 | + | Odată ce începi să citești direct din '' |
| ===== Ce este /proc ===== | ===== Ce este /proc ===== | ||
| - | Nucleul montează | + | Nucleul montează |
| Poți confirma tipul de montare cu: | Poți confirma tipul de montare cu: | ||
| Linia 18: | Linia 18: | ||
| </ | </ | ||
| - | Sub =/proc= există două categorii distincte. Prima: directoare numerotate precum | + | Sub '' |
| - | Totul poate fi citit cu unelte obișnuite: | + | Totul poate fi citit cu unelte obișnuite: |
| ===== Fișiere globale utile ===== | ===== Fișiere globale utile ===== | ||
| Linia 36: | Linia 36: | ||
| * **model name** - șirul cu modelul procesorului | * **model name** - șirul cu modelul procesorului | ||
| * **cpu MHz** - frecvența curentă (se actualizează dinamic odată cu scalarea frecvenței) | * **cpu MHz** - frecvența curentă (se actualizează dinamic odată cu scalarea frecvenței) | ||
| - | * **cache size** - dimensiunea cache-ului raportat de arhitectură; | + | * **cache size** - dimensiunea cache-ului raportat de arhitectură; |
| - | * **flags** - caracteristici ale procesorului; | + | * **flags** - caracteristici ale procesorului; |
| - | * **siblings vs cpu cores** - dacă =siblings= este mai mare decât | + | * **siblings vs cpu cores** - dacă '' |
| Numără rapid CPU-urile logice: | Numără rapid CPU-urile logice: | ||
| Linia 54: | Linia 54: | ||
| ==== / | ==== / | ||
| - | De aici preia =free= datele sale. Citind direct, obții mult mai multe detalii. | + | De aici preia '' |
| <code bash> | <code bash> | ||
| Linia 94: | Linia 94: | ||
| </ | </ | ||
| - | 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 | + | 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 |
| ==== /proc/stat ==== | ==== /proc/stat ==== | ||
| - | Contoare brute de timp CPU, per CPU și agregat. Comenzile | + | Contoare brute de timp CPU, per CPU și agregat. Comenzile |
| <code bash> | <code bash> | ||
| Linia 104: | Linia 104: | ||
| </ | </ | ||
| - | Coloanele după =cpu=: user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice. Coloana | + | Coloanele după '' |
| ==== / | ==== / | ||
| - | Statistici I/O per dispozitiv. Aceasta este sursa pentru | + | Statistici I/O per dispozitiv. Aceasta este sursa pentru |
| <code bash> | <code bash> | ||
| Linia 114: | Linia 114: | ||
| </ | </ | ||
| - | Câmpurile includ citiri/ | + | Câmpurile includ citiri/ |
| ==== /proc/net/ ==== | ==== /proc/net/ ==== | ||
| Linia 120: | Linia 120: | ||
| Un director plin de statistici de rețea. Câteva exemple notabile: | Un director plin de statistici de rețea. Câteva exemple notabile: | ||
| - | * **=/ | + | * **'' |
| - | * **=/ | + | * **'' |
| - | * **=/ | + | * **'' |
| - | * **=/ | + | * **'' |
| Verifică utilizarea totală a socket-urilor: | Verifică utilizarea totală a socket-urilor: | ||
| Linia 133: | Linia 133: | ||
| ===== Directoarele per-proces: /proc/PID/ ===== | ===== Directoarele per-proces: /proc/PID/ ===== | ||
| - | 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. | + | Fiecare proces activ primește propriul director sub '' |
| - | Două scurtături te scutesc de căutarea PID-ului. | + | Două scurtături te scutesc de căutarea PID-ului. |
| <code bash> | <code bash> | ||
| Linia 142: | Linia 142: | ||
| </ | </ | ||
| - | Și =$$= este PID-ul shell-ului curent, deci =/proc/$$/= inspectează shell-ul în care tastezi: | + | Și '' |
| <code bash> | <code bash> | ||
| Linia 155: | Linia 155: | ||
| </ | </ | ||
| - | 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 | + | 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 |
| ==== / | ==== / | ||
| - | Comanda exactă folosită pentru a lansa procesul, delimitată prin null. Util când =ps= trunchiază listele de argumente lungi. | + | Comanda exactă folosită pentru a lansa procesul, delimitată prin null. Util când '' |
| <code bash> | <code bash> | ||
| Linia 174: | Linia 174: | ||
| </ | </ | ||
| - | =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. | + | '' |
| ==== / | ==== / | ||
| - | Un director de symlink-uri, | + | Un director de symlink-uri, |
| <code bash> | <code bash> | ||
| Linia 190: | Linia 190: | ||
| </ | </ | ||
| - | Compară cu limita procesului din =/ | + | Compară cu limita procesului din '' |
| ==== / | ==== / | ||
| Linia 200: | Linia 200: | ||
| </ | </ | ||
| - | =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. | + | '' |
| <code bash> | <code bash> | ||
| Linia 229: | Linia 229: | ||
| </ | </ | ||
| - | 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: | + | Astfel identifici binarul din spatele unui proces chiar dacă '' |
| <code bash> | <code bash> | ||
| Linia 237: | Linia 237: | ||
| ==== / | ==== / | ||
| - | Nucleul acordă un scor fiecărui proces pentru a ști pe cine să termine primul când memoria se epuizează. | + | Nucleul acordă un scor fiecărui proces pentru a ști pe cine să termine primul când memoria se epuizează. |
| <code bash> | <code bash> | ||
| Linia 244: | Linia 244: | ||
| </ | </ | ||
| - | Setează | + | Setează |
| ===== /proc în containere ===== | ===== /proc în containere ===== | ||
| - | =/proc= este conștient de namespace-uri. Când ești înăuntrul unui container Docker, procfs reflectă namespace-ul PID al containerului, | + | '' |
| <code bash> | <code bash> | ||
| Linia 256: | Linia 256: | ||
| </ | </ | ||
| - | 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 =/ | + | 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 '' |
| ===== Scrierea în /proc/sys/ cu sysctl ===== | ===== Scrierea în /proc/sys/ cu sysctl ===== | ||
| - | Fișierele din =/proc/sys/= sunt parametri configurabili ai nucleului inscriptibili. Exact aceasta citește și scrie =sysctl=. | + | Fișierele din '' |
| <code bash> | <code bash> | ||
| Linia 267: | Linia 267: | ||
| </ | </ | ||
| - | Aceasta este echivalentul lui =sysctl -w vm.swappiness=10=. Notă cu privire la =tee=: dacă scrii =sudo echo 10 > / | + | Aceasta este echivalentul lui '' |
| Câțiva parametri utili: | Câțiva parametri utili: | ||
| - | * **=/ | + | * **'' |
| - | * **=/ | + | * **'' |
| - | * **=/ | + | * **'' |
| - | * **=/ | + | * **'' |
| - | * **=/ | + | * **'' |
| - | * **=/ | + | * **'' |
| ===== Rețete practice cu /proc ===== | ===== Rețete practice cu /proc ===== | ||
| Linia 282: | Linia 282: | ||
| Câteva comenzi utile în situații reale. | Câteva comenzi utile în situații reale. | ||
| - | **Găsește ce proces folosește un port specific** (fără | + | **Găsește ce proces folosește un port specific** (fără |
| <code bash> | <code bash> | ||
| - | # Port în hex: 80 = 0050, 443 = 01BB. Coloana 10 este inode-ul. | + | # Port în hex: 80 '' |
| inode=$(awk '$2 ~ /:01BB$/ {print $10; exit}' / | inode=$(awk '$2 ~ /:01BB$/ {print $10; exit}' / | ||
| ls -l /proc/*/fd/ 2>/ | ls -l /proc/*/fd/ 2>/ | ||
| </ | </ | ||
| - | **Verifică dacă un proces este throttled de cgroups**. Statisticile de throttling se află în =cpu.stat= al cgroup-ului, | + | **Verifică dacă un proces este throttled de cgroups**. Statisticile de throttling se află în '' |
| <code bash> | <code bash> | ||
| Linia 297: | Linia 297: | ||
| </ | </ | ||
| - | Un =nr_throttled= în creștere înseamnă că procesul atinge cota sa de CPU. | + | Un '' |
| **Găsește procese cu fișiere șterse deschise** (scurgeri de memorie de la rotația log-urilor sau upgrade-uri de binare): | **Găsește procese cu fișiere șterse deschise** (scurgeri de memorie de la rotația log-urilor sau upgrade-uri de binare): | ||
| Linia 319: | Linia 319: | ||
| ===== /proc față de /sys ===== | ===== /proc față de /sys ===== | ||
| - | Vei întâlni și =/sys=, un sistem de fișiere virtual separat numit sysfs. Dacă =/proc= este orientat spre procese și de uz general, | + | Vei întâlni și '' |
| - | De exemplu, scalarea frecvenței CPU se află în =/ | + | De exemplu, scalarea frecvenței CPU se află în '' |
| ===== Concluzie ===== | ===== Concluzie ===== | ||
| - | 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ă. | + | Odată ce te obișnuiești să citești direct din '' |
| - | Fișierele-cheie de marcat: | + | Fișierele-cheie de marcat: |
| ===== Vezi și ===== | ===== Vezi și ===== | ||
| * [[https:// | * [[https:// | ||
| - | * [[linux: | ||
| - | * [[linux: | ||
| - | * [[linux: | ||
| - | * [[linux: | ||
| ---- | ---- | ||
| {{tag> | {{tag> | ||