2014-08-21 :-)
_ 午後
1300 通院 || MRI撮影 || 撮影するときに体をグルグル巻かれたり耳栓(!) を装着するなどした || 以前 MRI 撮影した別の病院では体を巻かれることもないし耳栓というかヘッドフォンを装着し音楽を聞かされた || 病院によって MRI の設備が異なるようだ || 見た目 若干使い込まれてたし
1400 地図がどうのこうの
1500 散歩
_ セットアップ中のサーバーの ruby プロセスが CPU 100% 近く使っていた
ユーザー www で走らせている ruby は tdiary しか無いんだがまだ原因は特定できず。
なおグローバルのネットワークなんだが正引きは設定していない。
環境
- NetBSD/i386 6.1.4
- tDiary 4.0.3.20140509 (数ヶ月前の git)
- ruby 2.0.0p481
現象
計算機のトラブルシューティングをちゃんと勉強しておくんだった。
top
load averages: 1.32, 1.26, 1.30; up 20+20:04:22 19:45:4 29 processes: 1 runnable, 27 sleeping, 1 on CPU CPU states: 98.6% user, 0.0% nice, 1.4% system, 0.0% interrupt, 0.0% idle Memory: 705M Act, 6212K Wired, 15M Exec, 638M File, 948M Free Swap: 2055M Total, 2055M Free PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND 14900 www 25 0 54M 45M RUN 125.1H 98.29% 98.29% ruby200 <= これ 0 root 126 0 0K 21M pgdaemon 134:41 0.00% 0.00% [system] 12206 www 43 0 61M 3684K parked 1:01 0.00% 0.00% httpd 6014 www 43 0 60M 3220K parked 1:00 0.00% 0.00% httpd 10221 www 85 0 60M 2512K kqueue 0:58 0.00% 0.00% httpd 318 root 85 0 6032K 6204K pause 0:54 0.00% 0.00% ntpd 20586 www 85 0 60M 2500K pipe_rd 0:54 0.00% 0.00% httpd 175 root 85 0 5368K 1640K kqueue 0:32 0.00% 0.00% syslogd 4034 _pflogd 85 0 3320K 980K bpf 0:28 0.00% 0.00% pflogd 258 root 85 0 7604K 2608K select 0:17 0.00% 0.00% sshd 29511 root 85 0 6612K 2756K select 0:13 0.00% 0.00% httpd 401 root 85 0 3140K 1268K nanoslp 0:04 0.00% 0.00% cron 29563 root 85 0 5144K 1680K kqueue 0:01 0.00% 0.00% master 1 root 85 0 3140K 1096K wait 0:01 0.00% 0.00% init 28978 rin 43 0 3368K 1620K CPU 0:00 0.00% 0.00% top 9359 root 85 0 10M 4580K select 0:00 0.00% 0.00% sshd 13433 rin 85 0 4848K 3512K pause 0:00 0.00% 0.00% zsh 24344 rin 85 0 10M 3408K select 0:00 0.00% 0.00% sshd 391 root 85 0 6568K 2792K wait 0:00 0.00% 0.00% login 27066 postfix 85 0 5144K 2396K kqueue 0:00 0.00% 0.00% qmgr 24324 postfix 85 0 5136K 2072K kqueue 0:00 0.00% 0.00% pickup 582 root 85 0 3260K 1512K ttyraw 0:00 0.00% 0.00% sh 5658 root 85 0 3328K 1504K netio 0:00 0.00% 0.00% pflogd 407 root 85 0 3152K 1120K ttyraw 0:00 0.00% 0.00% getty 325 root 85 0 3152K 1120K ttyraw 0:00 0.00% 0.00% getty 397 root 85 0 3152K 1120K ttyraw 0:00 0.00% 0.00% getty 366 root 85 0 3184K 976K kqueue 0:00 0.00% 0.00% inetd 319 root 85 0 3164K 884K kqueue 0:00 0.00% 0.00% powerd 18123 www 83 0 6388K 2160K socket 0:00 0.00% 0.00% httpd
% vmstat 1 procs memory page disks faults cpu r b avm fre flt re pi po fr sr f0 c0 in sy cs us sy id 1 0 721168 971852 137 0 0 0 0 0 0 0 6 1499 40 25 1 74 1 0 721172 971848 43 0 0 0 0 0 0 0 28 2368 50 99 1 0 1 0 721172 971848 22 0 0 0 0 0 0 0 10 2372 29 93 7 0 1 0 721172 971848 962 0 0 0 0 0 0 0 2 18679 27 91 9 0 2 0 721172 971848 24 0 0 0 0 0 0 0 3 2410 23 97 3 0 1 0 721172 971848 38 0 0 0 0 0 0 0 1 2440 26 98 2 0 1 0 721172 971848 14 0 0 0 0 0 0 0 2 2427 23 98 2 0 1 0 721172 971848 34 0 0 0 0 0 0 0 2 2388 25 98 2 0 1 0 721172 971848 472 0 0 0 0 0 0 0 3 11417 27 95 5 0 1 0 721172 971848 531 0 0 0 0 0 0 0 6 9717 29 97 3 0 1 0 721172 971848 43 0 0 0 0 0 0 0 2 2421 25 99 1 0
% iostat 1 tty fd0 cd0 sd0 CPU tin tout KB/t t/s MB/s KB/t t/s MB/s KB/t t/s MB/s us ni sy in id 0 6 0.000 0 0.000 0.000 0 0.000 13.99 4 0.058 25 0 1 0 74 0 238 0.000 0 0.000 0.000 0 0.000 0.000 0 0.000 97 0 3 0 0 0 79 0.000 0 0.000 0.000 0 0.000 0.000 0 0.000 93 0 7 0 0 0 281 0.000 0 0.000 0.000 0 0.000 13.19 8 0.102 99 0 1 0 0 0 79 0.000 0 0.000 0.000 0 0.000 0.000 0 0.000 99 0 1 0 0 0 238 0.000 0 0.000 0.000 0 0.000 0.000 0 0.000 100 0 0 0 0 0 80 0.000 0 0.000 0.000 0 0.000 34.28 47 1.558 99 0 1 0 0 0 79 0.000 0 0.000 0.000 0 0.000 15.41 11 0.164 94 0 6 0 0 0 166 0.000 0 0.000 0.000 0 0.000 0.000 0 0.000 97 0 3 0 0 0 79 0.000 0 0.000 0.000 0 0.000 0.000 0 0.000 99 0 1 0 0
pkgsrc sysutil/systrace をインストール
実行
% systrace -f -p 14900 : poll([{fd=3, events=POLLIN}, {fd=5, events=POLLIN}], 2, INFTIM) = 209 poll([{fd=3, events=POLLIN}, {fd=5, events=POLLIN}], 2, INFTIM) = 209 poll([{fd=3, events=POLLIN}, {fd=5, events=POLLIN}], 2, INFTIM) = 209 poll([{fd=3, events=POLLIN}, {fd=5, events=POLLIN}], 2, INFTIM) = 209 poll([{fd=3, events=POLLIN}, {fd=5, events=POLLIN}], 2, INFTIM) = 209 poll([{fd=3, events=POLLIN}, {fd=5, events=POLLIN}], 2, INFTIM) = 209 poll([{fd=3, events=POLLIN}, {fd=5, events=POLLIN}], 2, INFTIM) = 209 poll([{fd=3, events=POLLIN}, {fd=5, events=POLLIN}], 2, INFTIM) = 209 poll([{fd=3, events=POLLIN}, {fd=5, events=POLLIN}], 2, INFTIM) = 209 poll([{fd=3, events=POLLIN}, {fd=5, events=POLLIN}], 2, INFTIM) = 209 :
無限ループしてるので ctrl-c したら ruby プロセスも殺してしまった。
INFTIM は -1
If timeout is neither zero nor INFTIM (-1), it specifies a maximum inter- val to wait for any file descriptor to become ready, in milliseconds. If timeout is INFTIM (-1), the poll blocks indefinitely. If timeout is zero, then poll() will return without blocking.
ruby の thread_pthread.c timer_thread_sleep() らしいんだが、ruby 的にどのメソッドが呼ばれてたかはさすがに分からん。
/** * Let the timer thread sleep a while. * * The timer thread sleeps until woken up by rb_thread_wakeup_timer_thread() if only one Ruby thread is running. * @pre the calling context is in the timer thread. */ static inline void timer_thread_sleep(rb_global_vm_lock_t* gvl) { int result; int need_polling; struct pollfd pollfds[2]; pollfds[0].fd = timer_thread_pipe[0]; pollfds[0].events = POLLIN; pollfds[1].fd = timer_thread_pipe_low[0]; pollfds[1].events = POLLIN; need_polling = check_signal_thread_list(); if (gvl->waiting > 0 || need_polling) { /* polling (TIME_QUANTUM_USEC usec) */ result = poll(pollfds, 1, TIME_QUANTUM_USEC/1000); } else { /* wait (infinite) */ result = poll(pollfds, ARRAY_SIZE(pollfds), -1); <= これ }