iostat και iotop: διάγνωση συμφορήσεων στην αποθήκευση Linux

14 λεπτά ανάγνωσης - 12 Ιουνίου 2026

hero section cover
Πίνακας περιεχομένων
  • iostat και iotop: διάγνωση σημείων συμφόρησης αποθήκευσης στο Linux
  • Εγκατάσταση των iostat και iotop
  • Ανάγνωση της εξόδου του iostat
  • Ανάγνωση της εξόδου του iotop
  • Μια διαδικασία διάγνωσης
  • Επίλυση κοινών προβλημάτων συμφόρησης I/O
Κοινοποίηση

Χρησιμοποιήστε το 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 για να εντοπίσετε τον υπαίτιο εκ των υστέρων.

Μια διαδικασία διάγνωσης

Οι περισσότερες έρευνες σχετικά με τις εισόδους/εξόδους δίσκου ακολουθούν την ίδια διαδρομή:

  1. iostat -xz 2 να επιβεβαιωθεί ότι ο δίσκος αποτελεί πράγματι το σημείο συμφόρησης. Δείτε await, aqu-szκαι %iowait. Εάν αυτά είναι φυσιολογικά, το πρόβλημα δεν είναι η αποθήκευση και θα πρέπει να ψάξετε εντελώς αλλού.
  2. iotop -oPa για να βρείτε τη διαδικασία που προκαλεί το φορτίο. Παρακολουθήστε περισσότερο τη στήλη IO παρά τη στήλη throughput. Οι χειρότεροι παραβάτες είναι συχνά προγράμματα που εκτελούν πολλές μικρές συγχρονισμένες εγγραφές, όχι αυτά που μετακινούν τα περισσότερα byte.
  3. 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 σας παρέχουν το περιθώριο να εφαρμόσετε παραγωγικά την παραπάνω ρύθμιση.

Blog

Προτεινόμενα αυτή την εβδομάδα

Περισσότερα άρθρα
Συντονισμένα προφίλ για βελτιστοποίηση του φόρτου εργασίας διακομιστών Linux

Συντονισμένα προφίλ για βελτιστοποίηση του φόρτου εργασίας διακομιστών Linux

Πώς να επιλέγετε, να εφαρμόζετε και να προσαρμόζετε συντονισμένα προφίλ για διακομιστές GPU, βάσεων δεδομένων και Linux με υψηλό εύρος ζώνης, με παραδείγματα και συμβουλές ανάπτυξης του Ansible.

16 λεπτά ανάγνωσης - 9 Ιουνίου 2026

Ρύθμιση του Linux OOM Killer για VPS: Ένας πρακτικός οδηγός

12 λεπτά ανάγνωσης - 8 Ιουνίου 2026

Περισσότερα άρθρα
background image

Έχετε ερωτήσεις ή χρειάζεστε μια προσαρμοσμένη λύση

icon

Ευέλικτες επιλογές

icon

Παγκόσμια εμβέλεια

icon

Άμεση ανάπτυξη

icon

Ευέλικτες επιλογές

icon

Παγκόσμια εμβέλεια

icon

Άμεση ανάπτυξη