【问题标题】:Delay in linux socket communicationlinux socket通信延迟
【发布时间】: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


【解决方案1】:

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

ifconfig can0 txqueuelen 100

【讨论】:

    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2021-02-12
    相关资源
    最近更新 更多