.. include:: ../disclaimer-zh_CN.rst :Original: Documentation/accounting/psi.rst :Translator: Yang Yang <yang.yang29@zte.com.cn> .. _cn_psi.rst: ================= PSIâ€”â€”åŽ‹åŠ›é˜»å¡žä¿¡æ¯ ================= :日期: April, 2018 :作者: Johannes Weiner <hannes@cmpxchg.org> 当CPUã€memory或IO设备处于竞争状æ€ï¼Œä¸šåŠ¡è´Ÿè½½ä¼šéå—æ—¶å»¶æ¯›åˆºã€åžåé‡é™ä½Žï¼Œ åŠé¢ä¸´OOM的风险。 如果没有一ç§å‡†ç¡®çš„æ–¹æ³•度é‡ç³»ç»Ÿç«žäº‰ç¨‹åº¦ï¼Œåˆ™æœ‰ä¸¤ç§åŽæžœï¼šä¸€ç§æ˜¯ç”¨æˆ·è¿‡äºŽèŠ‚åˆ¶ï¼Œ 未充分利用系统资æºï¼›å¦ä¸€ç§æ˜¯è¿‡åº¦ä½¿ç”¨ï¼Œç»å¸¸æ€§é¢ä¸´ä¸šåС䏿–的风险。 psi特性能够识别和é‡åŒ–资æºç«žäº‰å¯¼è‡´çš„ä¸šåŠ¡ä¸æ–,åŠå…¶å¯¹å¤æ‚负载乃至整个系统在 时间上的影å“。 准确度é‡å› 资æºä¸è¶³é€ æˆçš„生产力æŸå¤±ï¼Œæœ‰åŠ©äºŽç”¨æˆ·åŸºäºŽç¡¬ä»¶è°ƒæ•´ä¸šåŠ¡è´Ÿè½½ï¼Œæˆ–åŸº 于业务负载é…置硬件。 psi能够实时的æä¾›ç›¸å…³ä¿¡æ¯ï¼Œå› æ¤ç³»ç»Ÿå¯åŸºäºŽpsi实现动æ€çš„负载管ç†ã€‚如实施 å¸è½½ã€è¿ç§»ã€ç–ç•¥æ€§çš„åœæ¢æˆ–æ€æ»ä½Žä¼˜å…ˆçº§æˆ–å¯é‡å¯çš„æ‰¹å¤„ç†ä»»åŠ¡ã€‚ psi帮助用户实现硬件资æºåˆ©ç”¨çŽ‡çš„æœ€å¤§åŒ–ã€‚åŒæ—¶æ— 需牺牲业务负载å¥åº·åº¦ï¼Œä¹Ÿæ— 需 é¢ä¸´OOMç‰é€ æˆä¸šåС䏿–的风险。 åŽ‹åŠ›æŽ¥å£ ======== 压力信æ¯å¯é€šè¿‡/proc/pressure/ --cpuã€memoryã€io文件分别获å–。 CPUç›¸å…³ä¿¡æ¯æ ¼å¼å¦‚下: some avg10=0.00 avg60=0.00 avg300=0.00 total=0 内å˜å’ŒIO相关信æ¯å¦‚下: some avg10=0.00 avg60=0.00 avg300=0.00 total=0 full avg10=0.00 avg60=0.00 avg300=0.00 total=0 some行代表至少有一个任务阻塞于特定资æºçš„æ—¶é—´å 比。 full行代表所有éžidleä»»åŠ¡åŒæ—¶é˜»å¡žäºŽç‰¹å®šèµ„æºçš„æ—¶é—´å 比。在这ç§çжæ€ä¸‹CPUèµ„æº å®Œå…¨è¢«æµªè´¹ï¼Œç›¸å¯¹äºŽæ£å¸¸è¿è¡Œï¼Œä¸šåŠ¡è´Ÿè½½ç”±äºŽè€—è´¹æ›´å¤šæ—¶é—´ç‰å¾…而å—到严é‡å½±å“。 ç”±äºŽæ¤æƒ…况严é‡å½±å“ç³»ç»Ÿæ€§èƒ½ï¼Œå› æ¤æ¸…楚的识别本情况并与some行所代表的情况区分开, 将有助于分æžåŠæå‡ç³»ç»Ÿæ€§èƒ½ã€‚这就是full独立于someè¡Œçš„åŽŸå› ã€‚ avgä»£è¡¨é˜»å¡žæ—¶é—´å æ¯”(百分比),为最近10ç§’ã€60ç§’ã€300秒内的å‡å€¼ã€‚è¿™æ ·æˆ‘ä»¬ æ—¢å¯è§‚å¯Ÿåˆ°çŸæœŸäº‹ä»¶çš„å½±å“,也å¯çœ‹åˆ°ä¸ç‰åŠé•¿æ—¶é—´å†…的趋势。total代表总阻塞 时间(å•ä½å¾®ç§’),å¯ç”¨äºŽè§‚å¯Ÿæ—¶å»¶æ¯›åˆºï¼Œè¿™ç§æ¯›åˆºå¯èƒ½åœ¨å‡å€¼ä¸æ— 法体现。 ç›‘æŽ§åŽ‹åŠ›é—¨é™ ============ ç”¨æˆ·å¯æ³¨å†Œè§¦å‘器,通过poll()监控资æºåŽ‹åŠ›æ˜¯å¦è¶…过门é™ã€‚ 触å‘å™¨å®šä¹‰ï¼šæŒ‡å®šæ—¶é—´çª—å£æœŸå†…累积阻塞时间的最大值。比如å¯å®šä¹‰500ms内积累 100ms阻塞,å³è§¦å‘一次唤醒事件。 触å‘器注册方法:用户打开代表特定资æºçš„psiæŽ¥å£æ–‡ä»¶ï¼Œå†™å…¥é—¨é™ã€æ—¶é—´çª—å£çš„值。 所打开的文件æè¿°ç¬¦ç”¨äºŽç‰å¾…事件,å¯ä½¿ç”¨select()ã€poll()ã€epoll()。 写入信æ¯çš„æ ¼å¼å¦‚下: <some|full> <stall amount in us> <time window in us> 示例:å‘/proc/pressure/memory写入"some 150000 1000000"将新增触å‘器,将在 1秒内至少一个任务阻塞于内å˜çš„æ€»æ—¶é—´è¶…过150ms时触å‘。å‘/proc/pressure/io写入 "full 50000 1000000"将新增触å‘器,将在1秒内所有任务都阻塞于io的总时间超过50ms时触å‘。 触å‘器å¯é’ˆå¯¹å¤šä¸ªpsi度é‡å€¼è®¾ç½®ï¼ŒåŒä¸€ä¸ªpsi度é‡å€¼å¯è®¾ç½®å¤šä¸ªè§¦å‘器。æ¯ä¸ªè§¦å‘å™¨éœ€è¦ å•独的文件æè¿°ç¬¦ç”¨äºŽè½®è¯¢ï¼Œä»¥åŒºåˆ†äºŽå…¶ä»–触å‘器。所以å³ä½¿å¯¹äºŽåŒä¸€ä¸ªpsiæŽ¥å£æ–‡ä»¶ï¼Œ æ¯ä¸ªè§¦å‘器也需è¦å•独的调用open()。 监控器在被监控资æºè¿›å…¥é˜»å¡žçŠ¶æ€æ—¶å¯åŠ¨ï¼Œåœ¨ç³»ç»Ÿé€€å‡ºé˜»å¡žçŠ¶æ€åŽåœç”¨ã€‚系统进入阻塞 状æ€åŽï¼Œç›‘控psi增长的频率为æ¯ç›‘控窗å£åˆ·æ–°10次。 å†…æ ¸æŽ¥å—的窗å£ä¸º500ms~10s,所以监控间隔为50ms~1s。设置窗å£ä¸‹é™ç›®çš„æ˜¯ä¸ºäº† 防æ¢è¿‡äºŽé¢‘ç¹çš„轮询。设置窗å£ä¸Šé™çš„ç›®çš„æ˜¯å› ä¸ºçª—å£è¿‡é•¿åˆ™æ— æ„ä¹‰ï¼Œæ¤æ—¶æŸ¥çœ‹ psiæŽ¥å£æä¾›çš„å‡å€¼å³å¯ã€‚ 监控器在激活åŽï¼Œè‡³å°‘åœ¨è·Ÿè¸ªçª—å£æœŸé—´å°†ä¿æŒæ´»åŠ¨çŠ¶æ€ã€‚以é¿å…éšç€ç³»ç»Ÿè¿›å…¥å’Œé€€å‡º 阻塞状æ€ï¼Œç›‘控器过于频ç¹çš„进入和退出活动状æ€ã€‚ 用户æ€é€šçŸ¥åœ¨ç›‘控窗å£å†…会å—到速率é™åˆ¶ã€‚当对应的文件æè¿°ç¬¦å…³é—,触å‘器会自动注销。 用户æ€ç›‘控器使用示例 ==================== :: #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <poll.h> #include <string.h> #include <unistd.h> /* 监控内å˜éƒ¨åˆ†é˜»å¡žï¼Œç›‘控时间窗å£ä¸º1ç§’ã€é˜»å¡žé—¨é™ä¸º150毫秒。*/ int main() { const char trig[] = "some 150000 1000000"; struct pollfd fds; int n; fds.fd = open("/proc/pressure/memory", O_RDWR | O_NONBLOCK); if (fds.fd < 0) { printf("/proc/pressure/memory open error: %s\n", strerror(errno)); return 1; } fds.events = POLLPRI; if (write(fds.fd, trig, strlen(trig) + 1) < 0) { printf("/proc/pressure/memory write error: %s\n", strerror(errno)); return 1; } printf("waiting for events...\n"); while (1) { n = poll(&fds, 1, -1); if (n < 0) { printf("poll error: %s\n", strerror(errno)); return 1; } if (fds.revents & POLLERR) { printf("got POLLERR, event source is gone\n"); return 0; } if (fds.revents & POLLPRI) { printf("event triggered!\n"); } else { printf("unknown event received: 0x%x\n", fds.revents); return 1; } } return 0; } Cgroup2æŽ¥å£ =========== 对于CONFIG_CGROUP=yåŠæŒ‚载了cgroup2文件系统的系统,能够获å–cgroups内任务的psi。 æ¤åœºæ™¯ä¸‹cgroupfs挂载点的å目录包å«cpu.pressureã€memory.pressureã€io.pressure文件, å†…å®¹æ ¼å¼ä¸Ž/proc/pressure/下的文件相åŒã€‚ å¯è®¾ç½®åŸºäºŽcgroupçš„psi监控器,方法与系统级psi监控器相åŒã€‚