【问题标题】:Are there limit to received packet count / byte in linux?linux中接收的数据包计数/字节是否有限制?
【发布时间】:2022-08-17 13:07:55
【问题描述】:

我想编写一个程序来发送网络当前收到的数据包cnt/byte。

我从 /proc/net/dev 获取这些数据。

但我无法决定存储这些数据的类型。

我只是觉得使用 unsigned long long int 是一种浪费。

接收到的数据包 cnt/byte 是否有限制,例如 RLIMIT_*?

  • “packet cnt/byte”是什么意思?因为 \'/\' 经常给出选项,所以我读的是 \"packet count\" 或 packet byte\";后者让我感到困惑。我猜你的意思是总字节数或传输的数据包?

标签: c linux networking


【解决方案1】:

决定使用哪种类型取决于实际条件,例如:

  • 您想记录多长时间收到的数据包数
  • 在上述时间内最坏情况的平均数据速率是多少
  • 您将存储(或通过网络传输)此号码多少次

一旦你弄清楚了,计算这个数字的粗略最大值。然后,根据您要存储(/传输)此数字的次数,您可以确定每种可能类型的存储(/传输)量。

最后选择值边距很宽且不占用太多空间的类型。

我不希望long long 很快变得浪费。但是,当您计算数据包时,一个 4 字节的整数似乎绰绰有余,除非您处于数据量惊人的极端环境中。

【讨论】:

    【解决方案2】:

    uint64_tuint_fast64_tunsigned long long 是此处使用的正确类型。前两个可从<stdint.h><inttypes.h> 获得,这是我推荐的。 unsigned long long 也完全可以接受。 [*]

    你正遭受一种被误导的本能过早优化.

    即使你有一千个这样的计数器——你通常没有——它们也会占用微不足道的 RAM,大约 8192 字节。这只是典型用户空间进程的 RAM 使用的一小部分,因为即使是标准 C 库(尤其是像 printf() 这样的函数;以及使用 <stdio.h> 进行文件 I/O 的任何东西)也使用了几个数量级以上.

    因此,当您担心使用可能大于严格要求的无符号整数类型会“浪费”多少内存时对于大多数情况,你可能会因为一开始就没有选择更好的方法或更好的算法而浪费了一个数量级。

    这是制造工作的担忧。有些更大的事情你还没有考虑(因为你缺乏经验或知识或两者兼而有之),它们会影响你可能正在考虑的结果——效率、内存占用、完成手头任务的运行时间——通常是比那些小细节多一个数量级。你需要学会从大局出发,而不是:这个需要吗?这有用吗,还是有更好的方法来看待这个?


    [*] 您可以通过查看net/core/net-procfs.c:dev_seq_printf_stats() 生成数据的方式以及查看数据结构include/uapi/linux/if_link.h:struct rtnl_link_stats64 来验证这一点。

    __u64 类型是 Linux 内核调用该类型的方式,%llu 是 Linux 内核 seq_printf() 实现格式化 64 位无符号整数的方式。)

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多