当前位置: 首页 > 知识库问答 >
问题:

Linux中系统调用开销的测量

潘畅
2023-03-14

我一直在寻找一种合适的方法来衡量Linux操作系统中各种系统调用的成本。过去有许多与此主题相关的问题,没有一个提供如何准确测量的详细描述。大多数答案都武断地宣称,系统调用的成本为1-2us,如果它在CPU上缓存,则为100个周期。

  1. 系统调用开销
  2. 系统开销

我能想到的测量系统调用成本的天真方法是在getpid()等系统调用中使用rdtscp指令。然而,这不足以准确测量open()、read()或write()调用的成本。我确实可以修改内核并在这些函数中插入特定的计时器代码并进行测量,但这需要更改内核,而我不想这样做。我想知道是否有更简单的解决方案可以让我从用户空间本身来测量它。

更新:7月14日:经过大量搜索,我从RedHat找到了libMicro基准套件。https://github.com/redhat-performance/libMicro

然而,这是一段时间前创建的,我想知道这还有多好。当然,它不使用rdtscp,这会增加一些测量误差。在这个基准测试创建过程中还缺少什么吗?

共有1个答案

国胤
2023-03-14

straceperf通常用于跟踪和测量此类(内核)操作。更具体地说,perf可用于生成火焰图,使您能够查看详细的内核内函数调用。但是,应该记住,需要在/proc/sys/core/perf_event_paranoid中调整适当的权限。

我建议您将系统调用置于循环中,因为精确测量一个系统调用的成本可能会延迟/异步工作影响内核线程,这在用户空间中很难衡量,或者只是不准确(在非定制内核上)。

其他信息:

strace以微秒级粒度工作。一些POSIX时钟(请参阅clock\u gettime)可以达到100 ns的粒度。超出此限制后,rdtscp可能是最精确的(应注意参考频率)。至于性能,它使用硬件性能计数器和内核事件。您可能需要配置内核,以便跟踪点可以由perf生成和正确跟踪<代码>性能可以跟踪一个特定流程或整个系统。

 类似资料:
  • 我刚刚开始研究系统调用。我想知道当进行系统调用时是什么导致了开销。 例如,如果我们考虑getpid(),当系统调用getpid()时,我的猜测是,如果控件当前位于子进程中,则必须进行上下文切换才能进入父进程以获取pid。这会导致间接费用吗? 此外,当调用getpid()时,会有一些元数据跨用户空间边界传输,并进入和退出内核。那么,用户空间和内核之间的不断切换也会导致一些开销吗?

  • 系统调用 我们要想启动一个进程,需要操作系统的调用(system call)。实际上操作系统和普通进程是运行在不同空间上的,操作系统进程运行在内核态(todo: kernel space),开发者运行的进程运行在用户态(todo: user space),这样有效规避了用户程序破坏系统的可能。 如果用户态进程想执行内核态的操作,只能通过系统调用了。Linux提供了超多系统调用函数,我们关注与进程相

  • 问题内容: 上X86-64英特尔系统,支持和什么是从64位用户代码“最快”的系统调用在香草内核? 特别是,它必须是一个执行/ user <->内核转换1的系统调用,但执行的工作量最少。它甚至不需要执行syscall本身:某种从不分派给内核侧特定调用的早期错误是可以的,只要它不会因此而走慢。 这样的调用可用于估计原始和开销,而与调用完成的任何工作无关。 1特别是,这不包括看似系统调用但在VDSO中实

  • 问题内容: Linux编程接口 在第3章中将进行如下练习: 当使用特定于Linux的reboot()系统调用来重新引导系统时,必须将第二个参数magic2指定为一组幻数(例如LINUX_REBOOT_MAGIC2)之一。这些数字的意义是什么?(将它们转换为十六进制提供了一个线索。) 手册页告诉我们可以是LINUX_REBOOT_MAGIC2(672274793),LINUX_REBOOT_MAGI

  • 在上面的例子中,我们假设所有的进程只是CPU绑定进程。但是也忽略了上下文切换时间。 然而,如果考虑调度器在上下文切换中花费的时间,则系统的平均等待时间将增加,这也影响系统的效率。 上下文切换始终是开销。以下示例描述如果在系统中考虑上下文切换时间,效率将受到影响。 示例 在下面的例子中,假设有五个进程:,,,,和。 他们的到达时间和爆发时间如下。 进程ID 到达时间 突发时间 1 0 3 2 1 2

  • 问题内容: 我有兴趣用将在Linux内核3中实现的自定义替换系统调用。我了解到sys调用表不再公开。 有任何想法吗? 对此http://www.linuxtopia.org/online_books/linux_kernel/linux_kernel_module_programming_2.6/x978.html示例的任何引用,对于内核3都将不胜感激:) 谢谢! 问题答案: 我建议使用kprob