
è² è·å¹³åã¯ãæ¥çã§éèŠãªææšã§ãã å€ãã®äŒæ¥ã¯ããããšä»ã®å€ãã®ã¡ããªãã¯ã«åºã¥ããŠã¯ã©ãŠãã€ã³ã¹ã¿ã³ã¹ãèªåçã«ã¹ã±ãŒãªã³ã°ããäœçŸäžãã«ãè²»ãããŠããŸãã ããããLinuxã§ã¯ãããã€ãã®è¬ã«å
ãŸããŠããŸãã Linuxã®å¹³åè² è·ã远跡ããããšã¯ãäžæã§ããªãã¹ãªãŒãç¶æ
ã§ãã ãªãã§ïŒ ç§ã¯èª¬æã«äŒã£ãããšããããŸããã ãã®èšäºã§ã¯ããã®è¬ã解決ããããããè§£éããããšããŠãããã¹ãŠã®äººã®å¹³åè² è·å€ã«é¢ãããªãã¡ã¬ã³ã¹ãäœæããŸãã
Linuxã®è² è·å¹³åã¯ãå®è¡å¯èœã¹ã¬ãããšåŸ
æ©ã¹ã¬ããã®å¹³åæ°ãšããŠå®è¡å¯èœã¹ã¬ããïŒã¿ã¹ã¯ïŒã®å¿
èŠæ§ã瀺ããã·ã¹ãã è² è·å¹³åãã§ãã ããã¯ãã·ã¹ãã ã«ãã£ãŠçŸåšåŠçãããŠãããã®ãè¶
ããå¯èœæ§ã®ããè² è·ã®å°ºåºŠã§ãã ã»ãšãã©ã®ããŒã«ã¯ã3ã€ã®å¹³åå€ã衚瀺ããŸãïŒ1ã5ãããã³15åéïŒ
$ uptime 16:48:24 up 4:11, 1 user, load average: 25.25, 23.40, 23.46 top - 16:48:42 up 4:12, 1 user, load average: 25.25, 23.14, 23.37 $ cat /proc/loadavg 25.72 23.19 23.35 42/3411 43603
ããã€ãã®è§£éïŒ
- å€ã0.0ã®å Žåãã·ã¹ãã ã¯ã¢ã€ãã«ç¶æ
ã§ãã
- 1åéã®å¹³åå€ã5ãŸãã¯15ãããé«ãå Žåãè² è·ã¯å¢å ããŸãã
- 1åéã®å¹³åå€ã5ãŸãã¯15ã®å¹³åå€ãããäœãå Žåãè² è·ã¯è»œæžãããŸãã
- è² è·å€ãããã»ããµã®æ°ããã倧ããå Žåãããã©ãŒãã³ã¹ã®åé¡ãçºçããå¯èœæ§ããããŸãïŒç¶æ³ã«å¿ããŠïŒã
ãã®3ã€ã®å€ã®ã»ãããããè² è·ã®ãã€ããã¯ã¹ãè©äŸ¡ã§ããŸããããã¯ç¢ºãã«äŸ¿å©ã§ãã ãŸãããããã®ã¡ããªãã¯ã¯ãããšãã°ã¯ã©ãŠããµãŒãã¹ãèªåçã«ã¹ã±ãŒãªã³ã°ããå Žåãªã©ããªãœãŒã¹èŠä»¶ã®1ã€ã®è©äŸ¡ãå¿
èŠãªå Žåã«åœ¹ç«ã¡ãŸãã ãããããããããã詳现ã«åŠçããã«ã¯ãä»ã®ã¡ããªãã¯ã«ç®ãåããå¿
èŠããããŸãã 23-25ã®ç¯å²èªäœã®å€ã¯äœãæå³ããŸããããããã»ããµã®æ°ãããã£ãŠããŠãããã»ããµã«é¢é£ããè² è·ã«ã€ããŠè©±ããŠããå Žåã«ã¯æå³ããããŸãã
å¹³åè² è·å€ããããã°ãã代ããã«ãéåžžã¯ä»ã®ã¡ããªãã¯ã«åãæ¿ããŸãã ããã«ã€ããŠã¯ãèšäºã®çµããè¿ãã®ããã®ä»ã®é©åãªææšãã®ç« ã§èª¬æããŸãã
ç©èª
æåã¯ãå¹³åè² è·å€ã¯ãããã»ããµãªãœãŒã¹ã®å¿
èŠæ§ãã€ãŸãå®è¡äžã®ããã»ã¹ãšå®äºãåŸ
æ©ããŠããããã»ã¹ã®æ°ã®ã¿ã瀺ããŸãã RFC 546ã«ã¯ã1973幎8æã®ãTENEX Load AveragesããšåŒã°ããåªãã説æããããŸã ã
[1] TENEXã®å¹³åè² è·ã¯ãCPUãªãœãŒã¹èŠä»¶ã®å°ºåºŠã§ãã ããã¯ãäžå®æéã®å®è¡å¯èœããã»ã¹ã®å¹³åæ°ã§ãã ããšãã°ã1æéãããã®å¹³åè² è·ã10ã®å Žåãããã¯ïŒãŠãããã»ããµã·ã¹ãã ã®å ŽåïŒãã®æéäžã®ä»»æã®æç¹ã§ã1ã€ã®ããã»ã¹ãå®è¡ããã9ã€ã®å®è¡æºåãã§ããŠããïŒã€ãŸããå
¥åºåããããã¯ãããŠããªãïŒããšãæå³ããŸãããã»ããµã¯ç¡æã§ãã
ietf.orgããŒãžã§ã³ã§ã¯ã1973幎7æã«ææžãã®ã°ã©ãã®PDFã¹ãã£ã³ãè¡ããããã®ã¡ããªãã¯ãäœå幎ã䜿çšãããŠããããšãå®èšŒããŠããŸãã

ãœãŒã¹ïŒ https://tools.ietf.org/html/rfc546
仿¥ãããªãã¯ãããäžã§å€ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ãœãŒã¹ã³ãŒããèŠã€ããããšãã§ããŸãã DECãã¯ãã¢ã»ã³ãã©äžã®TENEX ïŒ1970幎代åé ïŒSCHED.MACã®ã¹ãããããæ¬¡ã«ç€ºããŸãã
NRJAVS==3 ;NUMBER OF LOAD AVERAGES WE MAINTAIN GS RJAV,NRJAVS ;EXPONENTIAL AVERAGES OF NUMBER OF ACTIVE PROCESSES [...] ;UPDATE RUNNABLE JOB AVERAGES DORJAV: MOVEI 2,^D5000 MOVEM 2,RJATIM ;SET TIME OF NEXT UPDATE MOVE 4,RJTSUM ;CURRENT INTEGRAL OF NBPROC+NGPROC SUBM 4,RJAVS1 ;DIFFERENCE FROM LAST UPDATE EXCH 4,RJAVS1 FSC 4,233 ;FLOAT IT FDVR 4,[5000.0] ;AVERAGE OVER LAST 5000 MS [...] ;TABLE OF EXP(-T/C) FOR T = 5 SEC. EXPFF: EXP 0.920043902 ;C = 1 MIN EXP 0.983471344 ;C = 5 MIN EXP 0.994459811 ;C = 15 MIN
ãããŠãããã«çŸä»£ã®Linux ïŒinclude / linux / sched / loadavg.hããïŒã®æç²ããããŸãïŒ
#define EXP_1 1884 #define EXP_5 2014 #define EXP_15 2037
Linuxã§ã¯ã1ã5ãããã³15åéã®å®æ°ãããŒãã³ãŒããããŠããŸãã
Multicsãå«ãå€ãã·ã¹ãã ã§ãåæ§ã®ã¡ããªãã¯ãèŠã€ãããŸãããããã«ã¯ãææ°ã¹ã±ãžã¥ãŒãªã³ã°ã®ãã¥ãŒå¹³åãå«ãŸããŠããŸããã
3ã€ã®æ°å
3ã€ã®æ°å€ã¯ã1ã5ãããã³15åéã®å¹³åè² è·å€ã§ãã ãããããããã¯å®éã«ã¯å¹³åã§ã¯ãªãã1ã5ã15åéã§ã¯ãããŸããã äžèšã®ã³ãŒããããããããã«ã1ã5ãããã³15ã¯ã5ç§å¹³åã®ææ°é¢æ°çã«æžè¡°ããç§»ååèšãèšç®ããæ¹çšåŒã§äœ¿çšããã宿°ã§ãã ãããã£ãŠã1ã5ãããã³15åéã®å¹³åè² è·ã¯ãæå®ãããæéã®è² è·ããŸã£ããåæ ããŠããŸããã
ã¢ã€ãã«ã·ã¹ãã ã䜿çšããããã»ããµã«é¢é£ä»ããããã·ã³ã°ã«ã¹ã¬ããã®è² è·ïŒãµã€ã¯ã«å
ã®1ã€ã®ã¹ã¬ããïŒãé©çšããå Žåã60ç§åŸã®1åéã®å¹³åè² è·å€ã¯ã©ããªããŸããïŒ ãããå¹³åçãªãã®ã§ããã°ã1.0ã«ãªããŸãã å®éšã°ã©ãã¯æ¬¡ã®ãšããã§ãã

è² è·ã®å¹³åå€ã®ææ°é¢æ°çæžè¡°ã«é¢ããå®éšã®èŠèŠåã
ããããã1åéã®å¹³åãã¯ãçŽ1åéã§çŽ0.62ã«éããŸãã Neil Guntherå士ã¯ããã®å®éšããã³ãã®ä»ã®å®éšã«ã€ããŠHow It Worksã®èšäºã§è©³çްã«èª¬æããŠããã loadavg.cã«é¢ããLinuxé¢é£ã®ã³ã¡ã³ãã倿°ãããŸãã
Linuxã®ç¶ç¶çãªã¿ã¹ã¯
Linuxãæåã«å¹³åè² è·å€ãå°å
¥ãããšãããããã¯ä»ã®OSãšåæ§ã«ãããã»ããµãªãœãŒã¹ã®å¿
èŠæ§ã®ã¿ãåæ ããŠããŸããã ããããåŸã§å€æŽãå ããããå®è¡ãããã¿ã¹ã¯ã ãã§ãªããäžæãããŠããªãç¶æ
ïŒTASK_UNINTERRUPTIBLEãŸãã¯nr_uninterruptibleïŒã®ã¿ã¹ã¯ãå«ãŸããŸããã ãã®ç¶æ
ã¯ããã£ã¹ã¯I / Oã«ãã£ãŠãããã¯ãããã¿ã¹ã¯ãäžéšã®ããã¯ãªã©ãä¿¡å·ã®äžæãåé¿ãããã³ãŒããã©ã³ãã«ãã£ãŠäœ¿çšãããŸãã ãã®ç¶æ
ã¯ãã§ã«çºçããŠããå¯èœæ§ããããŸãps
ããã³top
åºåã«ãDãç¶æ
ãšããŠè¡šç€ºãããŸãã psïŒ1ïŒããŒãžã§ã¯ããuninterruptible sleepïŒéåžžIOïŒããšåŒã°ããŸãã
éç Žå£çãªç¶æ
ãå°å
¥ããããšããããšã¯ãLinuxã§ã¯ãããã»ããµãªãœãŒã¹ã ãã§ãªãããã£ã¹ã¯ïŒãŸãã¯NFSïŒã®I / Oè² è·ã®ããã«å¹³åè² è·ãå¢å ããå¯èœæ§ãããããšãæå³ããŸãã ä»ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšãã®å¹³åããã»ããµè² è·ã«ç²ŸéããŠãããã¹ãŠã®äººã«ãšã£ãŠãæåã¯ãã®ç¶æ
ãå«ããããšã¯éåžžã«æ··ä¹±ããŸãã
ãªãã§ïŒ Linuxã§ãããè¡ãããã®ã¯ãªãã§ããïŒ
å¹³åè² è·ã«é¢ããç¡æ°ã®èšäºãããããã®å€ãã¯Linuxã§nr_uninterruptibleã«èšåããŠããŸãã ãããããªããã®æ¡ä»¶ãèæ
®ãå§ããã®ããåäžã®èª¬æããŸãã¯å°ãªããšãé倧ãªä»®å®ã¯ãããŸããã§ããã å人çã«ã¯ãããã»ããµã ãã§ãªããããäžè¬çãªãªãœãŒã¹èŠä»¶ãåæ ããããšããå§ãããŸãã
Linuxã®å€ä»£ã®ããããèŠã€ãã
Linuxã§äœãã倿ŽãããŠããçç±ãçè§£ããã®ã¯ç°¡åã§ããç®çã®ãã¡ã€ã«ã®gitã³ãããã®å±¥æŽãèŠãŠã倿Žã®èª¬æãèªãã§ãã ããã loadavg.cã®å±¥æŽã調ã¹ãŸããããäžå€ã®ç¶æ
ã远å ãã倿Žã¯ã以åã®ãã¡ã€ã«ã®ã³ãŒããå«ããã¡ã€ã«ãããåã®æ¥ä»ã§ãã å¥ã®ãã¡ã€ã«ããã§ãã¯ããŸããããæ©èœããŸããã§ãããã³ãŒããç°ãªããã¡ã€ã«ã«ããžã£ã³ããããŸããã 幞éãç¥ã£ãŠã4 GBã®ããã¹ããå«ãLinux Githubãªããžããªå
šäœã§git log -p
ãzamumpitããæåŸããèªã¿å§ãããã®ã³ãŒããæåã«çŸããå Žæãæ¢ããŸããã ãããç§ãå©ããŸããã§ããã ãªããžããªã®æãå€ã倿Žã¯ãLinusãLinux 2.6.12-rc2ãã€ã³ããŒããã2005幎ã«ããã®ãŒããå¿
èŠãªå€æŽã¯ããã«æ©ãè¡ãããŸããã
å€ãLinuxãªããžããªïŒ 1ããã³2 ïŒããããŸããããã®å€æŽã®èª¬æããããŸããã å°ãªããšããã®å®è£
ã®æ¥ä»ãèŠã€ããããšããŠã kernel.orgã®ã¢ãŒã«ã€ãã調ã¹ããšããã0.99.15ã«ãã£ãããšãããããŸãããã0.99.13ã«ã¯ãããŸããã§ããã ãã ããããŒãžã§ã³0.99.14ãæ¬ èœããŠããŸããã ç§ã¯ãããèŠã€ããŠã1993幎11æã«Linux 0.99.14ã«ç®çã®å€æŽãç»å Žããããšã確èªããŸããããã®ãªãªãŒã¹ã®èª¬æã圹ç«ã€ããšãæåŸ
ããŠããŸãããã ããã§ã¯èª¬æãèŠã€ãããŸããã§ããã
ãææ°ã®å
¬åŒãªãªãŒã¹ïŒp13ïŒã®å€æŽã¯ããªã¹ãããã«ã¯å€ãããïŒãŸãã¯æãåºãããšããã§ããŸããïŒ...ã-Linus
圌ã¯ãè² è·ã®å¹³åå€ã«é¢ä¿ã®ãªãäž»ãªå€æŽç¹ã®ã¿ã«èšåããŸããã
æ¥ä»ãŸã§ã«ãç§ã¯ã«ãŒãã«ã¡ãŒãªã³ã°ãªã¹ãã®ã¢ãŒã«ã€ããšç¹å®ã®ããããèŠã€ããããšãã§ããŸããããå€ãæçŽã¯1995幎6æã«æ¥ä»ãä»ããããŸããã
ãã¡ãŒã«ã¢ãŒã«ã€ããããå¹ççã«ã¹ã±ãŒãªã³ã°ã§ããã·ã¹ãã ã§äœæ¥ããŠãããšãã«ã誀ã£ãŠçŸåšã®ã¢ãŒã«ã€ããç Žå£ããŸããïŒahïŒãã
ç§ã¯æ°ã®æ¯ã«æãå§ããŸããã 幞ããªããšã«ããµãŒããŒã®ããã¯ã¢ããããååŸããå€ãlinux-develã¡ãŒãªã³ã°ãªã¹ãã¢ãŒã«ã€ããçºèŠããããšãã§ããŸãããããã¯å€ãã®å Žåããã€ãžã§ã¹ãã¢ãŒã«ã€ããšããŠä¿åãããŠããŸãã ç§ã¯ã98,000以äžã®æåãå«ã6,000以äžã®ãã€ãžã§ã¹ãã調ã¹ãŸãããããã®ãã¡30,000ã¯1993幎ã®ãã®ã§ãã ããããäœãèŠã€ãããŸããã§ããã ãããã®å
ã®èª¬æã¯æ°žä¹
ã«å€±ãããããã§ãããªãããšãã質åã«ã¯çããããŸããã
é£ç¶æ§ã®èµ·æº
ãããã1993幎ã®ã¢ãŒã«ã€ããããã¡ãŒã«ããã¯ã¹ãã¡ã€ã«ã®oldlinux.org Webãµã€ãã§çªç¶ã 次ã®ããšãããããŸããã
From: Matthias Urlichs <urlichs@smurf.sub.org> Subject: Load average broken ? Date: Fri, 29 Oct 1993 11:37:23 +0200 "" . . , , "", , /, . , , ⊠, . , , . ;-) --- kernel/sched.c.orig Fri Oct 29 10:31:11 1993 +++ kernel/sched.c Fri Oct 29 10:32:51 1993 @@ -414,7 +414,9 @@ unsigned long nr = 0; for(p = &LAST_TASK; p > &FIRST_TASK; --p) - if (*p && (*p)->state == TASK_RUNNING) + if (*p && ((*p)->state == TASK_RUNNING) || + (*p)->state == TASK_UNINTERRUPTIBLE) || + (*p)->state == TASK_SWAPPING)) nr += FIXED_1; return nr; } -- Matthias Urlichs \ XLink-POP N|rnberg | EMail: urlichs@smurf.sub.org Schleiermacherstra_e 12 \ Unix+Linux+Mac | Phone: ...please use email. 90491 N|rnberg (Germany) \ Consulting+Networking+Programming+etc'ing 42
ãã®å€åãåŒãèµ·ããã24幎åã®èããèªãã®ã¯ä¿¡ããããªãã»ã©çŽ æŽãããã£ãã ãã®æçŽã¯ãã¡ããªãã¯ã®å€æŽãããã»ããµã ãã§ãªãä»ã®ã·ã¹ãã ãªãœãŒã¹ã®ããŒãºãèæ
®ã«å
¥ããã¹ãã§ããããšã確èªããŸããã Linuxã¯ãå¹³åCPUè² è·ããããå¹³åã·ã¹ãã è² è·ãã®ãããªãã®ã«ç§»è¡ããŸããã
ã¹ã¯ãããé
ããã£ã¹ã¯ã䜿çšããåè¿°ã®äŸã«ã¯æå³ããããŸããã·ã¹ãã ã®ããã©ãŒãã³ã¹ãäœäžããããšããªãœãŒã¹ïŒå®è¡å¯èœããã»ã¹ããã³ãã¥ãŒã€ã³ã°ããã»ã¹ïŒã®éèŠãå¢å ããŸãã ãã ããå¹³åè² è·å€ã¯ãããã»ããµã®å®è¡ç¶æ
ïŒCPUã®å®è¡ç¶æ
ïŒã®ã¿ãèæ
®ããã¹ã¯ããã³ã°ç¶æ
ã¯èæ
®ããªããããæžå°ããŸããã ããã£ã¢ã¹ã¯ãããéè«ççã§ãããšæ£ããèãããããã£ãŠä¿®æ£ããã
仿¥ã®ç¶ç¶æ§
ããããLinuxã®å¹³åè² è·ã¯ãã£ã¹ã¯I / Oã§ã¯èª¬æã§ããªãã»ã©é«ããªããªãå ŽåããããŸããïŒ ã¯ããããã¯æ¬åœã§ãããã ããããã¯1993幎ã«ã¯ååšããªãã£ãTASK_UNINTERRUPTIBLEã䜿çšããæ°ããã³ãŒããã©ã³ãã®çµæã ãšæããŸãã Linux 0.99.14ã«ã¯ãTASK_UNINTERRUPTIBLEãŸãã¯TASK_SWAPPINGãçŽæ¥äœ¿çšããã³ãŒãã®åå²ã13åãããŸããïŒã¹ã¯ããç¶æ
ã¯åŸã«Linuxããåé€ãããŸããïŒã çŸåšãLinux 4.12ã«ã¯ãTASK_UNINTERRUPTIBLEã䜿çšãããã©ã³ããçŽ400ãããããã¯ããªããã£ããå«ãŸããŠããŸãã ãããã®åå²ã®1ã€ã¯ãè² è·ã®å¹³åå€ã§èæ
®ãããã¹ãã§ã¯ãªãå¯èœæ§ããããŸãã å€ãé«ãããããšãå床確èªãããšãã«ãããåœãŠã¯ãŸããã©ããã確èªããä¿®æ£ã§ãããã©ããã確èªããŸãã
ç§ã¯ããã£ã¢ã¹ã«æçŽãæžãã24幎åŸã«åœŒãå¹³åè² è·ã®å€åã«ã€ããŠã©ãæãããå°ããŸããã 圌ã¯1æéåŸã«çããïŒ
ããå¹³åè² è·ãã®æ¬è³ªã¯ã人éã®èгç¹ããã·ã¹ãã ã®äœ¿çšãæ°å€çã«è©äŸ¡ããããšã§ãã TASK_UNINTERRUPTIBLEã¯ïŒæå³ïŒïŒããã»ã¹ããã£ã¹ã¯ããã®èªã¿åãã®ãããªãã®ãæåŸ
ããããšãæå³ããããã¯ã·ã¹ãã è² è·ã«åœ±é¿ããŸãã ãã£ã¹ã¯äŸåã·ã¹ãã ã¯éåžžã«é
ããªãå¯èœæ§ããããŸãããå¹³åTASK_RUNNINGã¯çŽ0.1ã§ãããããã¯ãŸã£ãã圹ã«ç«ã¡ãŸããã
ãã®ãããå°ãªããšãTASK_UNINTERRUPTIBLEã®ç®çã«ã€ããŠã¯ãMatthiasã¯ãã®ã¹ãããã®æ£ç¢ºæ§ããŸã 確信ããŠããŸãã
ããã仿¥ãTASK_UNINTERRUPTIBLEã¯ããå€ãã®ãã®ã«å¯Ÿå¿ããŠããŸãã ããã»ããµãšãã£ã¹ã¯ã®ã¿ã®ãªãœãŒã¹èŠä»¶ãåæ ããããã«ãå¹³åè² è·å€ã倿Žããå¿
èŠããããŸããïŒ Peter Zijstraã¯ãã§ã«è¯ãã¢ã€ãã¢ãéã£ãŠãããŸããããã£ã¹ã¯I / Oã«ãã坿¥ã«å¯Ÿå¿ããŠãããããå¹³åè² è·ã§task_struct->in_iowait
ã§ã¯ãªãtask_struct->in_iowait
æ€èšããŠãã ããã ããããããã¯å¥ã®è³ªåãæèµ·ããŸãïŒç§ãã¡ã¯æ¬åœã«äœã欲ããã®ã§ããããïŒ ã·ã¹ãã ãªãœãŒã¹ã®éèŠãå®è¡ã¹ã¬ããã®åœ¢ã§æž¬å®ãããã§ããããããšãç©çãªãœãŒã¹ãå¿
èŠã§ããïŒ æåã®å Žåããããã®ã¹ã¬ããã¯ã·ã¹ãã ãªãœãŒã¹ãæ¶è²»ãããããäžæã®ãªãããã¯ãæ€èšããå¿
èŠããããŸãã ã¢ã€ãã«ç¶æ
ã§ã¯ãããŸããã ãã®ãããLinuxã®å¹³åçãªè² è·ã¯ãããããæ¢ã«æ£åžžã«æ©èœããŠããŸãã
äžæã®ãªãã³ãŒããã©ã³ããããããçè§£ããããã«ãããããå®éã«æž¬å®ããããšæããŸãã ãã®åŸãããŸããŸãªäŸãè©äŸ¡ããè²»ãããæéãæž¬å®ãããããçã«ããªã£ãŠãããã©ãããçè§£ã§ããŸãã
ç¶ç¶çãªã¿ã¹ã¯ã枬å®ãã
ããã¯ãå®çšŒåãµãŒããŒãã60ç§ã«æž¡ã£ãŠã«ãŒãã«ã¹ã¿ãã¯ã®ã¿ã衚瀺ãããªãCPUïŒãªãCPUïŒ ãã¬ãŒã ãã£ãŒãã§ããããã§ã¯ãTASK_UNINTERRUPTIBLEïŒ SVG ïŒç¶æ
ã®ã¿ãæ®ããŠããŸãã
ã°ã©ãã¯ãäžæã®ãªãã³ãŒããã©ã³ãã®å€ãã®äŸã瀺ããŠããŸãã

ãã¬ãŒã ã°ã©ãã«æ
£ããŠããªãå ŽåïŒãããã¯ãã¯ãªãã¯ã㊠ããããã¯ããåãšããŠè¡šç€ºãããã¹ã¿ãã¯å
šäœã調ã¹ãŸãã X軞ã®ãµã€ãºã¯ãããã»ããµå€ã§ã®ãããã¯ã«è²»ããããæéã«æ¯äŸãããœãŒãé ïŒå·Šããå³ïŒã¯éèŠã§ã¯ãããŸããã ããã»ããµå€ã®ã¹ã¿ãã¯ã®å Žåãéè²ãéžæããïŒããã»ããµå
ã®ã¹ã¿ãã¯ã®å Žåã¯æè²ã䜿çšããŸãïŒã圩床ã®å€åã¯ç°ãªããã¬ãŒã ã瀺ããŸãã
bccã® offcputimeããŒã«ã䜿çšããŠã°ã©ããçæããŸããïŒåäœãããã«ã¯Linux 4.8+ eBPFæ©èœãå¿
èŠã§ãïŒããŸãã ãã¬ãŒã ã°ã©ããäœæããããã®ã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã
# ./bcc/tools/offcputime.py -K --state 2 -f 60 > out.stacks # awk '{ print $1, $2 / 1000 }' out.stacks | ./FlameGraph/flamegraph.pl --color=io --countname=ms > out.offcpu.svgb>
åºåããã€ã¯ãç§ããããªç§ã«å€æŽããã«ã¯ãawkã䜿çšããŸãã Offcputime "--state 2"ã¯TASK_UNINTERRUPTIBLEïŒsched.hãåç
§ïŒã«å¯Ÿå¿ããŠããŸããããã¯ããã®èšäºã®ããã«è¿œå ãããªãã·ã§ã³ã§ãã ããã¯ãJoseph Bachikãã«ãŒãã«ã¹ã³ãŒãããŒã«ã§æåã«è¡ã£ããã®ã§ãbccããã³ãã¬ãŒã ã°ã©ãã£ãã¯ã䜿çšããŸãã ç§ã®äŸã§ã¯ãã«ãŒãã«ã¹ã¿ãã¯ã®ã¿ã瀺ããŠããŸãããoffcputime.pyã¯ã«ã¹ã¿ã ã¹ã¿ãã¯ããµããŒãããŠããŸãã
äžã®ã°ã©ãã«é¢ããŠïŒäžæãããŠããªãã¹ãªãŒãç¶æ
ã§è²»ãããã60ç§ã®ãã¡926ããªç§ãã衚瀺ãããŸããã ããã«ãããå¹³åè² è·å€ã¯ããã0.015ã«ãªããŸãã ããã¯cgroupãã©ã³ãã«ãã£ãŠè²»ããããæéã§ããããã®ãµãŒããŒã§ã¯å€ãã®ãã£ã¹ã¯I / Oæäœãå®è¡ãããŸããã
ãããŠãããã¯10ç§ïŒ SVG ïŒã®ã¿ãã«ããŒããããè峿·±ããã£ãŒãã§ãïŒ

å³åŽã®å¹
ã®åºãã¿ã¯ãŒã¯ã systemd-journal proc_pid_cmdline_read()
ïŒread / proc / PID / cmdlineïŒã®ããã¯ãããsystemd-journal proc_pid_cmdline_read()
ããå¹³åè² è·ã«0.07ã远å ããŸãã å·ŠåŽã«ã¯å¹
ã®åºãããŒãžãã©ãŒã«ãã¿ã¯ãŒãããã rwsem_down_read_failed()
ã§rwsem_down_read_failed()
å¹³åè² è·ã«0.23ã远å ããŸãïŒã ããŒã«ã®æ€çŽ¢æ©èœã䜿çšããŠããããã®é¢æ°ã«ããŒã³ã¿ã®è²ãä»ããŸããã rwsem_down_read_failed()
ã³ãŒãã¹ãããããrwsem_down_read_failed()
ãŸãã
while (true) { set_task_state(tsk, TASK_UNINTERRUPTIBLE); if (!waiter.task) break; schedule(); }
ããã¯ãTASK_UNINTERRUPTIBLEã䜿çšããããã¯ååŸã³ãŒãã§ãã Linuxã¯ãã»ããã©ã®mutexååŸé¢æ°ïŒäŸïŒ mutex_lock()
ããã³mutex_lock_interruptible()
ã down()
ããã³down_interruptible()
ãªã©mutex_lock_interruptible()
äžæããŒãžã§ã³ãšäžæãªãããŒãžã§ã³ãæã£ãŠããŸãã äžæãããããŒãžã§ã³ã§ã¯ãã·ã°ãã«ã®ã¿ã¹ã¯ãäžæããŠããããŠã§ã€ã¯ã¢ããããŠããã¯ãåãåãåã«åŠçãç¶è¡ã§ããŸãã äžæã®ãªãããã¯ã§ã®ã¹ãªãŒãã«è²»ããæéã¯ãéåžžãå¹³åè² è·ã«ã»ãšãã©è¿œå ãããŸããããã®å Žåãå¢å ã¯0.3ã«éããŸãã ããã«å€ãå Žåã¯ãããã¯äžã®ç«¶åãæžããããšãã§ãããã©ããã調ã¹ã䟡å€ããããŸãïŒããšãã°ã systemd-journal
ãšproc_pid_cmdline_read()
æãå§ããŸãïŒïŒããã©ãŒãã³ã¹ãæ¹åããå¹³åè² è·ãæžããããã«ã
ãããã®ã³ãŒãã®åå²ãå¹³åè² è·ã§èæ
®ããããšã¯çã«ããªã£ãŠããŸããïŒ ã¯ããšèšãã§ãããã ãããã®ã¹ã¬ããã¯å®è¡äžã«åæ¢ããããããã¯ãããŸãã ã¢ã€ãã«ç¶æ
ã§ã¯ãããŸããã ããŒããŠã§ã¢ã§ã¯ãªããå°ãªããšããœãããŠã§ã¢ãå¿
èŠã§ãã
Linuxã®è² è·å¹³åã®åæ
å¹³åè² è·ãå®å
šã«ã³ã³ããŒãã³ãã«åè§£ã§ããŸããïŒ æ¬¡ã«äŸã瀺ããŸããã¢ã€ãã«ç¶æ
ã®8ããã»ããµã·ã¹ãã ã§tarãå®è¡ããŠããã£ãã·ã¥ãããŠããªããã¡ã€ã«ãããã€ãã¢ãŒã«ã€ãããŸããã ã¢ããªã±ãŒã·ã§ã³ã¯æ°åãè²»ãããŸãããããã®ã»ãšãã©ã¯ãã£ã¹ã¯èªã¿åãæäœã«ãã£ãŠãããã¯ãããŠããŸããã 以äžã«ã3ã€ã®ç°ãªãã¿ãŒããã«ãŠã£ã³ããŠã®çµ±èšã瀺ããŸãã
terma$ pidstat -p `pgrep -x tar` 60 Linux 4.9.0-rc5-virtual (bgregg-xenial-bpf-i-0b7296777a2585be1) 08/01/2017 _x86_64_ (8 CPU) 10:15:51 PM UID PID %usr %system %guest %CPU CPU Command 10:16:51 PM 0 18468 2.85 29.77 0.00 32.62 3 tar termb$ iostat -x 60 [...] avg-cpu: %user %nice %system %iowait %steal %idle 0.54 0.00 4.03 8.24 0.09 87.10 Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util xvdap1 0.00 0.05 30.83 0.18 638.33 0.93 41.22 0.06 1.84 1.83 3.64 0.39 1.21 xvdb 958.18 1333.83 2045.30 499.38 60965.27 63721.67 98.00 3.97 1.56 0.31 6.67 0.24 60.47 xvdc 957.63 1333.78 2054.55 499.38 61018.87 63722.13 97.69 4.21 1.65 0.33 7.08 0.24 61.65 md0 0.00 0.00 4383.73 1991.63 121984.13 127443.80 78.25 0.00 0.00 0.00 0.00 0.00 0.00 termc$ uptime 22:15:50 up 154 days, 23:20, 5 users, load average: 1.25, 1.19, 1.05 [...] termc$ uptime 22:17:14 up 154 days, 23:21, 5 users, load average: 1.19, 1.17, 1.06
ãŸããäžæã®ãªãç¶æ
ïŒ SVG ïŒå°çšã®ããã»ããµå€ãã¬ãŒã ã°ã©ããäœæããŸããã

çŽåã®å¹³åè² è·ã¯1.19ã§ããã ã³ã³ããŒãã³ãã«åããŸãããã
- 0.33-CPUæétarïŒpidstatïŒ
- 0.67-ãããããã£ã¹ã¯ããã®é£ç¶èªã¿åãïŒã°ã©ã0.69ã§ã¯ã圌ã«ãšã£ãŠããŒã¿åéã¯å°ãé
ããŠéå§ããããããã«ç°ãªãæéç¯å²ãã«ããŒããŠãããšæããŸãïŒ
- 0.04-ä»ã®ããã»ããµã³ã³ã·ã¥ãŒãïŒmpstatãŠãŒã¶ãŒ+ã·ã¹ãã ãpidstatããã®tarã«ããCPUæ¶è²»ãå·®ãåŒãããã®ïŒ
- 0.11-ã«ãŒãã«ã¯ãŒã«ãŒã®é£ç¶çãªãã£ã¹ã¯å
¥å/åºåããã£ã¹ã¯ãžã®æåºïŒã°ã©ãã§ã¯å·ŠåŽã«2ã€ã®å¡ããããŸãïŒ
åèšã§1.15ãååŸãããŸãã å¥ã®0.04ãæ¬ èœããŠããŸãã äžéšã«ã¯ãããã«ã¯ééã·ããã®äžžãèª€å·®ãšæž¬å®èª€å·®ãå«ãŸããå ŽåããããŸãããããã¯äž»ã«ãå¹³åè² è·ãææ°é¢æ°çã«æžè¡°ããç§»ååèšã§ããã䜿çšãããä»ã®ã¡ããªãã¯ïŒpidstatãiostatïŒãéåžžã®å¹³åã§ãããšããäºå®ã«ããå¯èœæ§ããããŸã 1.19ãŸã§ã¯ã1åéã®å¹³åè² è·ã¯1.25ã§ãããããã¯ãäžèšã®ãããããäŸç¶ãšããŠã¡ããªãã¯ãåŒãäžããŠããããšãæå³ããŸãã ããã ç§ã®åæã®ãã£ãŒãã«ãããšã1åã®æç¹ã§ãã¡ããªãã¯ã®62ïŒ
ã¯çŸåšã®åã«ãããæ®ãã¯åã®åã«ãããŸããã 0.62 x 1.15 + 0.38 x 1.25 = 1.18ã§ãã 1.19ã«ååè¿ãã
ãã®ã·ã¹ãã ã§ã¯ã1ã€ã®ã¹ã¬ããïŒtarïŒãäœæ¥ãå®è¡ããããã«ã«ãŒãã«ã¯ãŒã«ãŒã¹ã¬ããã«ãã£ãŠããå°ãæéãè²»ãããããããLinuxã®1.19ã§ã®å¹³åè² è·ã«é¢ããã¬ããŒãã¯åŠ¥åœã«èŠããŸãã ãå¹³åããã»ããµè² è·ããæž¬å®ãããšã0.37ïŒmpstatããèšç®ãããå€ïŒã®ã¿ã衚瀺ãããŸããããã¯ããã»ããµãªãœãŒã¹ã«ã€ããŠã®ã¿æ£ãããã®ã§ãããè€æ°ã®ã¹ããªãŒã ãåŠçããå¿
èŠããããšããäºå®ã¯èæ
®ããŸããã
ãã®äŸã§ããããã®æ°å€ã倩äºããåããããã®ã§ã¯ãªãïŒããã»ããµ+äžæãªãïŒãèªåã§ã³ã³ããŒãã³ãã«åè§£ã§ããããšã瀺ããŠããã ããã°å¹žãã§ãã
Linuxã®è² è·å¹³åã®æå³
ç§ã¯å¹³åè² è·å€ãããã»ããµã®ã¿ã«é¢é£ãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§è²ã£ããããLinuxããŒãžã§ã³ã¯åžžã«ç§ãæ©ãŸããŸããã ããããå®éã®åé¡ã¯ããå¹³åè² è·ããšããçšèªããI / OããšåãããããããŸãã§ããããšã§ãã ã©ã®ãããªå
¥å/åºåã§ããïŒ ãã©ã€ãïŒ ãã¡ã€ã«ã·ã¹ãã ïŒ ãããã¯ãŒã¯ïŒ..åæ§ã«ãäœã®å¹³åè² è·ïŒ CPUïŒ ã·ã¹ãã ïŒ :
- Linux â ( ) « » , . (, , ). , , . : .
- â « » . , . : ( ).
: « » , ( ).
, - Linux , , : , , . .
«» «» ?

: , , . .
- , 1,0, . , ( ) . 1,5 , , .
, 11 16 ( 5,5 8). , . : / 2.
Linux: , , . : , 20, 40, , , .
Linux (, , ), , . , . , :
- (per-CPU utilization): ,
mpstat -P ALL 1
. - (per-process CPU utilization): ,
top, pidstat 1
. - () (per-thread run queue (scheduler) latency): , /proc/PID/schedstats, delaystats, perf sched
- (CPU run queue latency): ,
/proc/schedstat
, perf sched
, runqlat bcc . - (CPU run queue length): , vmstat 1 'r',
runqlen bcc
.
â , â (saturation metrics). , â . â ( ): , / , . . , . , .
Linux 4.6 schedstats
( sysctl kernel.sched_schedstats
) , . (delay accounting) cpustat , htop , . , , , ( ) /proc/sched_debug:
$ awk 'NF > 7 { if ($1 == "task") { if (h == 0) { print; h=1 } } else { print } }' /proc/sched_debug task PID tree-key switches prio wait-time sum-exec sum-sleep systemd 1 5028.684564 306666 120 43.133899 48840.448980 2106893.162610 0 0 /init.scope ksoftirqd/0 3 99071232057.573051 1109494 120 5.682347 21846.967164 2096704.183312 0 0 / kworker/0:0H 5 99062732253.878471 9 100 0.014976 0.037737 0.000000 0 0 / migration/0 9 0.000000 1995690 0 0.000000 25020.580993 0.000000 0 0 / lru-add-drain 10 28.548203 2 100 0.000000 0.002620 0.000000 0 0 / watchdog/0 11 0.000000 3368570 0 0.000000 23989.957382 0.000000 0 0 / cpuhp/0 12 1216.569504 6 120 0.000000 0.010958 0.000000 0 0 / xenbus 58 72026342.961752 343 120 0.000000 1.471102 0.000000 0 0 / khungtaskd 59 99071124375.968195 111514 120 0.048912 5708.875023 2054143.190593 0 0 / [...] dockerd 16014 247832.821522 2020884 120 95.016057 131987.990617 2298828.078531 0 0 /system.slice/docker.service dockerd 16015 106611.777737 2961407 120 0.000000 160704.014444 0.000000 0 0 /system.slice/docker.service dockerd 16024 101.600644 16 120 0.000000 0.915798 0.000000 0 0 /system.slice/ [...]
, . USE , Linux- .
, , . . , . ( ), ( ), . , .
, , â . , , , , . , .
ãããã«
1993 Linux- , « » « ». , , . ( , ). , 1, 5 15 . , .
Linux , . ( , ), , .
, Linux 1993- â , â . bcc/eBPF Linux- , -. , , . , .
kernel/sched/loadavg.c Linux:
, . , . , tickless-.
åç
§è³æ
- Saltzer, J., and J. Gintell. â The Instrumentation of Multics ,â CACM, August 1970 ( ).
- system_performance_graph Multics ( ).
- TENEX ( SCHED.MAC).
- RFC 546 "TENEX Load Averages for July 1973" ( ).
- Bobrow, D., et al. âTENEX: A Paged Time Sharing System for the PDP-10,â Communications of the ACM, March 1972 ( ).
- Gunther, N. "UNIX Load Average Part 1: How It Works" PDF ( ).
- Linux 0.99 patchlevel 14 .
- oldlinux.org ( alan-old-funet-lists/kernel.1993.gz, linux-, ).
- Linux kernel/sched.c : 0.99.13 , 0.99.14 .
- Linux 0.99 kernel.org .
- Linux: loadavg.c , loadavg.h
- bcc , offcputime , TASK_UNINTERRUPTIBLE.
- - , .