linux 套接字通信延迟

Delay in linux socket communication

我有一个使用 socketcan API 发送 CAN 总线数据的用户space 应用程序(无法访问源代码)。

在发送 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()系统调用的写处理程序的内核函数。

有什么办法可以减少延迟。我不是怀疑 Linux 系统调用,而是用户 space 应用程序。我也试过增加nice值,还是有延迟。

此问题是由于 CAN 设备的队列长度较小所致。 更改 trasnmit queuelen 解决了这个问题。

ifconfig can0 txqueuelen 100