Problima me to pws o scheduler trexei processes me I/O requests
Antonis Christofides
anthony at itia.ntua.gr
Wed Dec 13 14:59:41 EET 2006
anthony at acheloos:~$ uname -a
Linux acheloos 2.6.12 #1 SMP Tue Sep 19 10:59:51 EEST 2006 i686 GNU/Linux
anthony at acheloos:~$ nice sh -c 'while true; do true; done' &
[1] 20878
anthony at acheloos:~$ nice sh -c 'while true; do true; done' &
[2] 20882
anthony at acheloos:~$ sh -c 'while /bin/true; do true; done' &
[3] 20883
anthony at acheloos:~$ top
top - 14:18:58 up 62 days, 3:00, 3 users, load average: 3.43, 1.22, 0.42
Tasks: 254 total, 5 running, 249 sleeping, 0 stopped, 0 zombie
Cpu0 : 8.3% us, 25.2% sy, 66.4% ni, 0.0% id, 0.0% wa, 0.0% hi, 0.0% si
Cpu1 : 6.3% us, 20.9% sy, 72.8% ni, 0.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 1035680k total, 1020488k used, 15192k free, 93660k buffers
Swap: 2097144k total, 90360k used, 2006784k free, 508144k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20878 anthony 35 10 4036 1204 916 R 73.0 0.1 1:17.50 sh
20882 anthony 35 10 4036 1204 916 R 66.7 0.1 1:15.84 sh
20883 anthony 25 0 4044 1220 920 R 7.0 0.1 0:07.28 sh
Το πρόβλημα είναι ότι ενώ τα %1 και %2 είναι nice, καταναλώνουν έκαστο
10 φορές παραπάνω cpu time απ' ό,τι το %3, ενώ εκ πρώτης όψεως θα
έπρεπε το %3 να έχει μια απ' τις δυο cpu σχεδόν για την πάρτη του.
Βέβαια, θα μου πείτε, το 46.1% system time είναι κι αυτό δικό του κατά
το μεγαλύτερο μέρος, γιατί είναι ο χρόνος που κάνει το λειτουργικό για
το fork κλπ. Πλην όμως αν δώσουμε σε όλα τα processes nice 0, τότε τα
%1 και %2 παίρνουν έκαστο 96% ενώ το %3 μαζί με το system time είναι
8%.
Αυτά συμβαίνουν στο πείραμα. Στην πράξη, τα %1 και %2 είναι παιδιά
του apache (με nice 0), που για κάποιο λόγο κάνουν endless loop, ενώ
το %3 είναι ο slapd, που στην ουσία δεν αποκρίνεται καθόλου με
αποτέλεσμα να κολλάνε όλοι οι clients, μέχρι ο διαχειριστής να
σκοτώσει τα κολλημένα παιδιά. Το πρόβλημα δηλαδή δεν έχει σχέση με το
nice, απλά προσέθεσα το nice για να δείξω πόσο παρανοϊκό είναι το θέμα
(ένας συνάδελφος είχε βάλει κάτι υπολογισμούς να γίνονται με nice,
χωρίς να φαντάζεται ότι θα κολλούσε όλο το σύστημα).
Πάμε τώρα να το αναλύσουμε λίγο. Το true είναι shell built-in· έτσι,
τα processes %1 και %2 δεν κάνουν κανένα I/O request· είναι αυτό που
στα ελληνικά θα λέγαμε "computationally intensive", και κάθε φορά
τρέχουν ώσπου το time slice τους να εξαντληθεί. Το process %3,
ωστόσο, τρέχει το /bin/true, που σημαίνει ότι ξεσκίζεται στα fork και
λοιπά blocking I/O requests. Πληροφορούμαι ότι το nice συνήθως δεν
επηρεάζει το μέγεθος του time slice, αλλά μόνο το πόσο ψηλά μπαίνει το
process στην ουρά για εκτέλεση. Οπότε το σύστημα λειτουργεί κάπως
έτσι:
1. Το %3 εκτελείται, και πολύ σύντομα, πολύ πριν εξαντλήσει το time
slice του, κάνει ένα I/O request.
2. O scheduler βάζει το %3 για ύπνο, και βάζει για τρέξιμο ένα άλλο
runnable process, που στην περίπτωσή μας είναι το %1 ή το %2, που
εξαντλεί το time slice του εφόσον δεν κάνει κανένα I/O request.
3. Πάλι στο 1.
Και τώρα οι απορίες μου:
1. Τι πρέπει να κάνω για να μη σέρνεται ο slapd κάθε φορά που
κολλάνε δυο άσχετα processes; (όταν λέμε σέρνεται εννοούμε ότι
αντί να απαντήσει σε 0.1 δευτερόλεπτα απαντάει σε πάνω από 1
λεπτό - η κατάσταση είναι πολύ χειρότερη απ' ό,τι στο άνω
πείραμα, που οφείλεται, πιθανολογώ, στο ότι ο slapd κάνει πολύ
περισσότερα I/O requests).
2. Γιατί όταν κολλάνε δύο άσχετα processes, μόνο ο slapd αρχίζει να
σέρνεται; Γιατί, π.χ., τα queries μου προς την postgresql
εξακολουθούν να λειτουργούν με λογική καθυστέρηση; Δεν κάνουν και
τα RDBMS, όπως και ο slapd, πολλά blocking I/O requests;
More information about the Linux-greek-users
mailing list