[linux]Achterhalen welk process op IO wacht

Pagina: 1
Acties:

  • viper
  • Registratie: Augustus 1999
  • Laatst online: 00:36
Ik heb soms wel eens dat mijn machine een hoge load heeft. Als ik dan via top kijk welk process nu hetmeeste gebruik maak van de CPU er is niet altijd een process te vinden wat veel CPU% opeet.
Als ik dan kijk hoeveel van de CPU tijd in wait state zit, is dit aardig wat. Er zitten dus processen op IO (vaak disk) te wachten.
Nu vroeg ik me af, hoe kan ik achterhalen welke processen op (disk)IO aan 't wachten zijn?

  • Seth4Chaos
  • Registratie: Maart 2001
  • Niet online

Seth4Chaos

that's me...

met het 'ps' commando.
'ps -aux' en dat kijken naar de process state code en zoeken naar een 'D'
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers
(header "STAT" or "S") will display to describe the state of a process.
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct ("zombie") process, terminated but not reaped by its parent.

Mistakes are proof that you are trying...


Verwijderd

[inkoppertje]http://users.tpg.com.au/bdgcvb/DTrace/iosnoop[/inkoppertje] ... al zal je dan wel eerst dtrace naar linux moeten porten...

Verwijderd

Nee compukid, dtrace zullen we helaas nog ff op moeten wachten ;) (of (open)solaris/nexenta draaien \o/)

Als eerst moet je met enige zekerheid kunnen zeggen welke processen _mogelijk_ de hoeveelheid io aan het opsnoepen zijn. Als een proces veel IO trekt, zal de runtime ook groter worden. Gebruik ps axuww en kijk naar de START en TIME kolommen. Op het moment dat je hier een proces ziet wat net gestart is maar wat onevenredig veel tijd verbruikt, dan is dit een goeie indicatie dat dit proces resources slurpt. Then again, als je een proces hebt wat al tijden gestart is (init bv) welke relatief veel tijd versnoept is het hoogstwaarschijnlijk loos alarm.

Ok, je hebt dus je proces list doorgelopen en hebt een handjevol processen welke in aanmerking komen. Afhankelijk van wat het proces doet, zou je (heel grof) de processen stuk voor stuk kunnen stoppen om zo te achterhalen welk proces IO snoept (dat zou moeten wegvallen op het moment dat je er een TERM naartoe stuurt).

Mocht dit niet baten, of kunnen de processen niet gestopt kunnen worden, zul je terug moeten vallen op lowlevel tools (yeah, fijn he, dat linux ;) :r solaris++ enzo). Gebruik strace om per proces te achterhalen wat het doet. Als je een proces vind wat onevenredig veel open()'s, read()'s, write()'s of close()'s doet, dan zou dit een hele goeie indicatie kunnen zijn dat dit het proces is wat al die IO opsnoept. In de strace output zou je ook meer hints moeten kunnen krijgen over wat het proces precies met al die IO tijd doet en kun je eventueel daar weer verbeteringen op toepassen (voorzover dat mogelijk is).