Ricerca nel sito web

LFCS: monitorare l'utilizzo delle risorse dei processi Linux e impostare i limiti dei processi in base all'utente - Parte 14


A causa delle recenti modifiche agli obiettivi dell'esame di certificazione LFCS in vigore dal 2 febbraio 2016, stiamo aggiungendo gli articoli necessari alla serie LFCS pubblicata qui. Per prepararti a questo esame, ti consigliamo vivamente di seguire anche la serie LFCE.

Ogni amministratore di sistema Linux deve sapere come verificare l'integrità e la disponibilità di hardware, risorse e processi chiave. Inoltre, anche l'impostazione dei limiti delle risorse in base al singolo utente deve far parte delle sue competenze.

In questo articolo esploreremo alcuni modi per garantire che il sistema, sia l'hardware che il software, funzionino correttamente per evitare potenziali problemi che potrebbero causare tempi di inattività imprevisti della produzione e perdite di denaro.

Statistiche dei processori di reporting Linux

Con mpstat puoi visualizzare le attività di ciascun processore individualmente o del sistema nel suo insieme, sia come istantanea singola che dinamicamente.

Per utilizzare questo strumento, dovrai installare sysstat:

yum update && yum install sysstat              [On CentOS based systems]
aptitutde update && aptitude install sysstat   [On Ubuntu based systems]
zypper update && zypper install sysstat        [On openSUSE systems]

Scopri di più su sysstat e sulle sue utilità su Impara Sysstat e le sue utilità mpstat, pidstat, iostat e sar in Linux

Una volta installato mpstat, utilizzalo per generare report sulle statistiche dei processori.

Per visualizzare 3 report globali sull'utilizzo della CPU (-u) per tutte le CPU (come indicato da -P ALL) a intervalli di 2 secondi , Fare:

mpstat -P ALL -u 2 3
Uscita del campione
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:41:07  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:09  IST  all    5.85    0.00    1.12    0.12    0.00    0.00    0.00    0.00    0.00   92.91
11:41:09  IST    0    4.48    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   94.53
11:41:09  IST    1    2.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:09  IST    2    6.44    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   92.57
11:41:09  IST    3   10.45    0.00    1.99    0.00    0.00    0.00    0.00    0.00    0.00   87.56

11:41:09  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:11  IST  all   11.60    0.12    1.12    0.50    0.00    0.00    0.00    0.00    0.00   86.66
11:41:11  IST    0   10.50    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   88.50
11:41:11  IST    1   14.36    0.00    1.49    2.48    0.00    0.00    0.00    0.00    0.00   81.68
11:41:11  IST    2    2.00    0.50    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:41:11  IST    3   19.40    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   79.60

11:41:11  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:13  IST  all    5.69    0.00    1.24    0.00    0.00    0.00    0.00    0.00    0.00   93.07
11:41:13  IST    0    2.97    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   95.54
11:41:13  IST    1   10.78    0.00    1.47    0.00    0.00    0.00    0.00    0.00    0.00   87.75
11:41:13  IST    2    2.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:13  IST    3    6.93    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   92.57

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    7.71    0.04    1.16    0.21    0.00    0.00    0.00    0.00    0.00   90.89
Average:       0    5.97    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   92.87
Average:       1    9.24    0.00    1.16    0.83    0.00    0.00    0.00    0.00    0.00   88.78
Average:       2    3.49    0.17    1.00    0.00    0.00    0.00    0.00    0.00    0.00   95.35
Average:       3   12.25    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   86.59

Per visualizzare le stesse statistiche per una CPU specifica (CPU 0 nell'esempio seguente), utilizzare:

mpstat -P 0 -u 2 3
Uscita del campione
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:42:08  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:42:10  IST    0    3.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:42:12  IST    0    4.08    0.00    0.00    2.55    0.00    0.00    0.00    0.00    0.00   93.37
11:42:14  IST    0    9.74    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   89.74
Average:       0    5.58    0.00    0.34    0.85    0.00    0.00    0.00    0.00    0.00   93.23

L'output dei comandi precedenti mostra queste colonne:

  1. CPU: numero del processore come numero intero o la parola all come media per tutti i processori.
  2. %usr: percentuale di utilizzo della CPU durante l'esecuzione di applicazioni a livello utente.
  3. %nice: uguale a %usr, ma con priorità nice.
  4. %sys: percentuale di utilizzo della CPU verificatasi durante l'esecuzione delle applicazioni del kernel. Ciò non include il tempo impiegato a gestire le interruzioni o a gestire l'hardware.
  5. %iowait: percentuale di tempo in cui una determinata CPU (o tutte) era inattiva, durante il quale era pianificata un'operazione di I/O ad alto utilizzo di risorse su quella CPU. Una spiegazione più dettagliata (con esempi) può essere trovata qui.
  6. %irq: percentuale di tempo impiegato per la manutenzione degli interrupt hardware.
  7. %soft: uguale a %irq, ma con interruzioni software.
  8. %steal: percentuale di tempo trascorso in attesa involontaria (steal o tempo rubato) quando una macchina virtuale, come ospite, "conquista" l'attenzione dell'hypervisor mentre compete per le CPU. Questo valore dovrebbe essere mantenuto il più basso possibile. Un valore elevato in questo campo significa che la macchina virtuale è in stallo – o lo sarà presto.
  9. %guest: percentuale di tempo trascorso eseguendo un processore virtuale.
  10. %idle: percentuale di tempo in cui le CPU non stavano eseguendo alcuna attività. Se si osserva un valore basso in questa colonna, ciò indica che il sistema è sottoposto a un carico pesante. In tal caso, dovrai dare un'occhiata più da vicino all'elenco dei processi, come discuteremo tra un minuto, per determinare cosa lo sta causando.

Per sottoporre il processore a un carico piuttosto elevato, esegui i seguenti comandi e quindi esegui mpstat (come indicato) in un terminale separato:

dd if=/dev/zero of=test.iso bs=1G count=1
mpstat -u -P 0 2 3
ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
mpstat -u -P 0 2 3

Infine, confronta con l’output di mpstat in circostanze “normali”:

Come puoi vedere nell'immagine sopra, la CPU 0 era sotto carico pesante durante i primi due esempi, come indicato dalla colonna %idle.

Nella prossima sezione discuteremo come identificare questi processi assetati di risorse, come ottenere maggiori informazioni su di essi e come intraprendere le azioni appropriate.

Segnalazione dei processi Linux

Per elencare i processi ordinandoli in base all'utilizzo della CPU, utilizzeremo il noto comando ps con -eo (per selezionare tutti i processi con formato definito dall'utente) e --sort (per specificare un ordinamento personalizzato), in questo modo:

ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

Il comando precedente mostrerà solo il PID, PPID, il comando associato al processo e la percentuale di utilizzo di CPU e RAM ordinata in base alla percentuale di utilizzo della CPU in ordine decrescente . Se eseguito durante la creazione del file .iso, ecco le prime righe dell'output:

Una volta identificato un processo di interesse (come quello con PID=2822), possiamo navigare verso /proc/PID (/proc/2822 in questo caso) ed eseguire un elenco di directory.

Questa directory è dove vengono conservati diversi file e sottodirectory con informazioni dettagliate su questo particolare processo mentre è in esecuzione.

Per esempio:
  1. /proc/2822/io contiene le statistiche IO per il processo (numero di caratteri e byte letti e scritti, tra gli altri, durante le operazioni IO).
  2. /proc/2822/attr/current mostra gli attuali attributi di sicurezza SELinux del processo.
  3. /proc/2822/cgroup descrive i gruppi di controllo (cgroups in breve) a cui appartiene il processo se l'opzione di configurazione del kernel CONFIG_CGROUPS è abilitata, che puoi verificare con:
cat /boot/config-$(uname -r) | grep -i cgroups

Se l'opzione è abilitata, dovresti vedere:

CONFIG_CGROUPS=y

Utilizzando cgroups è possibile gestire la quantità di utilizzo consentito delle risorse in base al processo, come spiegato nei capitoli da 1 a 4 della guida Red Hat Enterprise Linux 7 Resource Management, nel capitolo 9 dell'analisi del sistema openSUSE e guida all'ottimizzazione e nella sezione Gruppi di controllo della documentazione di Ubuntu 14.04 Server.

/proc/2822/fd è una directory che contiene un collegamento simbolico per ogni descrittore di file aperto dal processo. L'immagine seguente mostra queste informazioni per il processo avviato in tty1 (il primo terminale) per creare l'immagine .iso:

L'immagine sopra mostra che stdin (descrittore di file 0), stdout (descrittore di file 1) e stderr (descrittore di file 2) sono mappati su /dev/zero, /root/test.iso e /dev/tty1, rispettivamente.

Maggiori informazioni su /proc possono essere trovate nel documento "The /proc filesystem " conservato e mantenuto da Kernel.org e nel Linux Programmer's Manual.

Impostazione dei limiti delle risorse in base all'utente in Linux

Se non si presta attenzione e si consente a qualsiasi utente di eseguire un numero illimitato di processi, è possibile che si verifichi un arresto imprevisto del sistema o si venga bloccati poiché il sistema entra in uno stato inutilizzabile. Per evitare che ciò accada, dovresti porre un limite al numero di processi che gli utenti possono avviare.

Per fare ciò, modifica /etc/security/limits.conf e aggiungi la seguente riga in fondo al file per impostare il limite:

*   	hard	nproc   10

Il primo campo può essere utilizzato per indicare un utente, un gruppo o tutti loro (*), mentre il secondo campo impone un limite rigido al numero di processi (nproc) su 10. Per applicare le modifiche è sufficiente disconnettersi e rientrare.

Quindi, vediamo cosa succede se un certo utente diverso da root (legittimo o meno) tenta di avviare una shell fork bomb. Se non avessimo implementato i limiti, questo avvierebbe inizialmente due istanze di una funzione, per poi duplicarle ciascuna in un ciclo infinito. Pertanto, alla fine porterebbe il tuo sistema a una scansione.

Tuttavia, con la limitazione di cui sopra in atto, la fork bomb non ha successo ma l'utente verrà comunque bloccato finché l'amministratore di sistema non interrompe il processo ad essa associato:

TIP: altre possibili restrizioni rese possibili da ulimit sono documentate nel file limits.conf.

Linux Altri strumenti di gestione dei processi

Oltre agli strumenti discussi in precedenza, un amministratore di sistema potrebbe anche dover:

a) Modificare la priorità di esecuzione (utilizzo delle risorse di sistema) di un processo utilizzando renice. Ciò significa che il kernel assegnerà più o meno risorse di sistema al processo in base alla priorità assegnata (un numero comunemente noto come “niceness” in un intervallo da -20 a 19).

Più basso è il valore, maggiore è la priorità di esecuzione. Gli utenti regolari (diversi da root) possono solo modificare la qualità dei processi di cui sono proprietari impostando un valore più alto (ovvero una priorità di esecuzione inferiore), mentre root può modificare questo valore per qualsiasi processo e può aumentarlo o diminuirlo.

La sintassi di base di renice è la seguente:

renice [-n] <new priority> <UID, GID, PGID, or empty> identifier

Se l'argomento dopo il nuovo valore di priorità non è presente (vuoto), viene impostato su PID per impostazione predefinita. In tal caso, la correttezza del processo con PID=identifier è impostata su .

b) Interrompere la normale esecuzione di un processo quando necessario. Questo è comunemente noto come “uccidere” il processo. Dietro le quinte, ciò significa inviare al processo un segnale per terminare la sua esecuzione correttamente e rilasciare tutte le risorse utilizzate in modo ordinato.

Per terminare un processo, utilizza il comando kill come segue:

kill PID

In alternativa, puoi utilizzare pkill per terminare tutti i processi di un dato proprietario (-u), o di un proprietario di gruppo (-G), o anche quei processi che hanno un PPID in comune (-P). Queste opzioni possono essere seguite dalla rappresentazione numerica o dal nome vero e proprio come identificatore:

pkill [options] identifier

Per esempio,

pkill -G 1000

ucciderà tutti i processi di proprietà del gruppo con GID=1000.

E,

pkill -P 4993 

ucciderà tutti i processi il cui PPID è 4993.

Prima di eseguire un pkill, è una buona idea testare prima i risultati con pgrep, magari usando anche l'opzione -l per elencare i nomi dei processi. Utilizza le stesse opzioni ma restituisce solo i PID dei processi (senza intraprendere alcuna ulteriore azione) che verrebbero terminati se si utilizzasse pkill.

pgrep -l -u gacanepa

Ciò è illustrato nell'immagine successiva:

Riepilogo

In questo articolo abbiamo esplorato alcuni modi per monitorare l'utilizzo delle risorse al fine di verificare l'integrità e la disponibilità dei componenti hardware e software critici in un sistema Linux.

Abbiamo anche imparato come intraprendere azioni appropriate (adattando la priorità di esecuzione di un dato processo o terminandolo) in circostanze insolite.

Ci auguriamo che i concetti spiegati in questo tutorial siano stati utili. Se avete domande o commenti, non esitate a contattarci utilizzando il modulo di contatto sottostante.