monit 5.4 ã®ãã° - ãã«ãã¹ã¬ããã§fork(2)ãã¦ãããããã¯
ãããã¯ã·ã§ã³ç°å¢ã§ä½¿ç¨ãã¦ãã monit 5.4 ããããããã¯ãèµ·ããã¦ããã®ã§èª¿æ»ããã¦ãã¾ããããªããæ¬ã¨ã³ããªã§è¨è¿°ããã¦ãããã°ã¯ monit 5.5 ã§ä¿®æ£ããã¦ãã¾ã
è¦ç´
é·ãå 容ãªã®ã§æåã«ã¾ã¨ãã¦ããã¨
- monit ã¯ãã«ãã¹ã¬ããã¢ããªã±ã¼ã·ã§ã³ã§ãã
- monit 5.4 ã«ã¯ fork(2) å¾ã« localtime_r(3) ãå¼ã³åºãå¦çããããããããç¨ã«ãããããã¯ãå¼ãèµ·ãã
- monit 5.5 ç³»ã§ã¯ fork(2) åã« å¤æ´ãããã
- /usr/bin/gstack ã¯ä¾¿å©ãã¼ã«
- ãã«ãã¹ã¬ãã + fork(2) ã§ãããããã¯ãããã¿ã¼ã³ã«è¦è¦æ³¨æ
ãããã®å
容ã«èå³ãããæ¹ã¯èªã¿é²ãã¦ããã ããã° ...
åé¡ã«ãªã£ã monit ããã»ã¹ã®éç¨ã«ã¤ãã¦
該å½ã® monit 㯠å®æçã«ç£è¦ããã»ã¹ãåèµ·åããå½¹å²ã§ä½¿ããã¦ãã¾ããåèµ·åãããéã« monit restart <ããã»ã¹å> ãå®è¡ãã¾ããããã®å¾ monit ãã³ãã³ãã«å¿çããªããªãã¨ããç¶æ
ãå ±åããã¦ãã¾ããã
monit ããã»ã¹ã®ããã»ã¹ããªã¼ã¨ strace ã®
åé¡ãèµ·ããæç¹ã§ã® ããã»ã¹ããªã¼ã¯ä¸è¨ã®æ§ã«ãªã£ã¦ããã¨å ±åããã¦ãã¾ããã
root 4071 0.0 0.0 125096 1376 ? Sl Feb14 0:42 /usr/bin/monit root 15415 0.0 0.0 125096 748 ? S 05:00 0:00 \_ /usr/bin/monit
ã¾ã strace ã®çµæãä¸ãã£ã¦ãã¦
- 親ããã»ã¹ã¯ waitpid(2) ã§ãããã¯
- åããã»ã¹ã¯ futext(2) ã§ãããã¯
ã¨ããç¶æ
ã§ãããåè¦ã§ã¯ããªã«ããããããã¯ãã¦ããã®ããªãã¨ããäºæ³ã ãã§åå ã¯å
¨ç¶åããã¾ããã§ããã
monit 5.4 㨠monit 5.5 ã§ã® CHANGES ã調ã¹ã
ãããã¯ã·ã§ã³ã§å©ç¨ãã¦ãã®ããã¼ã¸ã§ã³ã 5.4 ã ã£ãã®ã§ã(ç¾æç¹ã§)ææ°ã®ãã¼ã¸ã§ã³ 5.5 ã® CHANGES ã追ã£ãã¨ããä¸è¨ã®å 容ãè¦ã¤ããã¾ãã
BUGFIXES: * Fix the rare hung on linux which may occur during program execution. Thanks to Nick Upson for report.
ä»åã®ç¾è±¡ã«è¿ãæãã§ããè¨è¿°ãã¡ããã¨ä¸æçã§ãã rare hung ã¨ã¯ä½ãã©ã®ã¿ã¤ãã³ã°ã§ããã³ã°ãããã®ããªã¨ ? å ã㦠monit ã®ã½ã¼ã¹ã¯ãã©ã¤ãã¼ããªãã¸ããªã§ç®¡çããã¦ããããã® CHANGES ãã©ã®å¤æ´å 容/ã³ããããæãã®ããåããã¾ããã§ããã ( ãªããã°ã¬ãã¼ãã¯ã¡ããã¨ãã£ã¦ãã®ã¨ã³ããªãæ¸ãã¦ãéã«è¦ã¤ãã¾ãã.... http://lists.gnu.org/archive/html/monit-general/2012-08/msg00020.html ãã¬ã¬ãæ¤ç´¢åã®ä½ããåé¡ã ã£ãã®ã.... )
ããã¾ã§èª¿ã¹ãå
容ã§ãã¨ãããããã¼ã¸ã§ã³ããããç´ãããï¼ã㨠issue ã«ã¬ã¹ ãã¦ã¿ãã®ã§ãããRPMãå
¥ãæ¿ãããpuppet ãæ´æ°ãã¦ããã£ããã®ä½æ¥ããã¦ãããã«ã¯è¥å¹²æ ¹æ ã¬ã¹ã§ãããã¡ãã£ã¨ç²ã£ã¦è¿½ã£ã¦è¦ããã¨ã«ãã¾ããã (çµæãã¼ã¸ã§ã³ã¢ããã§ç´ã£ãã®ã§ããã®æç¹ã§ã¢ããã°ã¬ã¼ããã¦ãã¦ããã¨ããããç´ã£ãã½ããã¼ãã¨ãã解決ã«ãªã£ãã§ããã)
/usr/bin/gstack ã§ããã¯ãã¬ã¼ã¹è§£æ
å¾æ¥ãåæ§ã®ç¾è±¡ãå度起ããã®ã§ /usr/bin/gstack ( gdb ã®RPMã«ä»å± ) ã§ããã¯ãã¬ã¼ã¹ãåãã¾ããã便å©ã
- 親ããã»ã¹ã®ãã¬ã¼ã¹
$ sudo gstack 28002 Thread 2 (Thread 0x41b4c940 (LWP 28003)): #0 0x0000003d22ecae46 in poll () from /lib64/libc.so.6 #1 0x000000000041c143 in can_read_ms () #2 0x0000000000431a6c in start_httpd () #3 0x000000000041a528 in thread_wrapper () #4 0x0000003d23606617 in start_thread () from /lib64/libpthread.so.0 #5 0x0000003d22ed3c2d in clone () from /lib64/libc.so.6 Thread 1 (Thread 0x2b358ae26cb0 (LWP 28002)): #0 0x0000003d2360e4af in waitpid () from /lib64/libpthread.so.0 #1 0x0000000000420ca1 in spawn () #2 0x0000000000415aa6 in do_stop () #3 0x0000000000415dc2 in control_service () #4 0x0000000000429945 in do_scheduled_action () #5 0x0000000000429a38 in validate () #6 0x000000000041428d in do_action () #7 0x0000000000414c62 in main ()
- åããã»ã¹ã®ãã¬ã¼ã¹
$ sudo gstack 29473 #0 0x0000003d22edf9ee in __lll_lock_wait_private () from /lib64/libc.so.6 #1 0x0000003d22e8d0dd in _L_lock_1685 () from /lib64/libc.so.6 #2 0x0000003d22e8ce27 in __tz_convert () from /lib64/libc.so.6 #3 0x000000000043a8d5 in Time_string () #4 0x0000000000420ad5 in spawn () #5 0x0000000000415aa6 in do_stop () #6 0x0000000000415dc2 in control_service () #7 0x0000000000429945 in do_scheduled_action () #8 0x0000000000429a38 in validate () #9 0x000000000041428d in do_action () #10 0x0000000000414c62 in main ()
ããã¯ãã¬ã¼ã¹ãã¨ããäºã§ãã°ãèµ·ããã¾ã§ã®å®è¡ãã¹ãæ確ã«ãªãã¾ããã
- 親ããã»ã¹ã¯ spawn() 㧠åããã»ã¹ã fork(2) ã㦠waitpid(2) ã§å¾ ã¡ãããã¯ãã¦ãã
- åããã»ã¹ã¯ spwan() 㧠fork(2)å¾ã Time_string() å
ã®ããã¯è§£æ¾å¾
ã¡ã§ãããã¯ãã¦ãã
- strace ãåã㨠futex(
, FUTEX_WAIT_PRIVATE, ...) ã§ãããã¯ãã¦ãã
- strace ãåã㨠futex(
ããããã monit ã¯ç£è¦ãã¦ããããã»ã¹ã®èµ·å/åæ¢ããéã«è¨å®ãã¡ã¤ã«ã«è¨è¿°ãããfork(2)+exec(2)ãã¦ã³ãã³ããå®è¡ããããã¾ãã«ãããããã¯ãèµ·ããã¨ãããã¨ã¾ã§åããã¾ããã
Time_string ã®å®è£ ã追ã
ããã¯ãã¬ã¼ã¹ã«åºã¦æ¥ã Time_string() ã®ä¸ã§ localtime_r(3) ãå¼ã³åºãã¦ãã¾ãã
char *Time_string(time_t time, char *result) { #define i2a(i) (x[0]=(i/10)+'0', x[1]=(i%10)+'0') if (result) { char x[2]; struct tm ts; /* This implementation needs to be fast and is around 50% faster than strftime */ /* ã³ã³ */ localtime_r((const time_t *)&time, &ts); memcpy(result, "aaa, xx aaa xxxx xx:xx:xx\0", 26); /* 0 5 8 1214 17 20 2326 */ memcpy(result, days+3*ts.tm_wday, 3);
localtime_r(3) 以ä¸ã® libc ã®å®è£
ã追ãã®ãåå«ã§ãæããããç¡ãã£ãã®ã§ localtime_r, __tz_convert ã¨ãã£ãåèªã§ Googleæ¤ç´¢ãã¦ããã¨ãã @IT ã®ãã©ã¼ã©ã ã§å種ã®ãããããã¯åé¡ãè¨è¿°ããã¦ãã¾ãã
ãã«ãã¹ã¬ãã 㨠fork(2) ã§ã®ãããããã¯
glibcã®ã½ã¼ã¹ã軽ãçºãã¦ã¿ã¾ããã ãã«ãã¹ã¬ããåä½ã®æã«ã¯ãlocaltimeçã®ã¿ã¤ã ã¾ã¼ã³æ å ±ã使ãé¢æ°ç¾¤ã¯ãå ±éã®ããã¯ã使ã£ã¦æä»å¶å¾¡ã> ã¦ããããã§ãã ãªã®ã§ä»åã®çç¶ããããã¨ããããã£ãé¢æ°ã«ãã£ã¦ä¸åº¦ããã¯ãããã£ã¦ããç¶æ 㧠ã1. fork ã«ããåããã»ã¹ãçæãã ã2. éåæã·ã°ãã«åä¿¡ã«ããã·ã°ãã«ãã³ãã©ã¸å¶å¾¡ã移ã£ã ã®ãããããçºçããæ´ã« localtime_r ã ( 1. ãªãåããã»ã¹ã2. ãªããã³ãã©ã§ ) å¼ã°ãã¦ããã¯ãåå¾ãããã¨ãããããããã¯ã«é¥ã£ããã¨èãããã¾ãã ãã®åå ã¨ãã¦ã¯ãä¸ã¤åã®ã³ã¡ã³ãã«æãããµã¤ãã«ãããããªåé¡ç¹ãããã®ã¢ããªã±ã¼ã·ã§ã³ãåãã§ããã®ã§ã¯ãªãã§ããããã
@IT総合トップ > @IT CORE > 会議室 > Linux Square会議室 > localtime_r コール で応答なし ããå¼ç¨
ã¾ãããã©ã¼ã©ã ã«è²¼ããã¦ããããã°ãèªãã ã¨ããããã«ãã¹ã¬ãã + fork(2) ã使ç¨ããé ãããããã¯ãèµ·ãããã¿ã¼ã³ããããã¨ãç¥ãã¾ãã
éå3: ãã«ãã¹ã¬ããã®ããã°ã©ã ã§ã®forkã¯ãããã ãã«ãã¹ã¬ããã®ããã°ã©ã ã§ããèªã¹ã¬ãã以å¤ã®ã¹ã¬ãããåå¨ãã¦ããç¶æ ãã§fork*1ãè¡ãã¨ããã¾ãã¾ãªåé¡ãå¼ãèµ·ããå¯è½æ§ãããã¾ãããåé¡ãã®å ¸åä¾ã¨ãã¦ã¯ãåããã»ã¹ã®ãããããã¯ãæãããã¾ããåé¡ã®è©³ç´°ãææ¡ããªãã¾ã¾ããã«ãã¹ã¬ããã®ããã°ã©ã ã§ä¸ç¨æã«forkããã®ã¯ããã¾ãããï¼
memologue UNIX上でのC++ソフトウェア設計の定石 (3) ããå¼ç¨
ããããèªãã§ä»åã®ç¾è±¡ã ãã«ãã¹ã¬ãã+fork(2) ã®ãããããã¯ã®ãã¿ã¼ã³ã«è©²å½ãããã¨ã¾ã§çµãã¾ããã
monit 5.4 㨠monit 5.5 ã® diff ã確èª
ææ°ã®ãªãªã¼ã¹ã§ãã 5.4ç³»ã¨ã® diff ã æ¹ãã¦è¿½ã£ã¦ã¿ãã¨ããä¸è¨ã®å¤æ´ãã¿ã¤ãã¾ãã
- 説æã®ããã«ä¸é¨çç¥ãã¦è¨è¿°
--- monit-5.4/src/spawn.c 2012-05-06 18:40:45.000000000 +0900 +++ monit-5.5/src/spawn.c 2012-08-20 23:39:52.000000000 +0900 + Time_string(Time_now(), date); pid= fork(); if(pid < 0) { LogError("Cannot fork a new process\n"); exit(1); }
fork(2) ããåã« Time_string() -> localtime_r(3) ãå¼ã³åºãå¤æ´ã«ãªã£ã¦ãã¾ãããã® diff ããã£ã¦ã㦠åé ã® CHANGES ã«æ¸ããã¦ãã Fix the rare hung on linux which may occur during program execution. ãä»åã®æ¤è¨¼ã«ç¸å½ãããã¨ã«ç¢ºä¿¡ãæã¦ã¾ãã
ãã®å¾ã®å¯¾å¿
ããã«ä¸ãããã¨ã GitHub ã® issue ã«ã¬ãã¼ãã㦠monit 5.4 -> monit 5.5 ã®ã¢ããã°ã¬ã¼ãä½æ¥ãé²ãã¦ããããã¨ã«ãªãã¾ãã ( ã¬ãã¼ãããå¾ããã« @tnmt ãããé»å
ç³ç«ã®å¢ãã§RPMä½ã£ãã yum install ãããã®ä½æ¥ãã¦ãã!!! )
ã¾ã¨ã
éå»ã®ãã°ãã³ãããã®ãã¬ã¼ãµããªãã£
ããã°ã©ã ã«ã¯ãã°ãã¤ããã®ã§ãããå種ã®ãã°ãè¸ãã 人ã解決ãæ±ããå ´åã«ã³ããããã°ã Changelogã§ãã£ã¦ååã«è¿½è·¡å¯è½ã«ãã¦ããã«ã¯ ä¸ä½å
¨ä½ã©ã®ãããã£ãããããã®ããªã ã¨ãããã¨ãèãã¾ããããgit commit -m "ããããªãã®ç´ãã"ãã¿ãããªã³ããããã°ã«ã¯ç©æ¥µçã«æ¤
åããã¼ããããã¼ã¯ãæãã¤ããäººæ ¼ãå½¢æããããã§ãã
ãã°ã®ãã¿ã¼ã³å
çµæçã«èª¿æ»ã«æéãããã£ã¦ãã¾ãã¾ãããããã«ãã¹ã¬ãã+fork(2)+ããã ãã㯠ã¨ããç¹ç°ãªãã¿ã¼ã³ãªã®ã§ä»å¾ã¯ãå種ã®ãã°ã«ã¯é¼»ãå©ãããã§ã (æå¾ å«ã)ããããã®ç¥è¦ãååã®ã¨ã³ã¸ãã¢ããã«ãã£ã¼ãããã¯ãã¦ä½ããã®ç³§ã«ãããã¨æã£ã¦ãã¾ãã
ãããªçµç·¯ã®é·æä¹ããã°ã¨ã³ããªã§ããã