LFCS: Παρακολούθηση χρήσης πόρων των διαδικασιών Linux και ορισμός ορίων διαδικασίας ανά χρήστη - Μέρος 14


Λόγω των πρόσφατων τροποποιήσεων στους στόχους της εξέτασης πιστοποίησης LFCS που ισχύουν από τις 2 Φεβρουαρίου 2016, προσθέτουμε τα απαραίτητα άρθρα στη σειρά LFCS που δημοσιεύεται εδώ. Για να προετοιμαστείτε για αυτήν την εξέταση, σας ενθαρρύνουμε να περάσετε και από τη σειρά LFCE.

Κάθε διαχειριστής συστήματος Linux πρέπει να γνωρίζει πώς να επαληθεύει την ακεραιότητα και τη διαθεσιμότητα του υλικού, των πόρων και των βασικών διαδικασιών. Επιπλέον, ο καθορισμός ορίων πόρων ανά χρήστη πρέπει επίσης να αποτελεί μέρος του συνόλου δεξιοτήτων του/της.

Σε αυτό το άρθρο θα διερευνήσουμε μερικούς τρόπους για να διασφαλίσουμε ότι το σύστημα τόσο το υλικό όσο και το λογισμικό συμπεριφέρονται σωστά για την αποφυγή πιθανών ζητημάτων που μπορεί να προκαλέσουν απροσδόκητο χρόνο διακοπής της παραγωγής και απώλεια χρημάτων.

Στατιστικά στοιχεία επεξεργαστών αναφοράς Linux

Με το mpstat μπορείτε να προβάλετε τις δραστηριότητες για κάθε επεξεργαστή ξεχωριστά ή το σύστημα ως σύνολο, τόσο ως στιγμιότυπο μιας χρήσης όσο και δυναμικά.

Για να χρησιμοποιήσετε αυτό το εργαλείο, θα χρειαστεί να εγκαταστήσετε το 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]

Διαβάστε περισσότερα για το sysstat and it's utilities στο Learn Sysstat and Its Utilities mpstat, pidstat, iostat και sar στο Linux

Αφού εγκαταστήσετε το mpstat, χρησιμοποιήστε το για να δημιουργήσετε αναφορές στατιστικών στοιχείων επεξεργαστών.

Για εμφάνιση 3 συνολικών αναφορών χρήσης της CPU (-u) για όλες τις CPU (όπως υποδεικνύεται από το -P ALL) σε διάστημα 2 δευτερολέπτων , κάνω:

mpstat -P ALL -u 2 3
Δείγμα εξόδου
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

Για να δείτε τα ίδια στατιστικά στοιχεία για μια συγκεκριμένη CPU (CPU 0 στο παρακάτω παράδειγμα), χρησιμοποιήστε:

mpstat -P 0 -u 2 3
Δείγμα εξόδου
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

Η έξοδος των παραπάνω εντολών δείχνει αυτές τις στήλες:

  1. CPU: Ο αριθμός του επεξεργαστή ως ακέραιος ή η λέξη all ως μέσος όρος για όλους τους επεξεργαστές.
  2. %usr: Ποσοστό χρήσης της CPU κατά την εκτέλεση εφαρμογών σε επίπεδο χρήστη.
  3. %nice: Το ίδιο με το %usr, αλλά με καλή προτεραιότητα.
  4. %sys: Ποσοστό χρήσης της CPU που προέκυψε κατά την εκτέλεση εφαρμογών πυρήνα. Αυτό δεν περιλαμβάνει το χρόνο που αφιερώνεται στην αντιμετώπιση διακοπών ή στο χειρισμό του υλικού.
  5. %iowait: Ποσοστό χρόνου κατά τον οποίο η συγκεκριμένη CPU (ή ολόκληρη) ήταν αδρανής, κατά τη διάρκεια της οποίας είχε προγραμματιστεί μια λειτουργία I/O με ένταση πόρων σε αυτήν τη CPU. Μια πιο αναλυτική εξήγηση (με παραδείγματα) μπορείτε να βρείτε εδώ.
  6. %irq: Ποσοστό του χρόνου που δαπανάται για τη συντήρηση των διακοπών υλικού.
  7. %soft: Το ίδιο με το %irq, αλλά με διακοπές λογισμικού.
  8. %steal: Ποσοστό του χρόνου που δαπανάται σε ακούσια αναμονή (κλοπή ή κλοπή) όταν μια εικονική μηχανή, ως επισκέπτης, "κερδίζει" την προσοχή του υπερεπόπτη ενώ ανταγωνίζεται για την/τις CPU(ες). Αυτή η τιμή πρέπει να διατηρείται όσο το δυνατόν μικρότερη. Μια υψηλή τιμή σε αυτό το πεδίο σημαίνει ότι η εικονική μηχανή καθυστερεί - ή σύντομα θα σταματήσει.
  9. %guest: Ποσοστό του χρόνου που αφιερώθηκε σε έναν εικονικό επεξεργαστή.
  10. %idle: ποσοστό του χρόνου που οι CPU δεν εκτελούσαν εργασίες. Εάν παρατηρήσετε μια χαμηλή τιμή σε αυτή τη στήλη, αυτό είναι ένδειξη ότι το σύστημα έχει τοποθετηθεί κάτω από μεγάλο φορτίο. Σε αυτήν την περίπτωση, θα χρειαστεί να ρίξετε μια πιο προσεκτική ματιά στη λίστα διαδικασιών, όπως θα συζητήσουμε σε ένα λεπτό, για να προσδιορίσετε τι την προκαλεί.

Για να τοποθετήσετε τον επεξεργαστή κάτω από ένα κάπως υψηλό φορτίο, εκτελέστε τις ακόλουθες εντολές και, στη συνέχεια, εκτελέστε το mpstat (όπως υποδεικνύεται) σε ένα ξεχωριστό τερματικό:

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

Τέλος, συγκρίνετε με την έξοδο του mpstat υπό "κανονικές" συνθήκες:

Όπως μπορείτε να δείτε στην παραπάνω εικόνα, η CPU 0 ήταν υπό μεγάλο φορτίο κατά τα δύο πρώτα παραδείγματα, όπως υποδεικνύεται από τη στήλη %idle.

Στην επόμενη ενότητα θα συζητήσουμε πώς να αναγνωρίσουμε αυτές τις διεργασίες που απαιτούν πόρους, πώς να αποκτήσετε περισσότερες πληροφορίες σχετικά με αυτές και πώς να λάβετε τα κατάλληλα μέτρα.

Αναφορά διαδικασιών Linux

Για να απαριθμήσουμε τις διεργασίες ταξινομώντας τις κατά χρήση της CPU, θα χρησιμοποιήσουμε τη γνωστή εντολή ps με το -eo (για να επιλέξουμε όλες τις διεργασίες με μορφή που ορίζει ο χρήστης) και --sort (για να καθορίσετε μια προσαρμοσμένη σειρά ταξινόμησης) επιλογές, όπως:

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

Η παραπάνω εντολή θα εμφανίζει μόνο τα PID, PPID, την εντολή που σχετίζεται με τη διαδικασία και το ποσοστό χρήσης της CPU και της RAM ταξινομημένα κατά το ποσοστό χρήσης της CPU με φθίνουσα σειρά . Όταν εκτελείται κατά τη δημιουργία του αρχείου .iso, ακολουθούν οι πρώτες γραμμές της εξόδου:

Αφού εντοπίσουμε μια διαδικασία που μας ενδιαφέρει (όπως αυτή με PID=2822), μπορούμε να πλοηγηθούμε στο /proc/PID (/proc/2822 σε αυτήν την περίπτωση) και κάντε μια λίστα καταλόγου.

Αυτός ο κατάλογος είναι όπου διατηρούνται πολλά αρχεία και υποκατάλογοι με λεπτομερείς πληροφορίες σχετικά με τη συγκεκριμένη διαδικασία ενώ εκτελείται.

Για παράδειγμα:
  1. Το /proc/2822/io περιέχει στατιστικά στοιχεία IO για τη διαδικασία (αριθμός χαρακτήρων και byte που διαβάζονται και γράφτηκαν, μεταξύ άλλων, κατά τη διάρκεια λειτουργιών IO).
  2. Το /proc/2822/attr/current εμφανίζει τα τρέχοντα χαρακτηριστικά ασφαλείας SELinux της διαδικασίας.
  3. Το /proc/2822/cgroup περιγράφει τις ομάδες ελέγχου (cgroups για συντομία) στις οποίες ανήκει η διαδικασία εάν είναι ενεργοποιημένη η επιλογή διαμόρφωσης πυρήνα CONFIG_CGROUPS, την οποία μπορείτε να επαληθεύσετε με:
cat /boot/config-$(uname -r) | grep -i cgroups

Εάν η επιλογή είναι ενεργοποιημένη, θα πρέπει να δείτε:

CONFIG_CGROUPS=y

Χρησιμοποιώντας cgroups μπορείτε να διαχειριστείτε την ποσότητα της επιτρεπόμενης χρήσης πόρων ανά διαδικασία, όπως εξηγείται στα Κεφάλαια 1 έως 4 του οδηγού Διαχείρισης Πόρων Red Hat Enterprise Linux 7, στο Κεφάλαιο 9 της Ανάλυσης Συστήματος του openSUSE και Οδηγός συντονισμού και στην ενότητα Ομάδες ελέγχου της τεκμηρίωσης του διακομιστή Ubuntu 14.04.

Ο /proc/2822/fd είναι ένας κατάλογος που περιέχει έναν συμβολικό σύνδεσμο για κάθε περιγραφέα αρχείου που έχει ανοίξει η διαδικασία. Η παρακάτω εικόνα δείχνει αυτές τις πληροφορίες για τη διαδικασία που ξεκίνησε στο tty1 (το πρώτο τερματικό) για τη δημιουργία της εικόνας .iso:

Η παραπάνω εικόνα δείχνει ότι stdin (περιγραφέας αρχείου 0), stdout (περιγραφέας αρχείου 1) και stderr (περιγραφέας αρχείου 2) αντιστοιχίζονται σε /dev/zero, /root/test.iso και /dev/tty1, αντίστοιχα.

Περισσότερες πληροφορίες σχετικά με το /proc μπορείτε να βρείτε στο έγγραφο «The /proc filesystem» που διατηρείται και διατηρείται από το Kernel.org και στο Εγχειρίδιο Προγραμματιστή Linux.

Ρύθμιση ορίων πόρων σε βάση ανά χρήστη στο Linux

Εάν δεν είστε προσεκτικοί και επιτρέπετε σε οποιονδήποτε χρήστη να εκτελεί απεριόριστο αριθμό διεργασιών, ενδέχεται τελικά να αντιμετωπίσετε έναν απροσδόκητο τερματισμό λειτουργίας του συστήματος ή να κλειδωθείτε όταν το σύστημα εισέρχεται σε κατάσταση αχρηστίας. Για να μην συμβεί αυτό, θα πρέπει να θέσετε ένα όριο στον αριθμό των διαδικασιών που μπορούν να ξεκινήσουν οι χρήστες.

Για να το κάνετε αυτό, επεξεργαστείτε το /etc/security/limits.conf και προσθέστε την ακόλουθη γραμμή στο κάτω μέρος του αρχείου για να ορίσετε το όριο:

*   	hard	nproc   10

Το πρώτο πεδίο μπορεί να χρησιμοποιηθεί για να υποδείξει είτε έναν χρήστη, μια ομάδα ή όλα αυτά (*), ενώ το δεύτερο πεδίο επιβάλλει ένα αυστηρό όριο στον αριθμό διεργασιών (nproc) σε 10. Για να εφαρμόσετε αλλαγές, αρκεί η αποσύνδεση και η επιστροφή.

Επομένως, ας δούμε τι συμβαίνει εάν ένας συγκεκριμένος χρήστης εκτός του root (είτε νόμιμος είτε όχι) επιχειρήσει να ξεκινήσει μια βόμβα τύπου shell fork. Αν δεν είχαμε εφαρμόσει όρια, αυτό θα εκκινούσε αρχικά δύο παρουσίες μιας συνάρτησης και στη συνέχεια θα αντιγράψει καθεμία από αυτές σε έναν ατελείωτο βρόχο. Έτσι, θα έφερνε τελικά το σύστημά σας σε ανίχνευση.

Ωστόσο, με τον παραπάνω περιορισμό, η βόμβα πιρουνιού δεν πετυχαίνει, αλλά ο χρήστης θα εξακολουθήσει να κλειδώνεται μέχρι ο διαχειριστής του συστήματος να σκοτώσει τη διαδικασία που σχετίζεται με αυτό:

ΣΥΜΒΟΥΛΗ: Άλλοι πιθανοί περιορισμοί που γίνονται δυνατοί από το ulimit τεκμηριώνονται στο αρχείο limits.conf.

Linux Άλλα εργαλεία διαχείρισης διεργασιών

Εκτός από τα εργαλεία που συζητήθηκαν προηγουμένως, ένας διαχειριστής συστήματος μπορεί επίσης να χρειαστεί:

α) Τροποποιήστε την προτεραιότητα εκτέλεσης (χρήση πόρων συστήματος) μιας διαδικασίας χρησιμοποιώντας το renice. Αυτό σημαίνει ότι ο πυρήνας θα κατανείμει περισσότερους ή λιγότερους πόρους συστήματος στη διαδικασία με βάση την εκχωρημένη προτεραιότητα (ένας αριθμός που είναι κοινώς γνωστός ως "ωραιότητα " σε ένα εύρος από -20 έως 19).

Όσο χαμηλότερη είναι η τιμή, τόσο μεγαλύτερη είναι η προτεραιότητα εκτέλεσης. Οι τακτικοί χρήστες (εκτός του root) μπορούν να τροποποιήσουν μόνο την ωραιότητα των διεργασιών που τους ανήκουν σε υψηλότερη τιμή (που σημαίνει χαμηλότερη προτεραιότητα εκτέλεσης), ενώ ο root μπορεί να τροποποιήσει αυτήν την τιμή για οποιαδήποτε διεργασία και μπορεί να την αυξήσει ή να την μειώσει.

Η βασική σύνταξη του renice είναι η εξής:

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

Εάν το όρισμα μετά τη νέα τιμή προτεραιότητας δεν υπάρχει (κενό), ορίζεται σε PID από προεπιλογή. Σε αυτήν την περίπτωση, η ωραία διαδικασία με το PID=identifier ορίζεται σε .

β) Διακόψτε την κανονική εκτέλεση μιας διαδικασίας όταν χρειάζεται. Αυτό είναι κοινώς γνωστό ως «θανάτωση» της διαδικασίας. Κάτω από την κουκούλα, αυτό σημαίνει ότι στέλνετε στη διαδικασία ένα σήμα για να ολοκληρώσετε την εκτέλεσή της σωστά και να απελευθερώσετε τυχόν χρησιμοποιημένους πόρους με τακτικό τρόπο.

Για να τερματίσετε μια διαδικασία, χρησιμοποιήστε την εντολή kill ως εξής:

kill PID

Εναλλακτικά, μπορείτε να χρησιμοποιήσετε το pkill για να τερματίσετε όλες τις διεργασίες ενός συγκεκριμένου κατόχου (-u) ή ενός κατόχου ομάδας (-G) ή ακόμα και εκείνων που έχουν PPID στο κοινό (-P). Αυτές οι επιλογές μπορεί να ακολουθούνται από την αριθμητική αναπαράσταση ή το πραγματικό όνομα ως αναγνωριστικό:

pkill [options] identifier

Για παράδειγμα,

pkill -G 1000

θα σκοτώσει όλες τις διεργασίες που ανήκουν σε ομάδα με GID=1000.

Και,

pkill -P 4993 

θα σκοτώσει όλες τις διεργασίες των οποίων το PPID είναι 4993.

Πριν εκτελέσετε ένα pkill, είναι καλή ιδέα να δοκιμάσετε πρώτα τα αποτελέσματα με το pgrep, ίσως χρησιμοποιώντας επίσης την επιλογή -l για να παραθέσετε τα ονόματα διεργασιών. Παίρνει τις ίδιες επιλογές, αλλά επιστρέφει μόνο τα PID των διεργασιών (χωρίς να προβεί σε περαιτέρω ενέργειες) που θα σβήσουν εάν χρησιμοποιηθεί το pkill.

pgrep -l -u gacanepa

Αυτό φαίνεται στην επόμενη εικόνα:

Περίληψη

Σε αυτό το άρθρο έχουμε διερευνήσει μερικούς τρόπους παρακολούθησης της χρήσης πόρων προκειμένου να επαληθεύσουμε την ακεραιότητα και τη διαθεσιμότητα κρίσιμων στοιχείων υλικού και λογισμικού σε ένα σύστημα Linux.

Μάθαμε επίσης πώς να αναλαμβάνουμε τα κατάλληλα μέτρα (είτε προσαρμόζοντας την προτεραιότητα εκτέλεσης μιας δεδομένης διαδικασίας είτε τερματίζοντας την) υπό ασυνήθιστες συνθήκες.

Ελπίζουμε ότι οι έννοιες που εξηγούνται σε αυτό το σεμινάριο ήταν χρήσιμες. Εάν έχετε οποιεσδήποτε ερωτήσεις ή σχόλια, μη διστάσετε να επικοινωνήσετε μαζί μας χρησιμοποιώντας την παρακάτω φόρμα επικοινωνίας.