最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux監(jiān)控系統(tǒng)網(wǎng)絡(luò)流量的工具大全

 更新時(shí)間:2026年03月13日 09:50:35   作者:Jinkxs  
在當(dāng)今高度互聯(lián)的世界中,網(wǎng)絡(luò)流量監(jiān)控已成為系統(tǒng)運(yùn)維、安全審計(jì)和性能優(yōu)化的重要組成部分,Linux作為廣泛部署的操作系統(tǒng),提供了豐富多樣的工具和接口用于監(jiān)控網(wǎng)絡(luò)流量,本文將深入探討這些工具,需要的朋友可以參考下

在當(dāng)今高度互聯(lián)的世界中,網(wǎng)絡(luò)流量監(jiān)控已成為系統(tǒng)運(yùn)維、安全審計(jì)和性能優(yōu)化的重要組成部分。無(wú)論是排查網(wǎng)絡(luò)瓶頸、檢測(cè)異常行為,還是進(jìn)行帶寬管理,實(shí)時(shí)掌握服務(wù)器或主機(jī)的網(wǎng)絡(luò)吞吐情況都至關(guān)重要。Linux作為廣泛部署的操作系統(tǒng),提供了豐富多樣的工具和接口用于監(jiān)控網(wǎng)絡(luò)流量。本文將深入探討這些工具,并通過(guò)Java代碼示例展示如何在應(yīng)用程序?qū)用鎸?shí)現(xiàn)網(wǎng)絡(luò)流量采集與分析。

為什么需要監(jiān)控網(wǎng)絡(luò)流量?

網(wǎng)絡(luò)流量監(jiān)控不僅僅是“看數(shù)據(jù)跑得多快”,它關(guān)系到:

  • 性能調(diào)優(yōu):識(shí)別高負(fù)載時(shí)段、瓶頸鏈路
  • 安全防護(hù):發(fā)現(xiàn)DDoS攻擊、異常外連、數(shù)據(jù)泄露
  • 資源計(jì)費(fèi):云服務(wù)商按流量計(jì)費(fèi)場(chǎng)景
  • 合規(guī)審計(jì):滿足監(jiān)管要求的數(shù)據(jù)流向記錄
  • 故障診斷:快速定位網(wǎng)絡(luò)中斷或延遲問(wèn)題

根據(jù)Sysdig 2023年度云原生安全與使用報(bào)告,超過(guò)67%的企業(yè)在生產(chǎn)環(huán)境中遭遇過(guò)因未監(jiān)控網(wǎng)絡(luò)流量導(dǎo)致的安全事件。因此,構(gòu)建有效的網(wǎng)絡(luò)監(jiān)控體系是現(xiàn)代IT基礎(chǔ)設(shè)施不可或缺的一環(huán)。

Linux內(nèi)置網(wǎng)絡(luò)監(jiān)控工具概覽

Linux內(nèi)核提供了多個(gè)層次的網(wǎng)絡(luò)信息暴露接口,用戶空間程序可通過(guò)這些接口獲取實(shí)時(shí)或歷史流量數(shù)據(jù)。以下是一些常用工具:

1.iftop—— 實(shí)時(shí)帶寬使用儀表盤

iftop 是一個(gè)類似 top 的實(shí)時(shí)網(wǎng)絡(luò)帶寬監(jiān)控工具,可顯示每個(gè)連接的實(shí)時(shí)速率(bps)。

sudo iftop -i eth0

輸出示例:

interface: eth0
IP address is: 192.168.1.100
MAC address is: aa:bb:cc:dd:ee:ff

                        12.5Kb  25.0Kb  37.5Kb  50.0Kb  62.5Kb
└──────────────────────────────────────────────────────────────
192.168.1.101         => 104.16.109.240       1.23Kb  2.45Kb  3.11Kb
                      <=                      567b    1.12Kb  1.45Kb
192.168.1.102         => 203.0.113.5          890b    1.78Kb  2.01Kb
                      <=                      321b    642b    789b

提示:安裝方式:sudo apt install iftop 或 yum install iftop

官方文檔:https://www.ex-parrot.com/pdw/iftop/

2.nethogs—— 按進(jìn)程劃分的流量統(tǒng)計(jì)

不同于 iftop 按連接統(tǒng)計(jì),nethogs 將流量歸因于具體進(jìn)程,非常適合排查“哪個(gè)程序在偷偷上傳數(shù)據(jù)”。

sudo nethogs eth0

輸出示例:

NetHogs version 0.8.6

  PID USER     PROGRAM                            DEV        SENT   RECEIVED       
 1234 root     /usr/bin/docker-proxy              eth0      2.34M     5.67M
 5678 www-data /usr/sbin/apache2                  eth0      1.23M     3.45M
 9012 user     /opt/myapp/java -jar app.jar       eth0    890.1K    1.23M

官網(wǎng):https://github.com/raboof/nethogs (注:僅提供鏈接,不展開)

3.ss和netstat—— 連接狀態(tài)快照

雖然不直接顯示流量速率,但能列出所有活躍連接及其狀態(tài),常用于輔助分析。

ss -tuln

輸出:

Netid  State    Recv-Q   Send-Q     Local Address:Port     Peer Address:Port  
tcp    LISTEN   0        100            127.0.0.1:3306          0.0.0.0:*     
tcp    ESTAB    0        0           192.168.1.100:54321   203.0.113.10:443

4./proc/net/dev—— 內(nèi)核級(jí)原始數(shù)據(jù)源

最底層的網(wǎng)絡(luò)統(tǒng)計(jì)信息存儲(chǔ)在 /proc/net/dev 文件中,包含每個(gè)網(wǎng)卡自啟動(dòng)以來(lái)的總收發(fā)字節(jié)數(shù)、包數(shù)、錯(cuò)誤數(shù)等。

cat /proc/net/dev

典型輸出:

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo: 1234567   8901    0    0    0     0          0         0  1234567   8901    0    0    0     0       0          0
  eth0: 98765432 56789    0    0    0     0          0         0  12345678 23456    0    0    0     0       0          0

這是后續(xù)我們用 Java 編程讀取的核心數(shù)據(jù)源!

網(wǎng)絡(luò)監(jiān)控架構(gòu)設(shè)計(jì)思路

在構(gòu)建自己的監(jiān)控系統(tǒng)前,先理清整體架構(gòu)。我們可以采用分層模型:

渲染錯(cuò)誤: Mermaid 渲染失敗: Lexical error on line 7. Unrecognized text. ... A1[/proc/net/dev] A2[Netlink -----------------------^

這個(gè)架構(gòu)允許我們靈活替換各組件。例如,若不想依賴外部數(shù)據(jù)庫(kù),可只保留 CLI 輸出;若追求高性能,可用 eBPF 替代 /proc 讀取。

使用Java讀取并解析/proc/net/dev

現(xiàn)在進(jìn)入實(shí)戰(zhàn)環(huán)節(jié)!我們將用 Java 編寫一個(gè)輕量級(jí)網(wǎng)絡(luò)流量監(jiān)控器,定期讀取 /proc/net/dev 并計(jì)算每秒收發(fā)速率。

第一步:定義數(shù)據(jù)結(jié)構(gòu)

第二步:解析/proc/net/dev文件

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ProcNetDevParser {

    private static final String PROC_NET_DEV_PATH = "/proc/net/dev";
    private static final Pattern INTERFACE_PATTERN = 
        Pattern.compile("^\\s*(\\w+):\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+\\d+\\s+\\d+\\s+\\d+\\s+\\d+\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)");

    public static List<NetworkInterfaceStats> parse() throws IOException {
        List<NetworkInterfaceStats> statsList = new ArrayList<>();
        
        try (BufferedReader reader = new BufferedReader(new FileReader(PROC_NET_DEV_PATH))) {
            String line;
            // 跳過(guò)前兩行標(biāo)題
            reader.readLine();
            reader.readLine();

            while ((line = reader.readLine()) != null) {
                Matcher matcher = INTERFACE_PATTERN.matcher(line);
                if (matcher.find()) {
                    NetworkInterfaceStats stats = new NetworkInterfaceStats();
                    stats.setInterfaceName(matcher.group(1));
                    stats.setReceiveBytes(Long.parseLong(matcher.group(2)));
                    stats.setReceivePackets(Long.parseLong(matcher.group(3)));
                    stats.setReceiveErrors(Long.parseLong(matcher.group(4)));
                    stats.setTransmitBytes(Long.parseLong(matcher.group(5)));
                    stats.setTransmitPackets(Long.parseLong(matcher.group(6)));
                    stats.setTransmitErrors(Long.parseLong(matcher.group(7)));

                    statsList.add(stats);
                }
            }
        }

        return statsList;
    }
}

第三步:計(jì)算每秒速率(delta)

由于 /proc/net/dev 提供的是累計(jì)值,我們需要兩次采樣并計(jì)算差值。

import java.util.HashMap;
import java.util.Map;
public class NetworkTrafficMonitor {
    private Map<String, NetworkInterfaceStats> lastSnapshot = new HashMap<>();
    private long lastTimestamp = 0;
    public void startMonitoring(long intervalMillis) {
        System.out.println("?? 開始監(jiān)控網(wǎng)絡(luò)流量... 按 Ctrl+C 停止");
        while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(intervalMillis);
                captureAndPrintDelta();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                break;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private void captureAndPrintDelta() throws Exception {
        long currentTimestamp = System.currentTimeMillis();
        List<NetworkInterfaceStats> currentSnapshot = ProcNetDevParser.parse();
        if (lastTimestamp == 0) {
            // 首次采樣,僅保存快照
            for (NetworkInterfaceStats stat : currentSnapshot) {
                lastSnapshot.put(stat.getInterfaceName(), stat);
            }
            lastTimestamp = currentTimestamp;
            return;
        }
        long timeDeltaSec = (currentTimestamp - lastTimestamp) / 1000.0;
        System.out.println("\n?? === 網(wǎng)絡(luò)流量報(bào)告 (" + java.time.LocalDateTime.now() + ") ===");
        System.out.printf("%-10s %-12s %-12s %-12s %-12s%n", 
            "接口", "RX 字節(jié)/s", "TX 字節(jié)/s", "RX 包/s", "TX 包/s");
        for (NetworkInterfaceStats current : currentSnapshot) {
            NetworkInterfaceStats last = lastSnapshot.get(current.getInterfaceName());
            if (last == null) continue;
            double rxBytesPerSec = (current.getReceiveBytes() - last.getReceiveBytes()) / timeDeltaSec;
            double txBytesPerSec = (current.getTransmitBytes() - last.getTransmitBytes()) / timeDeltaSec;
            double rxPacketsPerSec = (current.getReceivePackets() - last.getReceivePackets()) / timeDeltaSec;
            double txPacketsPerSec = (current.getTransmitPackets() - last.getTransmitPackets()) / timeDeltaSec;
            System.out.printf("%-10s %-12.0f %-12.0f %-12.0f %-12.0f%n",
                current.getInterfaceName(),
                rxBytesPerSec,
                txBytesPerSec,
                rxPacketsPerSec,
                txPacketsPerSec);
        }
        // 更新快照
        lastSnapshot.clear();
        for (NetworkInterfaceStats stat : currentSnapshot) {
            lastSnapshot.put(stat.getInterfaceName(), stat);
        }
        lastTimestamp = currentTimestamp;
    }
}

第四步:主程序入口

public class Main {
    public static void main(String[] args) {
        NetworkTrafficMonitor monitor = new NetworkTrafficMonitor();
        monitor.startMonitoring(2000); // 每2秒采樣一次
    }
}

運(yùn)行效果示例:

?? 開始監(jiān)控網(wǎng)絡(luò)流量... 按 Ctrl+C 停止
?? === 網(wǎng)絡(luò)流量報(bào)告 (2024-06-15T10:30:45.123) ===
接口         RX 字節(jié)/s    TX 字節(jié)/s    RX 包/s      TX 包/s     
lo         0            0            0            0           
eth0       15234        8976         45           32          
wlan0      0            0            0            0           
?? === 網(wǎng)絡(luò)流量報(bào)告 (2024-06-15T10:30:47.125) ===
接口         RX 字節(jié)/s    TX 字節(jié)/s    RX 包/s      TX 包/s     
lo         0            0            0            0           
eth0       18765        9876         52           38          
wlan0      0            0            0            0           

增強(qiáng)功能:過(guò)濾虛擬接口 & 單位轉(zhuǎn)換

真實(shí)環(huán)境中,lo、docker0、veth* 等虛擬接口可能干擾監(jiān)控。我們可以添加過(guò)濾邏輯:

private boolean shouldIgnoreInterface(String name) {
    return name.equals("lo") || 
           name.startsWith("docker") || 
           name.startsWith("veth") ||
           name.startsWith("br-") ||
           name.startsWith("kube");
}

并在打印前加入判斷:

if (shouldIgnoreInterface(current.getInterfaceName())) {
    continue;
}

同時(shí),為提升可讀性,可將字節(jié)轉(zhuǎn)換為 KB/s、MB/s:

private String formatBytes(double bytes) {
    if (bytes < 1024) return String.format("%.0f B/s", bytes);
    else if (bytes < 1024 * 1024) return String.format("%.1f KB/s", bytes / 1024);
    else return String.format("%.2f MB/s", bytes / (1024 * 1024));
}

修改打印語(yǔ)句:

System.out.printf("%-10s %-12s %-12s %-12.0f %-12.0f%n",
    current.getInterfaceName(),
    formatBytes(rxBytesPerSec),
    formatBytes(txBytesPerSec),
    rxPacketsPerSec,
    txPacketsPerSec);

輸出更友好:

接口         RX 字節(jié)/s    TX 字節(jié)/s    RX 包/s      TX 包/s     
eth0       18.3 KB/s    9.6 KB/s     52           38          
ens33      2.1 MB/s     1.8 MB/s     1200         980         

高級(jí)監(jiān)控:集成 Prometheus 指標(biāo)導(dǎo)出

如果你希望將數(shù)據(jù)接入企業(yè)級(jí)監(jiān)控平臺(tái)(如 Prometheus + Grafana),可以使用 Prometheus Java Client 導(dǎo)出指標(biāo)。

添加 Maven 依賴:

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient</artifactId>
    <version>0.16.0</version>
</dependency>
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_httpserver</artifactId>
    <version>0.16.0</version>
</dependency>

創(chuàng)建自定義 Collector:

import io.prometheus.client.Collector;
import io.prometheus.client.GaugeMetricFamily;
import java.util.ArrayList;
import java.util.List;
public class NetworkTrafficCollector extends Collector {
    @Override
    public List<MetricFamilySamples> collect() {
        List<MetricFamilySamples> mfs = new ArrayList<>();
        try {
            List<NetworkInterfaceStats> stats = ProcNetDevParser.parse();
            GaugeMetricFamily rxBytes = new GaugeMetricFamily(
                "network_interface_receive_bytes_total",
                "Total number of bytes received",
                List.of("interface")
            );
            GaugeMetricFamily txBytes = new GaugeMetricFamily(
                "network_interface_transmit_bytes_total",
                "Total number of bytes transmitted",
                List.of("interface")
            );
            for (NetworkInterfaceStats stat : stats) {
                if (shouldIgnoreInterface(stat.getInterfaceName())) continue;
                rxBytes.addMetric(List.of(stat.getInterfaceName()), stat.getReceiveBytes());
                txBytes.addMetric(List.of(stat.getInterfaceName()), stat.getTransmitBytes());
            }
            mfs.add(rxBytes);
            mfs.add(txBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mfs;
    }
}

啟動(dòng) HTTP Server:

import io.prometheus.client.exporter.HTTPServer;
public class PrometheusExporter {
    public static void main(String[] args) throws Exception {
        // 注冊(cè)自定義采集器
        new NetworkTrafficCollector().register();
        // 啟動(dòng) HTTP 服務(wù),默認(rèn)端口 9091
        HTTPServer server = new HTTPServer(9091);
        System.out.println("? Prometheus metrics server started on http://localhost:9091/metrics");
        // 啟動(dòng)定時(shí)刷新(可選)
        new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    Thread.sleep(5000);
                    // 強(qiáng)制觸發(fā)采集(實(shí)際由 Prometheus pull 觸發(fā))
                } catch (InterruptedException e) {
                    break;
                }
            }
        }).start();
    }
}

訪問(wèn) http://localhost:9091/metrics 可看到:

# HELP network_interface_receive_bytes_total Total number of bytes received
# TYPE network_interface_receive_bytes_total gauge
network_interface_receive_bytes_total{interface="eth0"} 98765432.0
network_interface_receive_bytes_total{interface="ens33"} 123456789.0
# HELP network_interface_transmit_bytes_total Total number of bytes transmitted
# TYPE network_interface_transmit_bytes_total gauge
network_interface_transmit_bytes_total{interface="eth0"} 12345678.0
network_interface_transmit_bytes_total{interface="ens33"} 98765432.0

Prometheus Java Client 文檔:https://prometheus.github.io/client_java/

可視化:終端動(dòng)態(tài)圖表(ASCII Art)

想在終端畫個(gè)簡(jiǎn)單的趨勢(shì)圖?我們可以用字符繪制柱狀圖!

private void printBarChart(String label, double value, double maxExpected) {
    int barWidth = 30;
    int filled = (int) ((value / maxExpected) * barWidth);
    if (filled > barWidth) filled = barWidth;
    if (filled < 0) filled = 0;
    StringBuilder bar = new StringBuilder("[");
    for (int i = 0; i < filled; i++) {
        bar.append("█");
    }
    for (int i = filled; i < barWidth; i++) {
        bar.append(" ");
    }
    bar.append("]");
    System.out.printf("%-10s %s %.1f KB/s%n", label, bar, value / 1024);
}

在監(jiān)控循環(huán)中調(diào)用:

printBarChart("↑ 發(fā)送", txBytesPerSec, 1024 * 1024); // 假設(shè)最大1MB/s
printBarChart("↓ 接收", rxBytesPerSec, 1024 * 1024);

輸出效果:

↑ 發(fā)送     [██████████                    ] 18.3 KB/s
↓ 接收     [████████████████              ] 45.6 KB/s

雖然簡(jiǎn)陋,但在無(wú)圖形界面環(huán)境下非常實(shí)用!

性能與精度考量

采樣頻率選擇

  • 高頻采樣(<1s):適合捕捉瞬時(shí)峰值,但增加CPU開銷
  • 低頻采樣(5-60s):適合長(zhǎng)期趨勢(shì)分析,資源消耗低

建議默認(rèn)使用 2~5 秒間隔,在突發(fā)流量場(chǎng)景下可臨時(shí)調(diào)整為 1 秒。

多線程 vs 單線程

當(dāng)前實(shí)現(xiàn)是單線程輪詢。若需監(jiān)控多個(gè)主機(jī)或復(fù)雜計(jì)算,可考慮:

  • 使用 ScheduledExecutorService 管理定時(shí)任務(wù)
  • 分離采集線程與計(jì)算/存儲(chǔ)線程
  • 使用阻塞隊(duì)列傳遞數(shù)據(jù)
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(this::captureSnapshot, 0, 2, TimeUnit.SECONDS);

安全與權(quán)限注意事項(xiàng)

讀取 /proc/net/dev 通常不需要 root 權(quán)限,但某些受限環(huán)境(如容器、SELinux)可能限制訪問(wèn)。

解決方案:

確保運(yùn)行用戶有讀取權(quán)限:

ls -l /proc/net/dev
# 應(yīng)顯示 -r--r--r--

若在 Docker 中運(yùn)行,添加 --cap-add=NET_ADMIN 或掛載 /proc

docker run -v /proc:/hostproc:ro myapp

并在 Java 中讀取 /hostproc/net/dev

使用 setcap 賦予 Java 程序能力(不推薦):

sudo setcap cap_net_admin+ep /path/to/java

替代方案:使用 Netlink Socket(進(jìn)階)

/proc/net/dev 是最簡(jiǎn)單的方式,但存在“輪詢”開銷。Linux 提供了更高效的 Netlink Socket 接口,支持事件驅(qū)動(dòng)式監(jiān)控。

雖然 Java 標(biāo)準(zhǔn)庫(kù)不直接支持 Netlink,但可通過(guò) JNA(Java Native Access)調(diào)用 C 函數(shù)。

示例偽代碼:

// 使用 JNA 加載 libc
interface CLibrary extends Library {
    CLibrary INSTANCE = Native.load("c", CLibrary.class);
    int socket(int domain, int type, int protocol);
    int bind(int sockfd, Pointer addr, int addrlen);
    int recv(int sockfd, Pointer buf, int len, int flags);
}
// 創(chuàng)建 NETLINK_ROUTE 類型 socket
int sock = CLibrary.INSTANCE.socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);

完整實(shí)現(xiàn)較復(fù)雜,適合對(duì)性能有極致要求的場(chǎng)景。普通監(jiān)控建議優(yōu)先使用 /proc 方案。

Netlink 官方文檔:https://man7.org/linux/man-pages/man7/netlink.7.html

打包與部署建議

使用 Fat JAR

通過(guò) Maven Shade Plugin 打包所有依賴:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.4.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals><goal>shade</goal></goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>Main</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

構(gòu)建后運(yùn)行:

mvn package
java -jar target/network-monitor-1.0.jar

創(chuàng)建 systemd 服務(wù)(生產(chǎn)環(huán)境推薦)

創(chuàng)建 /etc/systemd/system/network-monitor.service

[Unit]
Description=Network Traffic Monitor
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/bin/java -jar /opt/network-monitor.jar
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

啟用服務(wù):

sudo systemctl daemon-reload
sudo systemctl enable network-monitor
sudo systemctl start network-monitor
sudo systemctl status network-monitor

自動(dòng)化與告警集成

郵件告警示例

當(dāng)流量超過(guò)閾值時(shí)發(fā)送郵件:

import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
public class EmailAlert {
    public static void sendAlert(String subject, String body) {
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.example.com");
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("user@example.com", "password");
            }
        });
        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("monitor@example.com"));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("admin@example.com"));
            message.setSubject(subject);
            message.setText(body);
            Transport.send(message);
            System.out.println("?? 告警郵件已發(fā)送!");
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

在監(jiān)控循環(huán)中加入判斷:

if (txBytesPerSec > 10 * 1024 * 1024) { // >10MB/s
    EmailAlert.sendAlert(
        "[ALERT] 高網(wǎng)絡(luò)流量",
        String.format("接口 %s 發(fā)送速率: %.2f MB/s", 
            current.getInterfaceName(), txBytesPerSec / (1024*1024))
    );
}

云環(huán)境適配技巧

在 AWS EC2、Azure VM 或 GCP 實(shí)例中,網(wǎng)卡名稱可能是 ens5、eth0、enp0s3 等,且可能存在彈性IP、NAT等復(fù)雜情況。

建議策略:

自動(dòng)識(shí)別主網(wǎng)卡

ip route get 8.8.8.8 | awk '{print $5; exit}'

在 Java 中執(zhí)行此命令獲取默認(rèn)路由接口。

忽略云平臺(tái)虛擬接口

private boolean isCloudVirtualInterface(String name) {
    return name.startsWith("veth") || 
           name.startsWith("flannel") ||
           name.startsWith("cali") || // Calico CNI
           name.matches("tap.*") ||
           name.matches("tun.*");
}

使用云廠商監(jiān)控API補(bǔ)充數(shù)據(jù)

  • AWS CloudWatch
  • Azure Monitor
  • GCP Operations Suite

雖然超出本文范圍,但建議在混合架構(gòu)中結(jié)合使用。

最佳實(shí)踐總結(jié)

  1. 明確監(jiān)控目標(biāo):是看總量、速率、還是異常?
  2. 選擇合適粒度:接口級(jí)、進(jìn)程級(jí)、連接級(jí)?
  3. 避免過(guò)度采樣:2~5秒通常足夠
  4. 設(shè)置合理閾值告警:避免誤報(bào)
  5. 日志與指標(biāo)分離:原始數(shù)據(jù)存日志,聚合指標(biāo)進(jìn)TSDB
  6. 權(quán)限最小化原則:不要用 root 運(yùn)行監(jiān)控程序
  7. 優(yōu)雅關(guān)閉:注冊(cè) shutdown hook 清理資源
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    System.out.println("?? 正在停止監(jiān)控...");
    // 清理工作
}));

未來(lái)展望:eBPF 與可觀測(cè)性融合

雖然本文基于傳統(tǒng) /proc 文件系統(tǒng),但下一代 Linux 監(jiān)控正朝向 eBPF(extended Berkeley Packet Filter) 發(fā)展。eBPF 允許在內(nèi)核中安全運(yùn)行沙箱程序,實(shí)現(xiàn)零拷貝、事件驅(qū)動(dòng)的高性能監(jiān)控。

結(jié)語(yǔ)

通過(guò)本文,我們不僅掌握了多種 Linux 網(wǎng)絡(luò)監(jiān)控工具的使用方法,還親手用 Java 實(shí)現(xiàn)了一個(gè)功能完整的流量監(jiān)控器。從讀取 /proc/net/dev 到計(jì)算速率、單位轉(zhuǎn)換、Prometheus 集成、終端繪圖,每一步都貼近真實(shí)工程需求。

網(wǎng)絡(luò)監(jiān)控不是“一次性配置”,而是一個(gè)持續(xù)演進(jìn)的過(guò)程。隨著架構(gòu)變化、業(yè)務(wù)增長(zhǎng),你的監(jiān)控策略也應(yīng)隨之調(diào)整。希望本文為你打下堅(jiān)實(shí)基礎(chǔ),助你在 Linux 系統(tǒng)管理與 Java 開發(fā)之路上更進(jìn)一步!

以上就是Linux監(jiān)控系統(tǒng)網(wǎng)絡(luò)流量的工具大全的詳細(xì)內(nèi)容,更多關(guān)于Linux監(jiān)控網(wǎng)絡(luò)流量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • VNC連接Linux服務(wù)器藍(lán)屏的解決方法

    VNC連接Linux服務(wù)器藍(lán)屏的解決方法

    本文介紹了使用VNC連接Linux遠(yuǎn)程桌面出現(xiàn)藍(lán)屏問(wèn)題的現(xiàn)象,并提供了解決方法,包括執(zhí)行相關(guān)命令、重啟VNC進(jìn)程并重新連接,成功消除藍(lán)屏問(wèn)題,需要的朋友可以參考下
    2025-10-10
  • 詳解Linux 虛擬機(jī)根分區(qū)磁盤擴(kuò)充空間記錄

    詳解Linux 虛擬機(jī)根分區(qū)磁盤擴(kuò)充空間記錄

    這篇文章主要介紹了詳解Linux 虛擬機(jī)根分區(qū)磁盤擴(kuò)充空間記錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 你可能不知道的一些linux文件權(quán)限管理方法

    你可能不知道的一些linux文件權(quán)限管理方法

    這篇文章主要給大家介紹了一些你可能不知道的linux文件權(quán)限管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Linux下如何查看端口以及釋放端口

    Linux下如何查看端口以及釋放端口

    這篇文章主要介紹了Linux下如何查看端口以及釋放端口問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 詳解linux驅(qū)動(dòng)編寫(入門)

    詳解linux驅(qū)動(dòng)編寫(入門)

    本篇文章主要介紹了詳解linux驅(qū)動(dòng)編寫(入門),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • 查看Linux系統(tǒng)版本的常用方法

    查看Linux系統(tǒng)版本的常用方法

    本文介紹了如何使用Linux命令來(lái)查看系統(tǒng)內(nèi)核版本和發(fā)行版本,包括`cat/proc/version`,`uname-a`,`lsb_release-a`,`cat/etc/issue`等,適用于不同需求和不同的Linux發(fā)行版,有這方面需求的小伙伴不妨記一下下面的這些命令
    2025-06-06
  • CentOS服務(wù)器環(huán)境下MySQL主從同步配置方法

    CentOS服務(wù)器環(huán)境下MySQL主從同步配置方法

    這篇文章主要介紹了CentOS服務(wù)器環(huán)境下MySQL主從同步配置方法,較為詳細(xì)的分析了CentOS服務(wù)器環(huán)境下MySQL主從同步的配置操作步驟、相關(guān)命令、使用方法與注意事項(xiàng),需要的朋友可以參考下
    2018-03-03
  • centos7的yum清理緩存并更新的操作

    centos7的yum清理緩存并更新的操作

    CentOS 7中的yum(Yellowdog Updater Modified)是一個(gè)用于自動(dòng)安裝、升級(jí)、刪除軟件包的包管理工具,它基于RPM(Red Hat Package Manager)系統(tǒng),本文給大家介紹了centos7的yum清理緩存并更新的操作,需要的朋友可以參考下
    2024-09-09
  • Linux設(shè)置命令行無(wú)操作超時(shí)退出的解決方案

    Linux設(shè)置命令行無(wú)操作超時(shí)退出的解決方案

    在 Linux 系統(tǒng)安全基線檢查中,未配置命令行超時(shí)退出是一個(gè)常見的中危風(fēng)險(xiǎn),如果用戶長(zhǎng)時(shí)間保持登錄狀態(tài)但未操作,攻擊者可能利用這一點(diǎn)進(jìn)行未授權(quán)訪問(wèn),所以本文給大家介紹了Linux設(shè)置命令行無(wú)操作超時(shí)退出的解決方案,需要的朋友可以參考下
    2025-12-12
  • Linux系統(tǒng)盤占滿問(wèn)題及處理方案

    Linux系統(tǒng)盤占滿問(wèn)題及處理方案

    這篇文章主要介紹了Linux系統(tǒng)盤占滿問(wèn)題及處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04

最新評(píng)論

兴化市| 东乌珠穆沁旗| 淮阳县| 长白| 远安县| 古浪县| 阜新市| 化德县| 涿州市| 库尔勒市| 乌拉特中旗| 沙洋县| 炉霍县| 轮台县| 秦安县| 毕节市| 陆良县| 东海县| 凤山市| 旅游| 商城县| 灵宝市| 时尚| 宜春市| 敦煌市| 如东县| 姚安县| 南安市| 错那县| 建昌县| 恩平市| 尤溪县| 宣恩县| 突泉县| 常州市| 宜川县| 河津市| 治多县| 保定市| 平乐县| 平乡县|