Có một số câu trả lời tuyệt vời ở đây, tôi chỉ muốn thêm một vài lựa chọn.
1. Tôi biết đây không hoàn toàn là những gì bạn yêu cầu (đọc tiếp theo những cách khác). Nhưng nếu bạn muốn biết hiệu năng thực tế của NIC của bạn , hơn là những gì máy tính của bạn nói, bạn có thể sử dụng iperf. Tôi thường làm điều này - bởi vì bạn không bao giờ biết. Tôi đã mua một NIC 1Gb gần đây chỉ chuyển ở tốc độ 672Mb / giây nhưng đường lên của nó là 1Gb. Điều tốt là tôi đã kiểm tra.
Bạn sẽ cần hai máy tính.
Trên máy tính, chạy iperf ở chế độ máy chủ:
iperf -s
Mặt khác, chạy iperf trong chế độ máy khách:
iperf -c 192.168.0.10
Nếu bạn muốn xem tốc độ song công hoàn toàn, thay vào đó hãy thử điều này:
iperf -d -c 192.168.0.10
Thay thế 192.168.0.10 cho địa chỉ IP của máy chủ
2. Trên các hệ thống Ubuntu, /var/log/kern.log
đã đăng nhập hạn chế các sự kiện kernel. Nó sẽ ghi lại tốc độ liên kết và trạng thái của một NIC khi nó thay đổi. Tôi chắc rằng các bản phân phối khác có thể làm điều gì đó tương tự hoặc có thể được thiết lập để làm như vậy.
$ tail -n 300 /var/log/kern.log.1 | grep slave0
Aug 28 12:54:04 haze kernel: [ 9452.766248] e1000e: slave0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
Aug 28 12:54:41 haze NetworkManager[921]: <info> [1472403281.8486] device (slave0): link disconnected
Aug 28 12:54:41 haze kernel: [ 9489.898476] e1000e: slave0 NIC Link is Down
3. Có lẽ bạn sẽ không bao giờ cần phải đi xa đến thế, nhưng bạn có thể viết mã c để có được tốc độ. Đã kiểm tra làm việc và root là không cần thiết.
https://stackoverflow.com/questions/2872058/get-link-speed-programmatically
#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <linux/sockios.h>
#include <linux/if.h>
#include <linux/ethtool.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
int sock;
struct ifreq ifr;
struct ethtool_cmd edata;
int rc;
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock < 0) {
perror("socket");
exit(1);
}
strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
ifr.ifr_data = &edata;
edata.cmd = ETHTOOL_GSET;
rc = ioctl(sock, SIOCETHTOOL, &ifr);
if (rc < 0) {
perror("ioctl");
exit(1);
}
switch (ethtool_cmd_speed(&edata)) {
case SPEED_10: printf("10Mbps\n"); break;
case SPEED_100: printf("100Mbps\n"); break;
case SPEED_1000: printf("1Gbps\n"); break;
case SPEED_2500: printf("2.5Gbps\n"); break;
case SPEED_10000: printf("10Gbps\n"); break;
default: printf("Speed returned is %d\n", edata.speed);
}
return (0);
}