簡體   English   中英

linux 中接收的數據包計數/字節是否有限制?

[英]Are there limit to received packet count / byte in linux?

我想編寫一個程序來發送網絡當前接收到的數據包cnt/byte。

我從 /proc/net/dev 獲取這些數據。

但我無法決定存儲這些數據的類型。

我只是覺得使用 unsigned long long int 是一種浪費。

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

決定使用哪種類型取決於實際條件,例如:

  • 你想記錄多長時間收到的數據包數
  • 上述時間的最壞情況平均數據速率是多少
  • 您將存儲(或通過網絡傳輸)此號碼多少次

一旦你弄清楚了,計算這個數字的粗略最大值。 然后,根據您要存儲(/傳輸)此數字的次數,您可以確定每種可能類型的存儲(/傳輸)量。

最后是 select 值余量很寬,不占太多空間的類型。

我不認為long long會很快變得浪費。 但是,當您計算數據包時,一個 4 字節的 integer 似乎綽綽有余,除非您處於具有瘋狂數據量的極端環境中。

uint64_tuint_fast64_tunsigned long long是此處使用的正確類型。 前兩個可從<stdint.h><inttypes.h>獲得,這是我推薦的。 unsigned long long也是完全可以接受的。 [*]

您正遭受過早優化的錯誤本能。

即使你有一千個這樣的計數器——你通常沒有——它們也會占用微不足道的 RAM,大約 8192 字節。 這只是典型用戶空間進程的 RAM 使用的一小部分,因為即使是標准的 C 庫(尤其是printf()之類的函數;以及使用<stdio.h>進行文件 I/O 的任何東西)也使用幾個命令幅度更大。

因此,當您擔心使用未簽名的 integer 類型(可能大於大多數情況下嚴格必要的類型)“浪費”了多少 memory 時,您可能會因為不選擇更好的方法或首先是更好的算法。

這是制造工作的擔憂。 還有一些更大的事情你還沒有考慮(因為你缺乏經驗或知識或兩者兼而有之)會影響你可能想到的結果——效率、memory 占用空間、完成手頭任務的運行時間——通常是比那些小細節要多一個數量級。 你需要學會從大局出發,而不是:這需要嗎? 這是有用的,還是有更好的方法來看待這個?


[*] 您可以通過net/core/net-procfs.c: dev_seq_printf_stats()查看數據的生成方式以及查看數據結構include/uapi/linux/if_link.h 來驗證這一點: struct rtnl_link_stats64

The __u64 type is how the Linux kernel calls the type, and %llu is how the Linux kernel seq_printf() implementation formats 64-bit unsigned integers.)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM