【发布时间】:2020-04-03 07:30:57
【问题描述】:
我有一个使用 socketcan API 发送 CAN 总线数据的用户空间应用程序(无法访问源代码)。
在发送 64 字节数据时,应用程序面临任意帧(8 字节)之间 2 秒的延迟
奇怪的是,如果我使用 strace 命令运行应用程序,没有延迟,数据传输在 200 毫秒内完成。
这是内核中的代码流程,
sock_write_iter() -> sock_sendmsg() -> raw_sendmsg() -> can_send() -> __dev_queue_xmit() -> dev_hard_start_xmit() -> flexcan_start_xmit()
使用getnstimeofday(),我可以将延迟追溯到sock_write_iter(),这是socket()系统调用的write handler的内核函数。
有什么办法可以减少延迟。我不是怀疑 Linux 系统调用,而是用户空间应用程序。我也尝试增加 nice 值,但还是会出现延迟。
【问题讨论】:
-
“我可以追溯延迟” - 你是怎么做到的? “延迟 2 秒” 是通过
getnstimeofday()测量的吗? -
在函数结束时,我保存了 timespec,并在函数开始时检查了差异是否高于阈值。
-
你能通过
trace-cmd查看sock_write_iter()的延迟吗?当您需要的一切都已经提供时,您自己编写一些东西并重新编译内核有什么意义?
标签: c sockets linux-kernel strace