[英]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_t
、 uint_fast64_t
或unsigned 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.