【问题标题】:In Linux where does the netstat -su command get the statistics?在 Linux 中,netstat -su 命令在哪里获取统计信息?
【发布时间】:2015-10-15 14:00:17
【问题描述】:

在我的 linux 服务器中,当我运行 netstat -su 时,我可以像这样获得 udp 数据包的统计信息:

netstat -su 
IcmpMsg:
    InType0: 10827
    InType3: 42792
    InType8: 298795
    InType13: 2
    OutType0: 298795
    OutType3: 328120
    OutType8: 10827
    OutType14: 2 
Udp:
    232862733 packets received
    12074334 packets to unknown port received.
    555474 packet receive errors
    8650718 packets sent 
UdpLite: IpExt:
    InBcastPkts: 375
    InOctets: 169855997552
    OutOctets: 60497003017
    InBcastOctets: 144080

netstat 命令从哪里获得这些统计信息?我可以清除缓冲区以使它们从零开始吗?

【问题讨论】:

    标签: linux netstat


    【解决方案1】:

    您无需离开终端即可找到此类问题的答案。

    让我们自己看看:

    # strace netstat -su &> netstat_strace
    

    这将是一个“打开”和“读取”,因为它从某个地方获取数据(但 grep 找出它未能读取/打开的位置):

    # grep -E 'open|read' netstat_strace  | grep -v ENOENT
    open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\37\2\0\0\0\0\0"..., 832) = 832
    open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
    open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 3
    read(3, "MemTotal:        3854816 kB\nMemF"..., 1024) = 1024
    open("/proc/net/snmp", O_RDONLY)        = 3
    read(3, "Ip: Forwarding DefaultTTL InRece"..., 4096) = 1261
    open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4
    read(4, "# Locale name alias data base.\n#"..., 4096) = 2570
    read(4, "", 4096)                       = 0
    read(3, "", 4096)                       = 0
    open("/proc/net/netstat", O_RDONLY)     = 3
    read(3, "TcpExt: SyncookiesSent Syncookie"..., 4096) = 2158
    read(3, "", 4096)                       = 0
    

    通过检查strace 输出,我们可以看到它正在写入一个字符串:

    write(1, "IcmpMsg:\n    InType0: 11\n    InT"..., 373IcmpMsg:
        InType0: 11
    

    嗯,这很有趣。让我们查看netstat 的手册页:

    man netstat
    

    如果您查看FILES

    FILES
    
       /etc/services -- The services translation file
    
       /proc -- Mount point for the proc filesystem, which gives access to kernel status information via the following files.
    
       /proc/net/dev -- device information
    
       /proc/net/raw -- raw socket information
    
       /proc/net/tcp -- TCP socket information
    
       /proc/net/udp -- UDP socket information
    
       /proc/net/igmp -- IGMP multicast information
    
    ...
    

    你可以从上面看到opened 和read 的原因。在搜索“清除”或“重置”(或阅读它)时,您会发现这些不是命令的选项。

    下一步将检查man proc,它将自己描述为“进程信息伪文件系统”。

    从这里,你可以知道如果你修改了 netstat 读取的文件,你可以改变 netstat 的输出(/proc/net/netstat 在我看来特别有趣)——你可以——但我' d 建议将其设为只读。

    【讨论】:

    • 我喜欢这种非常聪明的“逆向工程”方法
    【解决方案2】:

    计数器通常不会被重置,如果它们被重置,它就会破坏它们作为计数器的目的。计数器的重点是数据的消费者可以轮询它们并计算速率,或者计算一段时间前的增量,但轮询的频率无关紧要。数据可能有许多不同的消费者,如果计数器下降(例如为零)消费者可以丢弃数据周期或假设他们已经滚动(可能导致错误报告)。

    不过,您可以使用自己的消费者对它们进行变基(例如,运行一个脚本来获取统计信息,查看它们的当前值,并提供扣除这些初始值的后续读数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      相关资源
      最近更新 更多