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
我有一个使用 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