Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 分析(可能是I/O绑定的)进程以减少延迟_Linux_Performance_Profiling_Trace_Sampling - Fatal编程技术网

Linux 分析(可能是I/O绑定的)进程以减少延迟

Linux 分析(可能是I/O绑定的)进程以减少延迟,linux,performance,profiling,trace,sampling,Linux,Performance,Profiling,Trace,Sampling,我希望在更大的应用程序中提高特定方法的性能 目标是改善延迟(在特定功能中花费的挂钟时间),而不是(必要的)系统负载 要求: 由于我预计很多延迟都是由于I/O造成的,所以要考虑等待/阻塞所花费的时间(换句话说:看墙上的时钟时间,而不是CPU时间) 因为这个程序比我要优化的片段做得更多。需要有一种方法以编程方式启动/停止评测,或者过滤输出以仅显示进入和退出我正在优化的函数之间的时间 在方法级进行评测是可以接受的(如果可以在指令级进行评测,那就更好了。如果只评测系统调用,那可能还不够) 这是一个爱好项

我希望在更大的应用程序中提高特定方法的性能

目标是改善延迟(在特定功能中花费的挂钟时间),而不是(必要的)系统负载

要求:

  • 由于我预计很多延迟都是由于I/O造成的,所以要考虑等待/阻塞所花费的时间(换句话说:看墙上的时钟时间,而不是CPU时间)
  • 因为这个程序比我要优化的片段做得更多。需要有一种方法以编程方式启动/停止评测,或者过滤输出以仅显示进入和退出我正在优化的函数之间的时间
  • 在方法级进行评测是可以接受的(如果可以在指令级进行评测,那就更好了。如果只评测系统调用,那可能还不够)
  • 这是一个爱好项目,所以昂贵的工具不是真正的选择
  • 仪表(仪表功能)是可接受的
  • 我感兴趣的关键代码段很难手动中断(因为它已经相对较快,很难在循环中实际调用),因此需要某种自动化
  • 迄今为止丢弃的工具:

    • gprof、oprofile、callgrind(要求1)
    • 使用getrusage构建自定义内容(要求1)
    • poormansprofiler.org(要求2)
    • strace-T,dtrace,(要求2和3)
    • VTune,缩放(要求4)
    • 手动调用堆栈采样(要求6)
    • google perftools(应该能够测量墙时间,但在我的情况下,这似乎不起作用,大概是因为SIGALRM干扰
    • systemtap(我的内核没有打补丁以包含utrace)
    我尚未进一步评估的其他选项:

    • cprof(并非在这里开箱即用,似乎只有i386)
    • 手动插入跟踪点(例如,使用lttng)
    我很想知道:

    • 其他选择
    • 也许我过早地丢弃了一些工具
    • 我还没有评估过的选项是否有工作机会,如果有,如何最好地工作
    我最终决定:

    • 使用FinInstrument函数自己构建自定义的东西,基于
    这个粗糙的工具产生的跟踪很难解释,我可以很容易地想象一些工具可以进一步处理它的输出,使其变得更加有用。然而,这项工作现在已经为我完成了,所以我将该项目推迟到以后;)。

    使用

    无论是在CPU还是IO绑定的代码中,它都非常简单有效地定位优化机会

    如果你是对的,最大的机会是在一个特定的功能或模块,然后它会找到他们。如果他们在别处,它就会找到他们

    在您提到并丢弃的工具中,它与《穷人的剖析器》最为相似,但仍然不是很相似

    编辑:因为你说它是由用户交互触发的,并阻止进一步的输入,直到它完成,所以我会这样做

    首先,我假设它不会阻止发送给调试器的手动中断信号,因为否则您将无法停止无限循环。 第二,我将围绕所讨论的例程进行10次、100次或1000次的循环,因此它的循环时间足够长,可以手动中断

    现在,假设它在做I/O时花费了一小部分时间,比如50%。然后,当您中断它时,您有50%的机会在I/O中捕获它。 因此,如果您在I/O中捕获它(调用堆栈将告诉您),您还可以详细了解I/O的请求来源和原因

    它会告诉你发生了什么,这几乎肯定是令人惊讶的事情。 如果您看到它在两(2)个样本上做了一些事情,您可以找到一种消除的方法,那么您将获得相当大的加速。 事实上,如果你消除了那个活动,你事先不知道你会节省多少时间,但平均来说你可以节省分数F=(s+1)/(n+2),其中n是你采集的样本总数,s是显示该活动的样本数。 例如,如果您采集了4个堆栈样本,并在其中2个上看到了活动,则平均而言,它将为您节省F=3/6=1/2,对应于1/(1-F)或2的加速系数

    一旦你这样做了,你可以再做一次,并找到其他东西来修复。 加速因子像复利一样相乘

    然后,当然你删除了外环和“现金”所有的加速你得到

    如果您想知道这与评测有何不同,那就是通过仔细检查每个堆栈样本,以及可能的相关数据,您可以识别出可以删除的活动,如果您得到的只是测量值,那么您就只能尝试直观地了解发生了什么。 不管测量结果如何,实际节省的时间都是实际节省的时间。 重要的是找到问题所在。 无论探查器的测量精度有多高,如果你找不到它,你就不会赢。 这些页面上满是人,他们说要么他们不明白档案员告诉他们的是什么,要么似乎说没有什么需要修复的,他们只是非常愿意接受。 那是一副玫瑰色的眼镜

    • fork()
    • execxxx(测试中的过程)
    • 在父项中:
      • (在循环中)定期调用:
      • getrusage(RUSAGE_儿童,…)

    getrusage()不仅提供cpu使用情况,还提供主要/次要页面错误、上下文切换数等。其余时间可能用于等待I/O。这不会提供详细的分析信息,而是提供程序行为的良好总体示意图,与基于每个进程运行vmstat相当。

    对于I/O绑定的应用程序,您可以使用
    --collect systime=yes