1. 程式人生 > 其它 >Linux嵌入式裝置怎麼確定網路埠的速率

Linux嵌入式裝置怎麼確定網路埠的速率

Linux嵌入式裝置怎麼確定網路埠的速率

突發奇想,就是Linux下面我能不能查詢到埠的速率,以此來判斷要不要頻繁的傳送網路資料包呢?
或者更換包利用率更高的協議呢。
於是抱著這樣的想法,我開始學習。
首先Linux下查詢網路的命令是ifconfig

ifconfig

那麼我能不能用ifconfig查詢網路速率呢?

$ ifconfig
eth0      Link encap:Ethernet  HWaddr 42:4C:4E:00:01:02
        inet addr:192.168.0.66  Bcast:192.168.0.255  Mask:255.255.255.0
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:37204 errors:0 dropped:123 overruns:0 frame:0
        TX packets:1014 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:2382367 (2.2 MiB)  TX bytes:128498 (125.4 KiB)
        Interrupt:62

lo        Link encap:Local Loopback
        inet addr:127.0.0.1  Mask:255.0.0.0
        UP LOOPBACK RUNNING  MTU:65536  Metric:1
        RX packets:147 errors:0 dropped:0 overruns:0 frame:0
        TX packets:147 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:14144 (13.8 KiB)  TX bytes:14144 (13.8 KiB)

可以看出ifconfig只能看到IP地址是多少,並不能看到埠的速率。
然後我看了一下網上的方法,說ethtool可以檢視埠速率。
那麼ethtool可不可以?

ethtool

ethtool的檢視方法是ethtool 網絡卡名,例如: ethtool eth0
所以說前面的ifconfig就是這一步的基礎,可以看到有什麼網絡卡。

$ ethtool eth0
Settings for eth0:
    Supported ports: [ TP  ]
    Supported link modes:   10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Supported pause frame use: No
    Supports auto-negotiation: Yes
    Supported FEC modes: Not reported
    Advertised link modes:  10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Advertised pause frame use: No
    Advertised auto-negotiation: Yes
    Advertised FEC modes: Not reported
    Speed: 1000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: on
    MDI-X: off (auto)
Cannot get wake-on-lan settings: Operation not permitted
    Current message level: 0x00000007 (7)
                           drv probe link
    Link detected: yes

發現是可以的
Speed: 1000Mb/sDuplex: Full表示這個埠是全雙工的1Gbps的速率。
也就是說傳送和接收的最高速率都是1G,注意這個是小b,也就是說1000Mb/8 = 125MB。
125MB每秒,這個是理論的最高速率,實際達不到這麼高。但也不會說特別慢。
那麼問題來了,實際上我在嵌入式裝置上沒有ethtool指令,這時候我該怎麼辦呢。
我可以交叉編譯一下ethtool,確實是個好辦法。
其實只要獲取埠速率的話,還有個辦法。

dmesg

dmesg是非常通用的除錯指令,基本上很多核心訊息都會列印在裡面。Linux很多裝置的初始化資訊都會記錄在裡面

$ dmesg | grep eth0
[   10.309153 ] gmac-dwmac ffc40000.ethernet eth0: No Safety Features support found
[   10.309205 ] gmac-dwmac ffc40000.ethernet eth0: IEEE 1588-2008 Advanced Timestamp supported
[   10.309662 ] gmac-dwmac ffc40000.ethernet eth0: registered PTP clock
[   11.332929 ] gmac-dwmac ffc40000.ethernet eth0: Link is Up - 1Gbps/Full - flow control rx/tx

可以看到Link is Up - 1Gbps/Full,所以是全雙工的1Gbps。
那我們只要加上過濾eth0: Link is Up這個資訊就好了。
問題點
不過我們的嵌入式裝置不一定所有裝置都有eth0,這個時候需要藉助ifconfig來判斷。
另外這個只在網口上線的時候才會有列印,實際上也不一定所有網口都上線了。
除開這兩點,dmesg仍然不失為一個能快速查詢網路埠速率的好辦法,我們只要配合ifconfig,然後再加上定時查詢或必要的時候查詢就可以了。

總結和思考

那麼有沒有更高效的辦法呢,我通過檢視phy驅動程式碼phy.c看到Link is Up是phy_print_status()這個函式裡面列印的
所以其實只要在驅動列印這個的時候同時上拋一份到應用層就好,但是我不是做驅動這塊的所以暫時還不知道怎麼處理。
有知道怎麼做的小夥伴歡迎在評論區留言。

那麼嵌入式檢視網路埠速率的方式是ifconfig檢視虛擬網絡卡名稱,再通過ethtool或者dmesg檢視具體虛擬網絡卡的速率。