iostat και iotop: διάγνωση συμφορήσεων στην αποθήκευση Linux
14 λεπτά ανάγνωσης - 12 Ιουνίου 2026

Χρησιμοποιήστε το iostat και το iotop για να βρείτε τα σημεία συμφόρησης εισόδου/εξόδου του δίσκου Linux. Καλύπτει το %util gotcha στο NVMe, την αναμονή ανάγνωσης και το βάθος ουράς, καθώς και τη ροή εργασίας για την εύρεση και τη διόρθωσή του.
iostat και iotop: διάγνωση σημείων συμφόρησης αποθήκευσης στο Linux
Όταν ένας διακομιστής Linux φαίνεται αργός, η αποθήκευση είναι ένα από τα πρώτα σημεία που πρέπει να ελέγξετε. Το iostat σας δείχνει αν ο δίσκος είναι υπερφορτωμένος, ενώ το iotop σας δείχνει ποια διαδικασία προκαλεί το φορτίο. Χρησιμοποιούμενα μαζί, απαντούν στις δύο σημαντικές ερωτήσεις: είναι ο δίσκος πραγματικά το σημείο συμφόρησης και, αν ναι, τι τον επιβαρύνει; Αυτή η ανάρτηση καλύπτει την εγκατάσταση, τον τρόπο ανάγνωσης της εξόδου (συμπεριλαμβανομένου του πού βρίσκεται η μέτρηση του iostat %util βρίσκεται σε σύγχρονο υλικό) και μια ροή εργασίας για τη μετάβαση από το σύμπτωμα στην επίλυση.
Εγκατάσταση των iostat και iotop
Το iostat περιλαμβάνεται στο πακέτο sysstat, ενώ το iotop διατίθεται ξεχωριστά. Εγκαταστήστε και τα δύο:
# Debian/Ubuntu
sudo apt install sysstat iotop
# RHEL, AlmaLinux, Rocky, CentOS Stream
sudo dnf install sysstat iotop
# Arch
sudo pacman -S sysstat iotopΣτο Ubuntu, το sysstat διατίθεται απενεργοποιημένο. Για να συλλέξετε δεδομένα παρασκηνίου για μετέπειτα ανάλυση με το sar, επεξεργαστείτε /etc/default/sysstat, ορίστε ENABLED="true"και επανεκκινήστε την υπηρεσία:
sudo systemctl restart sysstatΤο iotop πρέπει να εκτελείται ως root. Στο RHEL 9 και νεότερες εκδόσεις, η καταμέτρηση καθυστερήσεων είναι απενεργοποιημένη από προεπιλογή, γεγονός που αφήνει το IO και SWAPIN κενές. Ενεργοποιήστε την με:
echo 1 | sudo tee /proc/sys/kernel/task_delayacctΠροσθέστε kernel.task_delayacct = 1 στο /etc/sysctl.conf για να παραμείνει ενεργό μετά από επανεκκινήσεις.
Ανάγνωση της εξόδου του iostat
Εκτελέστε το iostat με εκτεταμένα στατιστικά στοιχεία και αγνοήστε το πρώτο δείγμα, το οποίο δείχνει μόνο μέσους όρους από την εκκίνηση:
iostat -xz 2Η -x επιλογή προσθέτει εκτεταμένα στατιστικά στοιχεία, -z κρύβει τις αδρανείς συσκευές και η 2 ανανεώνει κάθε δύο δευτερόλεπτα. Οι στήλες που έχουν σημασία:
await: μέσος χρόνος σε χιλιοστά του δευτερολέπτου για την ολοκλήρωση ενός αιτήματος I/O, συμπεριλαμβανομένου του χρόνου αναμονής. Ο πιο σημαντικός αριθμός όταν οι χρήστες παραπονούνται για βραδύτητα.r/sκαιw/s: IOPS ανάγνωσης και εγγραφής. Σε συνδυασμό μεrkB/sκαιwkB/sαυτά σας δείχνουν αν ο φόρτος εργασίας σας είναι τυχαίος (υψηλές IOPS, χαμηλή απόδοση) ή διαδοχικός (χαμηλές IOPS, υψηλή απόδοση).aqu-sz: μέσο βάθος ουράς. Για τους σκληρούς δίσκους (HDD), οποιαδήποτε τιμή παραμένει πάνω από 1 σημαίνει ότι ο δίσκος δεν μπορεί να ανταποκριθεί.%util: ποσοστό του χρόνου που η συσκευή είχε τουλάχιστον μία I/O σε εξέλιξη. Χρήσιμο για τους σκληρούς δίσκους, παραπλανητικό για το NVMe (βλ. παρακάτω).
Μια γρήγορη αναφορά ορίων:
| Τύπος δίσκου | ανησυχία αναμονής | Ανησυχία aqu-sz | %util αξιόπιστο; |
|---|---|---|---|
| HDD 7200 RPM | > 20 ms | > 1 | Ναι |
| SSD SATA | > 10 ms | > 4 | Κυρίως |
| NVMe | > 1-2 ms | > 16 | Όχι |
Το πού βρίσκεται το %util
%util είναι η μέτρηση στην οποία οι περισσότεροι άνθρωποι ανατρέχουν πρώτα, και στο NVMe είναι ενεργά παραπλανητική. Ο πυρήνας μετρά %util ως «οποιαδήποτε I/O σε εξέλιξη ανά πάσα στιγμή», κάτι που είναι εντάξει για έναν περιστρεφόμενο δίσκο που επεξεργάζεται μία αίτηση κάθε φορά, αλλά δεν έχει νόημα για συσκευές NVMe που χειρίζονται χιλιάδες αιτήσεις παράλληλα σε ουρές υλικού. Μια μονάδα NVMe μπορεί να βρίσκεται στο 100% %util ενώ λειτουργεί στο 5% της πραγματικής χωρητικότητάς του.
Στο NVMe, εμπιστευθείτε r_await, w_await, και aqu-sz αντ' αυτού. Εάν r_await παραμένει κάτω από 1 ms και το βάθος της ουράς είναι άνετα κάτω από το βάθος της ουράς υλικού της συσκευής (συχνά 1024 ή υψηλότερο), η μονάδα δίσκου δεν είναι στην πραγματικότητα κορεσμένη ανεξάρτητα από το τι %util λέει.
Για μια γρήγορη προβολή NVMe σε MB/s αντί για kB/s:
iostat -xm 1Για μακροπρόθεσμη συλλογή, μπορείτε να συσχετίσετε τα δεδομένα με τα αρχεία καταγραφής της εφαρμογής αργότερα:
iostat -x -t 5 720 > /var/log/iostat.logΑυτό λαμβάνει δείγματα κάθε 5 δευτερόλεπτα για μία ώρα. sar από το ίδιο πακέτο sysstat σας παρέχει τα αντίστοιχα δεδομένα με μόνιμη αποθήκευση ιστορικού και αποτελεί την καλύτερη επιλογή για συνεχή παρακολούθηση.
Επιβεβαίωση με το CPU iowait
Εάν το iostat δείχνει πίεση αποθήκευσης, διασταυρώστε τα δεδομένα με τη %iowait στήλη στην περίληψη της CPU στο πάνω μέρος της ίδιας εξόδου. Η παρατεταμένη %iowait πάνω από 15-20% σε συνδυασμό με υψηλό await επιβεβαιώνει ότι το σημείο συμφόρησης είναι η αποθήκευση. Εάν %iowait είναι υψηλό αλλά await φαίνεται φυσιολογικό, εκτελέστε vmstat 1 και ελέγξτε το si και so . Η μη μηδενική δραστηριότητα ανταλλαγής σημαίνει ότι υπάρχει περιορισμός μνήμης και ότι η κίνηση στο δίσκο αφορά σε σελιδοποίηση και όχι σε I/O εφαρμογών.
Ανάγνωση της εξόδου του iotop
Μόλις το iostat επιβεβαιώσει ένα σημείο συμφόρησης στην αποθήκευση, το iotop σας λέει ποια διαδικασία είναι υπεύθυνη. Ξεκινήστε με:
sudo iotop -oΗ -o κρύβει τις αδρανείς διεργασίες, αφήνοντας μόνο εκείνες που εκτελούν ενεργά I/O. Οι στήλες που πρέπει να παρακολουθήσετε:
- DISK READ / DISK WRITE: ρυθμός μεταφοράς δεδομένων σε πραγματικό χρόνο ανά διαδικασία. Προσδιορίζει τις προφανείς διαδικασίες που επιβαρύνουν το σύστημα.
- IO: ποσοστό του χρόνου που η διαδικασία είναι μπλοκαρισμένη σε I/O. Μια διαδικασία που γράφει μόλις 50 kB/s μπορεί να εμφανίζει 99% IO αν εκτελεί μικρές συγχρονισμένες
fsync()κλήσεις. Αυτή η στήλη έχει μεγαλύτερη σημασία από την ακατέργαστη απόδοση. - SWAPIN: ποσοστό του χρόνου αναμονής σε σελίδες ανταλλαγής. Μια τιμή διαφορετική από το μηδέν εδώ σημαίνει ότι το σύστημα εκτελεί σελιδοποίηση και το «πρόβλημα αποθήκευσης» σας είναι στην πραγματικότητα πρόβλημα μνήμης.
Για εφαρμογές πολλαπλών νημάτων (MySQL, PostgreSQL, φόρτο εργασίας Java), συγκεντρώστε τα νήματα πίσω σε διεργασίες με -Pκαι προσθέστε -a για να συγκεντρώσετε τα σύνολα από την έναρξη του iotop:
sudo iotop -oPaΗ -a είναι το μυστικό για την ανίχνευση φορτίων εργασίας με απότομες αυξήσεις, όπως εργασίες δημιουργίας αντιγράφων ασφαλείας που εκτελούνται μόνο για λίγα δευτερόλεπτα κάθε φορά και που διαφορετικά θα ήταν δύσκολο να εντοπιστούν σε μια ζωντανή προβολή.
Για αυτόματη καταγραφή κατά τη διάρκεια των νυχτερινών περιόδων όταν κανείς δεν παρακολουθεί:
sudo iotop -botqq -d 10 > /var/log/iotop.logΑυτό γράφει ένα μη διαδραστικό στιγμιότυπο κάθε 10 δευτερόλεπτα. Συνδυάστε το με χρονικές σημάνσεις από τις εργασίες δημιουργίας αντιγράφων ασφαλείας ή cron για να εντοπίσετε τον υπαίτιο εκ των υστέρων.
Μια διαδικασία διάγνωσης
Οι περισσότερες έρευνες σχετικά με τις εισόδους/εξόδους δίσκου ακολουθούν την ίδια διαδρομή:
iostat -xz 2να επιβεβαιωθεί ότι ο δίσκος αποτελεί πράγματι το σημείο συμφόρησης. Δείτεawait,aqu-szκαι%iowait. Εάν αυτά είναι φυσιολογικά, το πρόβλημα δεν είναι η αποθήκευση και θα πρέπει να ψάξετε εντελώς αλλού.iotop -oPaγια να βρείτε τη διαδικασία που προκαλεί το φορτίο. Παρακολουθήστε περισσότερο τη στήλη IO παρά τη στήλη throughput. Οι χειρότεροι παραβάτες είναι συχνά προγράμματα που εκτελούν πολλές μικρές συγχρονισμένες εγγραφές, όχι αυτά που μετακινούν τα περισσότερα byte.lsof -p <pid>για να δείτε ποια αρχεία επεξεργάζεται αυτή η διαδικασία. Αυτό συνήθως προσδιορίζει αμέσως τον τύπο του φόρτου εργασίας: ένα αρχείο καταγραφής προ-εγγραφής βάσης δεδομένων, ένα αρχείο καταγραφής εφαρμογής, ένα σημείο προσάρτησης αντιγράφου ασφαλείας, ένα προσωρινό αρχείο.
Δύο μοτίβα που αξίζει να γνωρίζετε.
Αν δείτε νήματα πυρήνα όπως jbd2/... (ext4 journal) ή txg_sync (ZFS) στην κορυφή των writers του iotop, αυτά ανταποκρίνονται σε εγγραφές από άλλες διεργασίες, δεν τις ξεκινάνε. Η διεργασία του χώρου χρήστη που προκαλεί την κίνηση του journal είναι η πραγματική αιτία· συνεχίστε να ψάχνετε.
Σε ένα VPS, υψηλό await με χαμηλό %util είναι το κλασικό σημάδι του «θορυβώδους γείτονα». Ένας άλλος ενοικιαστής μονοπωλεί τον κοινόχρηστο χώρο αποθήκευσης και η I/O σας περιμένει στην ουρά από την πλευρά του υπερ-επιτηρητή, όχι στον εικονικό σας δίσκο. Μπορείτε να το επιβεβαιώσετε αλλά όχι να το διορθώσετε από μέσα από τον επισκέπτη· η λύση είναι είτε να το αναφέρετε στον πάροχο είτε να μετακινηθείτε σε έναν διακομιστή με απομονωμένο χώρο αποθήκευσης.
Επίλυση κοινών προβλημάτων συμφόρησης I/O
Μόλις εντοπίσετε τι επιβαρύνει το δίσκο, οι λύσεις είναι συνήθως απλές.
Αποπροτεραιοποιήστε τις μη κρίσιμες εισόδους/εξόδους. ionice Τοποθετήστε μια διαδικασία στην κατηγορία προγραμματισμού αδράνειας, όπου χρησιμοποιεί το εύρος ζώνης του δίσκου μόνο όταν δεν το χρειάζεται τίποτα άλλο:
ionice -c 3 -p <pid>
sudo ionice -c 3 rsync -a /data /backupΗ πρώτη μορφή αλλάζει μια διαδικασία που εκτελείται, ενώ η δεύτερη ξεκινά μια νέα που βρίσκεται ήδη στην κατηγορία αδράνειας. Μέσα στο iotop, μπορείτε να αλλάξετε την προτεραιότητα μιας διαδικασίας που εκτελείται διαδραστικά πατώντας το πλήκτρο i.
Μετακινήστε τα φορτία εργασίας υψηλής χρήσης σε ταχύτερο χώρο αποθήκευσης. Εάν το iostat δείχνει έναν δίσκο SATA υπερφορτωμένο από εγγραφές στη βάση δεδομένων και υπάρχει ένας αδρανής NVMe στον ίδιο υπολογιστή, μετακινήστε τον κατάλογο δεδομένων της βάσης δεδομένων. Η διαφορά τάξεων μεγέθους στα IOPS καθιστά αυτή τη λύση την πιο αποτελεσματική που υπάρχει.
Ορίστε τον σωστό χρονοπρογραμματιστή I/O. Οι σύγχρονοι πυρήνες έχουν λογικές προεπιλογές, αλλά αξίζει να τις ελέγξετε. Για NVMe και SSD, ορίστε τον χρονοπρογραμματιστή σε none. Η συσκευή χειρίζεται την ουρά αναμονής στο υλικό καλύτερα από ό,τι ο πυρήνας:
echo none > /sys/block/nvme0n1/queue/schedulerΓια HDD που χειρίζονται μικτά φορτία εργασίας, mq-deadline είναι η συνήθης επιλογή.
Εγκαταστήστε με noatime. Κάθε ανάγνωση ενημερώνει την χρονική σήμανση της τελευταίας πρόσβασης του αρχείου από προεπιλογή, δημιουργώντας μια εγγραφή για κάθε ανάγνωση. Σε συστήματα αρχείων με βαριά ανάγνωση, αυτό είναι περιττό I/O. Προσθέστε noatime στις επιλογές προσάρτησης στο /etc/fstab:
UUID=... /data ext4 defaults,noatime 0 2Ρυθμίστε το writeback για εκρήξεις εγγραφών. Σε διακομιστές με άφθονη μνήμη RAM, τα προεπιλεγμένα όρια βρώμικων σελίδων επιτρέπουν στην προσωρινή μνήμη σελίδων να συσσωρεύει gigabytes μη εγγεγραμμένων δεδομένων και στη συνέχεια να τα εκκαθαρίζει σε μία μεγάλη διακοπή. Μειώστε τα όρια στο /etc/sysctl.conf για να το εξομαλύνετε:
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5Ο ίδιος ο δίσκος συνήθως δεν αποτελεί το πρόβλημα. Όταν το iostat εμφανίζει υψηλά IOPS και χαμηλή απόδοση, το φορτίο εργασίας εκτελεί τυχαίες εισόδους/εξόδους (I/O) σε δεδομένα που θα μπορούσαν να είναι διαδοχικά, ή εκτελεί πολλές μικρές εγγραφές που θα μπορούσαν να ομαδοποιηθούν. Εξετάστε την εφαρμογή πριν κατηγορήσετε το υλικό.
Εάν εκτελείτε φόρτους εργασίας με μεγάλη χρήση αποθηκευτικού χώρου σε έναν διακομιστή όπου το δίκτυο μπορεί να ξεπεράσει τον δίσκο, οι αποκλειστικοί διακομιστές της FDC με υποστήριξη NVMe σας παρέχουν το περιθώριο να εφαρμόσετε παραγωγικά την παραπάνω ρύθμιση.

Συντονισμένα προφίλ για βελτιστοποίηση του φόρτου εργασίας διακομιστών Linux
Πώς να επιλέγετε, να εφαρμόζετε και να προσαρμόζετε συντονισμένα προφίλ για διακομιστές GPU, βάσεων δεδομένων και Linux με υψηλό εύρος ζώνης, με παραδείγματα και συμβουλές ανάπτυξης του Ansible.
16 λεπτά ανάγνωσης - 9 Ιουνίου 2026
Ρύθμιση του Linux OOM Killer για VPS: Ένας πρακτικός οδηγός
12 λεπτά ανάγνωσης - 8 Ιουνίου 2026

Έχετε ερωτήσεις ή χρειάζεστε μια προσαρμοσμένη λύση
Ευέλικτες επιλογές
Παγκόσμια εμβέλεια
Άμεση ανάπτυξη
Ευέλικτες επιλογές
Παγκόσμια εμβέλεια
Άμεση ανάπτυξη