以下脚本用户跟踪redis的主定时器事件serverCron的每次耗时

    1. # sudo stap serverCronMs.stp
    2. probe begin {
    3. printf("Start...\n");
    4. }
    5. global enterMs
    6. probe process("/data/redis/src/redis-server").function("serverCron").call {
    7. enterMs = gettimeofday_ms();
    8. }
    9. probe process("/data/redis/src/redis-server").function("serverCron").return {
    10. nowMs = gettimeofday_ms();
    11. printf("serverCron enterMs:%\d, returnMs: %d, elapsed %ldms\n",enterMs, nowMs, nowMs - enterMs);
    12. }

    输出如下:

    1. kuiper@ubuntu-v64:/data$ sudo stap serverCronMs.stp
    2. Start...
    3. serverCron enterMs:1635072250022, returnMs: 1635072250022, elapsed 0ms
    4. serverCron enterMs:1635072250123, returnMs: 1635072250123, elapsed 0ms
    5. serverCron enterMs:1635072250224, returnMs: 1635072250224, elapsed 0ms
    6. serverCron enterMs:1635072250325, returnMs: 1635072250325, elapsed 0ms
    7. serverCron enterMs:1635072250426, returnMs: 1635072250426, elapsed 0ms
    8. serverCron enterMs:1635072250527, returnMs: 1635072250527, elapsed 0ms
    9. serverCron enterMs:1635072250628, returnMs: 1635072250628, elapsed 0ms
    10. serverCron enterMs:1635072250728, returnMs: 1635072250728, elapsed 0ms
    11. serverCron enterMs:1635072250829, returnMs: 1635072250829, elapsed 0ms
    12. serverCron enterMs:1635072250929, returnMs: 1635072250929, elapsed 0ms
    13. serverCron enterMs:1635072251030, returnMs: 1635072251030, elapsed 0ms
    14. serverCron enterMs:1635072251131, returnMs: 1635072251131, elapsed 0ms
    15. serverCron enterMs:1635072251232, returnMs: 1635072251232, elapsed 0ms
    16. serverCron enterMs:1635072251333, returnMs: 1635072251333, elapsed 0ms
    17. serverCron enterMs:1635072251434, returnMs: 1635072251435, elapsed 1ms
    18. serverCron enterMs:1635072251535, returnMs: 1635072251535, elapsed 0ms
    19. serverCron enterMs:1635072251635, returnMs: 1635072251636, elapsed 1ms

    直方图每秒打印1次, 每次刚好10次serverCrop, 具体的分布情况 单位微秒

    1. probe begin {
    2. printf("Start...\n");
    3. }
    4. global enterMs
    5. global sends
    6. probe process("/data/redis/src/redis-server").function("serverCron").call {
    7. //printf("******************************************************************\n");
    8. //enterMs = gettimeofday_us();
    9. }
    10. probe process("/data/redis/src/redis-server").function("serverCron").return {
    11. // nowMs = gettimeofday_us();
    12. // print_ubacktrace();
    13. // printf("%s\n", thread_indent(4));
    14. // printf("serverCron enterMs:%\d, returnMs: %d, elapsed %ldms\n",enterMs, nowMs, nowMs - enterMs);
    15. sends <<< gettimeofday_us() - @entry(gettimeofday_us())
    16. }
    17. probe timer.s(1) {
    18. print(@hist_log(sends));
    19. delete sends
    20. }

    输出:

    1. value |-------------------------------------------------- count
    2. 16 | 0
    3. 32 | 0
    4. 64 |@@ 2
    5. 128 |@ 1
    6. 256 |@@@@@@ 6
    7. 512 |@ 1
    8. 1024 | 0
    9. 2048 | 0
    10. value |-------------------------------------------------- count
    11. 16 | 0
    12. 32 | 0
    13. 64 |@@@@@ 5
    14. 128 |@ 1
    15. 256 |@@@@ 4
    16. 512 | 0
    17. 1024 | 0
    18. value |-------------------------------------------------- count
    19. 8 | 0
    20. 16 | 0
    21. 32 |@@@@ 4
    22. 64 | 0
    23. 128 | 0
    24. 256 |@@@@@ 5
    25. 512 |@ 1
    26. 1024 | 0
    27. 2048 | 0