如何监控LINUX网络状态

如何监控LINUX网络状态,第1张

下面是按功能划分的命令名称。

监控总体带宽使用――nload、bmon、slurm、bwm-ng、cbm、speedometer和netload

监控总体带宽使用(批量式输出)――vnstat、ifstat、dstat和collectl

每个套接字连接的带宽使用――iftop、iptraf、tcptrack、pktstat、netwatch和trafshow

每个进程的带宽使用――nethogs

1. nload

nload是一个命令行工具,让用户可以分开来监控入站流量和出站流量。它还可以绘制图表以显示入站流量和出站流量,视图比例可以调整。用起来很简单,不支持许多选项。

所以,如果你只需要快速查看总带宽使用情况,无需每个进程的详细情况,那么nload用起来很方便。

$ nload

安装nload:Fedora和Ubuntu在默认软件库里面就有nload。CentOS用户则需要从Epel软件库获得nload。

# fedora或centos $ yum install nload -y # ubuntu/debian $ sudo apt-get install nload

2. iftop

iftop可测量通过每一个套接字连接传输的数据;它采用的工作方式有别于nload。iftop使用pcap库来捕获进出网络适配器的数据包,然后汇总数据包大小和数量,搞清楚总的带宽使用情况。

虽然iftop报告每个连接所使用的带宽,但它无法报告参与某个套按字连接的进程名称/编号(ID)。不过由于基于pcap库,iftop能够过滤流量,并报告由过滤器指定的所选定主机连接的带宽使用情况。

$ sudo iftop -n

n选项可以防止iftop将IP地址解析成主机名,解析本身就会带来额外的网络流量。

安装iftop:Ubuntu/Debian/Fedora用户可以从默认软件库获得它。CentOS用户可以从Epel获得它。

# fedora或centos yum install iftop -y # ubuntu或 debian $ sudo apt-get install iftop

3. iptraf

iptraf是一款交互式、色彩鲜艳的IP局域网监控工具。它可以显示每个连接以及主机之间传输的数据量。下面是屏幕截图。

$ sudo iptraf

安装iptraf:

# Centos(基本软件库) $ yum install iptraf # fedora或centos(带epel) $ yum install iptraf-ng -y # ubuntu或debian $ sudo apt-get install iptraf iptraf-ng

4. nethogs

nethogs是一款小巧的"net top"工具,可以显示每个进程所使用的带宽,并对列表排序,将耗用带宽最多的进程排在最上面。万一出现带宽使用突然激增的情况,用户迅速打开nethogs,就可以找到导致带宽使用激增的进程。nethogs可以报告程序的进程编号(PID)、用户和路径。

$ sudo nethogs

安装nethogs:Ubuntu、Debian和Fedora用户可以从默认软件库获得。CentOS用户则需要Epel。

# ubuntu或debian(默认软件库) $ sudo apt-get install nethogs # fedora或centos(来自epel) $ sudo yum install nethogs -y

5. bmon

bmon(带宽监控器)是一款类似nload的工具,它可以显示系统上所有网络接口的流量负载。输出结果还含有图表和剖面,附有数据包层面的详细信息。

安装bmon:Ubuntu、Debian和Fedora用户可以从默认软件库来安装。CentOS用户则需要安装repoforge,因为Epel里面没有bmon。

# ubuntu或debian $ sudo apt-get install bmon # fedora或centos(来自repoforge) $ sudo yum install bmon

bmon支持许多选项,能够制作HTML格式的报告。欲知更多信息,请参阅参考手册页。

6. slurm

slurm是另一款网络负载监控器,可以显示设备的统计信息,还能显示ASCII图形。它支持三种不同类型的图形,使用c键、s键和l键即可激活每种图形。slurm功能简单,无法显示关于网络负载的任何更进一步的详细信息。

$ slurm -s -i eth0

安装slurm

# debian或ubuntu $ sudo apt-get install slurm # fedora或centos $ sudo yum install slurm -y

7. tcptrack

tcptrack类似iftop,使用pcap库来捕获数据包,并计算各种统计信息,比如每个连接所使用的带宽。它还支持标准的pcap过滤器,这些过滤器可用来监控特定的连接。

安装tcptrack:Ubuntu、Debian和Fedora在默认软件库里面就有它。CentOS用户则需要从RepoForge获得它,因为Epel里面没有它。

# ubuntu, debian $ sudo apt-get install tcptrack # fedora, centos(来自repoforge软件库) $ sudo yum install tcptrack

8. vnstat

vnstat与另外大多数工具有点不一样。它实际上运行后台服务/守护进程,始终不停地记录所传输数据的大小。之外,它可以用来制作显示网络使用历史情况的报告。

$ service vnstat status * vnStat daemon is running

运行没有任何选项的vnstat,只会显示自守护进程运行以来所传输的数据总量。

$ vnstat Database updated: Mon Mar 17 15:26:59 2014 eth0 since 06/12/13 rx: 135.14 GiB tx: 35.76 GiB total: 170.90 GiB monthly rx | tx |total| avg. rate ------------------------+-------------+-------------+------------- Feb '14 8.19 GiB |2.08 GiB | 10.27 GiB | 35.60 kbit/s Mar '14 4.98 GiB |1.52 GiB |6.50 GiB | 37.93 kbit/s ------------------------+-------------+-------------+------------- estimated 9.28 GiB |2.83 GiB | 12.11 GiB | daily rx | tx |total| avg. rate ------------------------+-------------+-------------+------------- yesterday 236.11 MiB | 98.61 MiB | 334.72 MiB | 31.74 kbit/s today128.55 MiB | 41.00 MiB | 169.56 MiB | 24.97 kbit/s ------------------------+-------------+-------------+------------- estimated 199 MiB | 63 MiB | 262 MiB |

想实时监控带宽使用情况,请使用"-l"选项(实时模式)。然后,它会显示入站数据和出站数据所使用的总带宽量,但非常精确地显示,没有关于主机连接或进程的任何内部详细信息。

$ vnstat -l -i eth0 Monitoring eth0...(press CTRL-C to stop) rx: 12 kbit/s10 p/s tx: 12 kbit/s11 p/s

vnstat更像是一款制作历史报告的工具,显示每天或过去一个月使用了多少带宽。它并不是严格意义上的实时监控网络的工具。

vnstat支持许多选项,支持哪些选项方面的详细信息请参阅参考手册页。

安装vnstat

# ubuntu或debian $ sudo apt-get install vnstat # fedora或 centos(来自epel) $ sudo yum install vnstat

9. bwm-ng

bwm-ng(下一代带宽监控器)是另一款非常简单的实时网络负载监控工具,可以报告摘要信息,显示进出系统上所有可用网络接口的不同数据的传输速度。

$ bwm-ng bwm-ng v0.6 (probing every 0.500s), press 'h' for help input: /proc/net/dev type: rate / iface Rx TxT ot================================================================= == eth0: 0.53 KB/s1.31 KB/s1.84 KB lo: 0.00 KB/s0.00 KB/s0.00 KB------------------------------------------------------------------------------------------------------------- total: 0.53 KB/s1.31 KB/s1.84 KB/s

如果控制台足够大,bwm-ng还能使用curses2输出模式,为流量绘制条形图。

$ bwm-ng -o curses2

安装bwm-ng:在CentOS上,可以从Epel来安装bwm-ng。

# ubuntu或debian $ sudo apt-get install bwm-ng # fedora或centos(来自epel) $ sudo apt-get install bwm-ng

10. cbm:Color Bandwidth Meter

这是一款小巧简单的带宽监控工具,可以显示通过诸网络接口的流量大小。没有进一步的选项,仅仅实时显示和更新流量的统计信息。

$ sudo apt-get install cbm

11. speedometer

这是另一款小巧而简单的工具,仅仅绘制外观漂亮的图形,显示通过某个接口传输的入站流量和出站流量。

$ speedometer -r eth0 -t eth0

安装speedometer

# ubuntu或debian用户 $ sudo apt-get install speedometer

12. pktstat

pktstat可以实时显示所有活动连接,并显示哪些数据通过这些活动连接传输的速度。它还可以显示连接类型,比如TCP连接或UDP连接;如果涉及HTTP连接,还会显示关于HTTP请求的详细信息。

$ sudo pktstat -i eth0 -nt $ sudo apt-get install pktstat

13. netwatch

netwatch是netdiag工具库的一部分,它也可以显示本地主机与其他远程主机之间的连接,并显示哪些数据在每个连接上所传输的速度。

$ sudo netwatch -e eth0 -nt $ sudo apt-get install netdiag

14. trafshow

与netwatch和pktstat一样,trafshow也可以报告当前活动连接、它们使用的协议以及每条连接上的数据传输速度。它能使用pcap类型过滤器,对连接进行过滤。

只监控TCP连接

$ sudo trafshow -i eth0 tcp $ sudo apt-get install netdiag

15. netload

netload命令只显示关于当前流量负载的一份简短报告,并显示自程序启动以来所传输的总字节量。没有更多的功能特性。它是netdiag的一部分。

$ netload eth0 $ sudo apt-get install netdiag

16. ifstat

ifstat能够以批处理式模式显示网络带宽。输出采用的一种格式便于用户使用其他程序或实用工具来记入日志和分析。

$ ifstat -t -i eth0 0.5 Time eth0 HH:MM:SS KB/s in KB/s out 09:59:21   2.62 2.80 09:59:22   2.10 1.78 09:59:22   2.67 1.84 09:59:23  2.06 1.98 09:59:23  1.73 1.79

安装ifstat:Ubuntu、Debian和Fedora用户在默认软件库里面就有它。CentOS用户则需要从Repoforge获得它,因为Epel里面没有它。

# ubuntu, debian $ sudo apt-get install ifstat # fedora, centos(Repoforge) $ sudo yum install ifstat

17. dstat

dstat是一款用途广泛的工具(用python语言编写),它可以监控系统的不同统计信息,并使用批处理模式来报告,或者将相关数据记入到CSV或类似的文件。这个例子显示了如何使用dstat来报告网络带宽。

安装dstat

$ dstat -nt -net/total- ----system---- recv send| time 0 0 |23-03 10:27:13 1738B 1810B|23-03 10:27:14 2937B 2610B|23-03 10:27:15 2319B 2232B|23-03 10:27:16 2738B 2508B|23-03 10:27:17

18. collectl

collectl以一种类似dstat的格式报告系统的统计信息;与dstat一样,它也收集关于系统不同资源(如处理器、内存和网络等)的统计信息。这里给出的一个简单例子显示了如何使用collectl来报告网络使用/带宽。

$ collectl -sn -oT -i0.5 waiting for 0.5 second sample... # <----------Network---------->#Time KBIn PktIn KBOut PktOut 10:32:01 40 58 43 66 10:32:01 27 58 3 32 10:32:02 3 28 9 44 10:32:02 5 42 96 96 10:32:03 5 48 3 28

安装collectl

# Ubuntu/Debian用户 $ sudo apt-get install collectl #Fedora $ sudo yum install collectl

1 内核 (1) 内核的d性 Linux的内核表现出了高度的可配置性和独立性,主要是完成:IO驱动设 备管理,TCP/IP,以及任务调度.Linux的标准内核发布版本有40~50MB,而我 现在在一些评估板上试验的嵌入式Linux系统(使用Arm或M68K系列的CPU) 只用到了2MB,同样实现了网络功能和完整的任务调度,这使得Linux可以适 用于从高端服务器到嵌入式应用的各个等级的计算平台上,与之相比,windows 没有明确的内核概念.windows只适合台式机,NT从未真正的打入高端服务器,WinCE也遇到了一些结构性的困难. (2) 内核的任务管理 衡量一个内核的重要指标是多任务环境下的安全性和任务调度的效率. Linux在这方面继承了Unix的优点.而win9.x(包括winme)从来就没有实现过安全的多任务环境,NT/2K 勉强做到了安全性,但是效率还是不敢恭维,我曾今将一个多串口并发驱动的应用程序改写成多线程的方式,原本希望提高处理速度,实际上速度降低了2到3倍.这也就不难理解为什么同样的企业级应用在低硬件的机器上跑得比高硬件配置的NT/2k快. 2 系统的可增值性与历史兼容性 一个设计优良的 *** 作系统应该有一个精简和一致的构造,在添加新的功能时不必破坏原有的结构,而且在后继发展中能够保持前后一致性.Unix由于当初设计时的科学性,以致于20多年的时间内,没有在设计思想上做过大的变动.虽然Unix有很多的版本,但是通过Posix标准,这些系统在源代码上保持高度的兼容. 与之相比,windows的几乎每个 *** 作系统的框架设计都显得十分的随意,几乎不考虑硬件有了新的发展后,会出现什么问题.windown16位和32位两个时期的 *** 作系统出现明显的"代沟",作为一个好的os,这种硬件上的差异是应该由其本身来考虑的,而不是把问题交给二次开发者,比如定义一堆PSZ,LPSZ的指针,将来64位时代, 大概要出现LLPSZ了:) 3 GUI 图形用户界面 Linux的GUI建立在X-WINDOWS的基础,这是与windows的GUI完全不同的一种架构windows的GUI是通过应用程序直接调用winows底层的GUI函数.或者说这是一种垂直的关系.而Linux的GUI是应用程序通过socket向X-WINDOW server发送请求实现的,只有X server在真正的写屏幕.或者说这是一种平行的关系.后者的方式带来更高的系统稳定性,因为图形显示系统崩溃,对于Linux来说,只不过是死掉一个进程而已,而对windows来说会导致整个系统的崩溃.当然X-window的开销要比windows的方式大,但是由于硬件的发展X-window在稳定性上的优点会将会弥补速度上微不足道的差异. 4 应用开发环境 Linux上的开发工具没有windows的容易入门,并不代表Linux上的开发环境比windows 差,其实linux编程入门慢,但是一旦熟悉了,以后就很少需要补充新的概念,与之相比,微软用一些很“简便”的编程概念吸引你,然后很快的淘汰这些概念,强迫你学习新的概念,你发现很多时间花费在气喘嘘嘘的跟着微软后面跑.你在这方面花费的时间远远超过你去学习linux编程的时间. 另一方面,Linux上IDE的开发工具也在成长,最终会吸引更多的应用开发工程师 5 技术上的发展潜力 windows现在的技术架构基本上走进了一个死胡同,很难有大的创新.除非提出一个完全不同的系统,然后在里面做个win32子系统,以兼容现有的程序.就像在nt上搞win16子系统一样:),并且体积再扩大一倍. 对于linux来说,一个很好的架构放在哪里,现在主要是填充内容,丰富应用.在可以预见的时间内,windows无法在架构上超过Linux. 6 多种平台互连的影响 如果linux在嵌入式应用中取得了成功,那么将来就会对台式机市场形成外围的压力.随着PC机的控制与网络能力逐步融合到家电和传统设备中去,这一天一定会出现的.微软以下压上的策略(用win9x的市场优势推win nt)会在Linux上重演

1. PC-Lint 是什么?

如果你真的不知道它是什么? 那么请私下询问 Google, 但千万不要声张:-).

简单而言, PC-Lint 是 Gimpel Software 公司出品的一个很牛<注1>的软件, 你可以叫它吹毛求疵器, 因为它能够做比编译器严格得多的(包括但不限于)语法检查.

事实上这个工具有两个版本: 一个叫 PC-Lint, 是针对 PC 机的 (主要是对付 Windows, MS-DOS, OS/2 等系统), 以可执行文件形式发布另一个叫 FlexeLint, 是针对其它系统的 (比如 Linux), 采用源码方式发布.

由于很少见到 FlexeLint, 本文仅就 PC-Lint 的使用进行介绍. 目前在官方网上出现的最新版本是 9.0, 但同样不易获得, 所以本文只介绍 PC-Lint8.0. 我们将采用变通的方法实现对 Linux 系统下的代码检查.

2. 使用环境

正如前面所说, PC-Lint 本来只当游弋于 Windows, OS/2 之上, 但由于 C 的标准化做得比较好, 所以稍作变通, PC-Lint 是完全有能力对付那些针对 Linux 系统的代码的.

除了 *** 作系统环境, 要想使用得顺手, 还应该把 PC-Lint 和编译/编辑环境结合起来. 现在 PC-Lint 已经能很好地和大部分主流编译/编辑器整合, 使用起来非常方便.

下文将就这两个方面进行讨论.

2.1. 配合 Linux 的使用

在 Linux 系统下, 通常使用 GCC 作为 C 代码的编译器. 为了使 PC-Lint 能有效地检查针对 Linux 的代码, 应该为它选定正确的头 (.h) 文件. 通常这些文件都放在 /usr/include 和 /usr/<x.y.z>/include 目录下.

由于 PC-Lint 不能在 Linux 系统上运行, 所以要把上面两个目录映射 (作磁盘映射) 到 Windows 系统, 这样目录就变成了 Z<注3>:/usr/include 和 Z:/usr/<x.y.z>/include. 也可以把 Linux 的头文件直接 COPY 到 Windows 系统中, 这时系统会提示文件重名, 但这些文件一般用不到, 直接覆盖就行.

(我是直接拷贝到windows下c:/pclint/usr下,不过没有拷贝/usr/<x.y.z>/include)

为了让 PC-Lint 能认出这两个目录, 要在 std.lnt 文件中增加

-iZ:/usr/include

-iZ:/usr/3.4.3/include

两行.

另外由于 PC-Lint 是针对 Windows 设计的, 会抱怨 Linux 某些头文件不正确. 由于我们不提倡自己修改标准文件, 因此干脆让 PC-Lint 暂时失声好了. 这可以通过在 options.lnt 文件增加下面几行实现:

-e716 // allow use while (1)

// bug in syslog.h, it define __need_va_list_ macro

-efile(537,stdarg.h)

-emacro(530,va_start) // do not init first parameter

修改 options.lnt 文件, 使用 gnu 检查规则, 即应该有如下一行:

c:/pclint/lnt/co-gnu3.lnt

假设 PC-Lint 安装在 C:/pclint 目录下.

配置好这些, 在 Windows 上检查 Linux 代码就应该比较顺手了.

2.2. 配合 SourceInsight 的使用

在 SourceInsight 中可以新建一个命令. 通过 Custom Commands 窗口, 在其中的 Command 中填入命令名 (比如是 lint), 再在 Run 中 填入

C:/pclint/LINT-NT.EXE -u -ic:/pclint/lnt std.lnt env-si %f

再在 Pattern 框里填写

^/(.*/.[a-zA-Z]+/)/w/([0-9]+/).*

然后点击 Add 按钮即可.

此后要对 C 文件进行检查时, 直接执行该命令即可.

3. 配置

上面的配置都是一成不变的, 配置好之后, 基本上都不需要改动了. 但对于不同的项目, 还有一些针对项目本身的特殊配置. 在这一小节, 将对针对特定项目的配置进行说明.

首先, 每个项目都有各自的头文件, 因此需要在 std.lnt 指定项目的头文件目录. 格式如下:

-i<头文件目录>

例如:

-iZ:/sw-new/src/license

另外, 如果项目有些目录是第三方提供的, 或者我们不关注其中的警告, 则可以把这些目录指定为库目录. 格式如下:

+libdir(<库目录1>,<库目录2>,...)

例如:

+libdir(z:/usr/include,z:/usr/3.4.3/include,z:/mysql/include)

对于以前没检查过的项目, 第一次使用 PC-Lint 检查时, 可能会出现很多警告和错误. 为了不至于使有用的错误掩埋于警告之中, 可以在 options.lnt 中配置全局的检查等级, 使其只显示严重的错误. 方法为:

-w<等级数>

其中等级数越大, 输入的警告错误就越多. 建议逐渐加大此数, 分步消除错误和警告. 比如先从

-w1

开始.

还可以使用

-e<错误号>

暂时屏蔽对某个错误的检查.

4. 避免无病呻吟

也会有这样的情况: 对某些代码, 你确认----想想你的论据是否充分, 别急于下此结论哦:-)----没有问题, 但 PC-Lint 却在每次检查时都抱怨, 这时可以通过在代码作特殊注释让 PC-Lint 跳过某些检查.

PC-Lint 提供了大量的特殊注释, 可以把这些注释加到代码中, 对代码的每个段落、每一行甚至每个表达式进

行精细的检查控制.

下面列举出一些常用的选项, 更多选项可参数 PC-Lint 的使用手册. 注意这些选项都要放到 C 代码的注释中, 且格式为 /*lint <xxxx>*/, 其中 lint 必须紧接在 /* 后面出现, <xxxx>表示选项, 选项后留一个空格, 然后才是 */.

1). -e(#[,#]...) 仅对下一个表达式有效,

a = /*lint -e(413) */ *(char *)0

a = /*lint -save -e413 */ *(char *)0

/*lint -restore */

是等价的.

2). --e(#[,#]...) 对其所在的整个表达式有效,

a = /*lint --e(413) */ *(int *)0 + *(char *)0

将阻止两个 413 信息的输出, 而使用 -e(413) 则只阻止第一个 413 输出.

3). -e{#[,#]...} 对下一个语句或者声明有效. 这种用法的影响范围很灵活: 当其在函数之前时, 对整个函数有效在某个赋值语句前, 对该个赋值语句有效在 if 或 while 等语句前对这整个语句段有效.

4). --e{#[,#]...} 对于其所处的 {} 号内的整个代码体有效, 这包括函数体, 类, 结构等等. 如果不处于任何 {} 号内, 则对整个文件有效 (当然, 是指从 --e{} 出现的地方至文件结束).

5). !e# 仅对其所在行有效.

6). -esym(#,sym[,sym]) 对指定的符号屏蔽警告.

5. 常见错误处理

下面列举一些常见的错误, 及处理方法, 供参考:

525 提示错误缩进, 原因是代码中空格和 TAB 键混合使用了, PC-Lint 认为代码的缩进与代码逻辑不符合. 把代码统一改成使用空格即可<注5>.

715 符号未被引用, 原因是在函数中的某个调用参数或者局部变量没被使用. 对局部变量可以直接去掉, 对于参数则把其放到 if 语句中即可.

740 提示不寻常的类型转换, 通常发生在指针类型转换时, 转换前后指针所指类型空间大小不一致时. 可通过在转换前加

/*lint -e(740) */

的方式屏蔽此警告.

818 函数的指针参数在函数内部没被修改, 提示参数定义为常量指针. 按照提示在指针参数前加上 const 修饰符就可以了. 但是似乎 PC-Lint 在处理这个问题的时候有 BUG, 有时即使加了 const 修饰符还是会继续提示此警告, 此时就应该在对这个函数这个指针参数屏蔽 818 警告, 方法为在函数开始前添加

/*lint -esym(818, pointer) */

在函数结束后添加

/*lint +esym(818, pointer) */

827 不可到达的代码, 原因是在 while (1)/for () 后还有代码, 但这些代码永远无法执行到. 解决方法是在不能执行到的代码行前加上

/*lint -unreachable */

<1>并非因为是在牛年出品, 而是因为它确实本来就很牛.

<2>这里是指当前使用的 GCC 版本, 比如 3.4.3.

<3>假设映射到 Z 盘.

<4>原因是 Linux 文件名区分大小写, 而 Windows 不区分.

<5>这种工作可以由 indent 代劳, 相信它, 它能做得很好.


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8496808.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-17
下一篇2023-04-17

发表评论

登录后才能评论

评论列表(0条)

    保存