You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Beaglebone平台C语言网络程序跨Linux内核性能分析工具咨询

性能剖析:Beaglebone平台新旧Linux内核下Socket服务端/客户端性能差异定位

问题背景

我在Beaglebone平台上编写并编译了C语言服务端与客户端程序,分别在Linux 2.6与4.9版本内核上运行后发现,旧版本内核的性能表现更优。为此需要进行性能剖析,定位函数耗时等问题。

计时代码片段

服务端代码片段

//server snippet
while(1){
    if(read(new_socket, buf, sizeof(int)) <= 0)
        break;

    // timecost start
    if(!init){
        gettimeofday(&begin, NULL);
        gettimeofday(&start, NULL);
        init = 1;
    }

    c++;
    if (c / 1000000 != print){
        gettimeofday(&end, NULL);
        printf("%d (%d) tot: %ld, last: %ld\n", print, count,
            get_usec(begin, end), get_usec(start, end));
        print = c / 1000000;
        gettimeofday(&start, NULL);
    }
    // timecost end

    count++;
    send(new_socket, buf, sizeof(int), 0);
}

客户端代码片段

//client snippet
while (1)
{
    send(client_fd, buf, sizeof(int), 0);
    if (read(client_fd, buf, sizeof(int)) <= 0)
        break;

    // timecost start
    if(!init){
        gettimeofday(&begin, NULL);
        gettimeofday(&start, NULL);
        init = 1;
    }

    c++;
    if (c / 1000000 != print){
        gettimeofday(&end, NULL);
        printf("%d (%d) tot: %ld, last: %ld\n", print, count,
                get_usec(begin, end), get_usec(start, end));
        print = c / 1000000;
        gettimeofday(&start, NULL);
    }
    // timecost end

    count++;
}

新旧内核测试结果

2.x kernel:
0 (1999999) tot: 4609998, last: 4609984
1 (3999999) tot: 9150170, last: 4540120

4.x kernel:
0 (1999999) tot: 9451743, last: 9451729
1 (3999999) tot: 18892372, last: 9440623

perf分析结果

old:
    39.54%   server  [kernel.kallsyms]  [k] finish_task_switch
     5.02%   server  [kernel.kallsyms]  [k] _raw_spin_unlock_irqrestore
     2.59%   server  [kernel.kallsyms]  [k] nf_hook_slow
new: 
    24.74%  server   [kernel.kallsyms]  [k] finish_task_switch
     2.67%  server   [kernel.kallsyms]  [k] nf_hook_slow

求助内容

目前通过perf的初步分析仍无法明确性能差异的根源,请问有哪些可用于调试/剖析系统调用使用情况与内核耗时的工具?

可用工具推荐

  • perf trace:专门追踪系统调用执行情况,可统计每个系统调用的调用次数、耗时分布,直接对比新旧内核下read/send等关键系统调用的性能差异。
  • strace:跟踪进程的系统调用,加上-T参数显示每个系统调用的耗时,-c参数生成统计报告,直观看到哪些系统调用占用更多时间。
  • ftrace:内核自带追踪工具,可深入内核函数执行流程,通过设置函数探针,记录finish_task_switch、nf_hook_slow等函数的调用耗时、上下文,对比新旧内核的执行路径差异。
  • sysdig:捕获系统调用和内核事件,支持过滤和统计,可视化进程与内核的交互,快速定位性能瓶颈点。
  • time:简单直接,用time ./server对比新旧内核下进程的总运行时间、用户态/内核态耗时占比,先确认性能差异来自用户态还是内核态。

内容的提问来源于stack exchange,提问作者Helen Tan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:54:52