Owait 문제 해결

어떤 서버에서 만성적으로 괴로워하는 iowait.그렇게 무겁게 죽지 않고 조사할 수 있는 상태에서 발생했기 때문에 기회였기에 조사한 것이다.그 방법을 기록하다.

Owait 문제 해결


Troubleshooting High I/O Wait in Linux | Benjamin Cane
The reason I/O Wait is difficult to troubleshoot is due to the fact that by default there are plenty of tools to tell you that your system is I/O bound, but not as many that can narrow the problem to a specific process or processes.
이 페이지는 아주 좋아요.명령
★ 지령이 좋은 녀석.
# io waitが全体でどれくらいあるのかわかる
top
# io waitが起こってるdiskがどれかわかる。(HDDが1つしかなければたぶん意味ない)
iostat -x 2 5
# io waitを起こしているprocessがわかる(が、dockerdって言われても意味なし)
iotop
# ★kernelからsleepしてろや、って言われてるprocessを表示!
ps -eo state,pid,cmd | grep "^D"
# プロセスのr/wスピードを表示
cat /proc/$PID/io
# ★プロセスが書き込んでるファイル名を表示
lsof -p $PID
# ディレクトリがどのdiskに属するのか(disk 1つなら意味なし)
df 書込み対象ディレクトリ
# disk groupを表示(lvmしてなければ意味ないかな)
pvdisplay
우선, 나는 ioop이 쓸모가 없다고 확신한다.
$ iotop

dockerd에 있는 프로세스의 이름을 알고 싶습니다.적어도 docker-contaained를 내게 주면 나는tree 표지에 걸 것이다.
마찬가지로 디스켓이 하나밖에 없어서 iostat도 소용없어요.

최고는 ps-eo 지령.

ps -eo state,pid,cmd | grep "^D"     
# 2sおきに更新
watch -n2 "ps -eo state,pid,cmd | grep '^D'"

케너를 기다리고 있나?과정을 알다.이 점을 잘 확신했다.

근데 해결이 안 됐어요.

D로 변하는 과정kill -SIGKILL도 죽지 않아...
이 경우 리부트를 기다릴 수밖에 없다.
process - What if 'kill -9' does not work? - Unix & Linux Stack Exchange
However kill -9 is not guaranteed to work immediately. All signals, including SIGKILL, are delivered asynchronously: the kernel may take its time to deliver them
···2h 등도 떨어지지 않는다.리부트밖에 없나...조금만 더 기다려... → 결국 리부트야.

무거운 프로세스 찾기


다른 현상.서버가 하나 있는데, 서버가 느려 죽을 지경이다.
[root@zzz:~]# top
top - 18:22:32 up 522 days, 21:48,  7 users,  load average: 84.00, 84.03, 84.02
ps 지령도 중도 정지.
중도 정지 명령이 있는 경우strace 명령을 사용하면 어디에 멈추는지 알 수 있다.
[root@zzz:~]# strace ps -ef
...
...
stat("/proc/61428", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
open("/proc/61428/stat", O_RDONLY)      = 6
read(6, "61428 (java) D 101527 101527 101"..., 2048) = 335
close(6)                                = 0
open("/proc/61428/status", O_RDONLY)    = 6
read(6, "Name:\tjava\nUmask:\t0022\nState:\tD "..., 2048) = 1154
close(6)                                = 0
open("/proc/61428/cmdline", O_RDONLY)   = 6
read(6,                                                       <--------ここから返ってこない
이 자바 프로세싱 61428은 안 될 것 같은데.

top에 모든 프로세스의 r/w를 표시할 수 있는 방법



hard drive - Linux disk IO load breakdown, by filesystem path and/or process? - Server Fault
yum install -y htop
htop  
F5 (Tree view)  
F2 (Setup)  
Select columns  
Select RBYTES WBYTES  
F10 (Done)

총결산


내가 알고 싶은 것은 IO wait의 높은 프로세스보다kerner를 기다리는 과정일 수도 있다. (r/w의byte수는 보아도 전혀 알 수 없다.)
/prooc/$PID/io의 한 단락도 리눅스에 대한 기초 지식이 있으면 자연히 떠오르는 부분이다.주말 LPIC101 파이팅.

좋은 웹페이지 즐겨찾기