一、tcpdump
常用用法:
这里用sudo因为当前帐号无权使用tcpdump,这里仅以一个tcp的例子来说明:sudo /usr/sbin/tcpdump tcp port 80 and host 172.23.1.69 -ieth1 -n
每一行中间都有这个包所携带的标志:
S=SYN,发起连接标志
P=PUSH,传送数据标志
F=FIN,关闭连接标志
ack 表示确认包
RST=RESET,异常关闭连接
. 表示没有任何标志
常用参数:
Tcp/udp/arp等:指定协议类型。
(src/dst)Host:指定源端或者目的端ip。
(src/dst)port:指定源端或者目的端
-i:指定网卡。
-n:显示ip,而不是主机名。
-c:指定抓多少个包后退出。
-A:以ASCII方式显示包内容,这个选项对文本格式的协议包非常有用。
-s:指定抓包显示一行的宽度,-s0表示显示完整的包,经常和-A一起用。
-x/-xx/-X/-XX:以十六进制显示包内容,几个选项只有细微的差别,详见man手册。
上图示例的过程详解:
第一行:17:40:10这个时间,从172.17.66.27(client)的临时端口49376向172.23.1.66(server)的9500监听端口发起连接,client初始包序号为1350828479,滑动窗口大小为5840字节(滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制),mss大小为1460(即可接收的最大包长度,通常为MTU减40字节,IP头和TCP头各20字节)。
第二行:server响应连接,同时带上第一个包的ack信息,为client端的初始包序号加1,1350828480,即server端下次等待接受这个包序号的包,用于tcp字节流的顺序控制。Server端的初始包序号为258050143,mss也是1460。
第三行:client再次确认,三次握手完成。
第四行:client发请求包,包长度91字节。
第五行:server响应ack。
第六行:server回包,包长度21字节。
第七行:client响应ack。
第八行:client发起关闭连接请求。
第九行:server响应ack,并且也发送FIN标志关闭。
第十行:客户端响应ack,关闭连接的四次握手完成。
通过这个来理解tcp协议也挺好的,连接关闭过程,字节流顺序控制,拥塞控制,tcp状态转换等。不过这里就不详述了。
二、vmstat
vmstat是一个很全面的性能分析工具,可以观察到系统的进程 状态、内存使用、虚拟内存使用、磁盘的 IO、中断、上下问切 换、CPU使用等。系统性能分析工具中,我使用最多的是这个,
除了 sysstat 工具包外,这个工具能查看的系统资源最多。
对于 Linux 的性能分析,100%理解 vmstat 输出内容的含义, 那你对系统性能分析的能力就算是基本掌握了。
我这里主要说明一下这个命令显示出的部分数据代表的含义,和 它反映出系统相关资源的状况。输出内容共有 6 类,分别说明如下。
• Vmstat的输出格式如下(CentOS 3.3)
• Procs
– r:
运行的和等待(CPU时间片)运行的进程数, 这个值也可以判断是否需要增加CPU(长期 大于1)
– b:
处于不可中断状态的进程数,常见的情况 是由IO引起的
• Memory
– swpd: 切换到交换内存上的内存(默认以KB为单位)
• 如果 swpd 的值不为0,或者还比较大,比如超过100M了,但
是 si, so 的值长期为 0,这种情况我们可以不用担心,不会影响
系统性能。
– free: 空闲的物理内存
– buff: 作为buffer cache的内存,对块设备的读写进行缓冲
– cache: 作为page cache的内存, 文件系统的cache
• 如果 cache 的值大的时候,说明cache住的文件数多,如果频 繁访问到的文件都能被cache住,那么磁盘的读IO bi 会非常小。
• Swap
– si: 交换内存使用,由磁盘调入内存
– so: 交换内存使用,由内存调入磁盘
内存够用的时候,这2个值都是0,如果这2个值长期 大于0时,系统性能会受到影响。磁盘IO和CPU资 源都会被消耗。
我发现有些朋友看到空闲内存(free)很少或接近于0 时,就认为内存不够用了,实际上不能光看这一点 的,还要结合si,so,如果free很少,但是si,so也很 少(大多时候是0),那么不用担心,系统性能这时 不会受到影响的。
• Io
– bi: 从块设备读入的数据总量(读磁盘) (KB/s),
– bo: 写入到块设备的数据总理(写磁盘)
(KB/s)
随机磁盘读写的时候,这2个 值越大(如超 出1M),能看到CPU在IO等待的值也会越大
• System
– in: 每秒产生的中断次数
– cs: 每秒产生的上下文切换次数 上面这2个值越大,会看到由内核消耗的CPU
时间会越多
• Cpu
– us: 用户进程消耗的CPU时间百分比
• us 的值比较高时,说明用户进程消耗的CPU时间多,但是如果 长期超过50% 的使用,那么我们就该考虑优化程序算法或者进 行加速了(比如 PHP/Perl)
– sy: 内核进程消耗的CPU时间百分比
• sy 的值高时,说明系统内核消耗的CPU资源多,这并不是良性 的表现,我们应该检查原因。
– wa: IO等待消耗的CPU时间百分比
• wa 的值高时,说明IO等待比较严重,这可能是由于磁盘大量作 随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)。
– id: CPU处在空闲状态时间百分比
• 情景分析 这个vmstat的输出那些信息值得关注?
– Procs r: 运行的进程比较多,系统很繁忙
– Io bo: 磁盘写的数据量稍大,如果是大文件的写,
10M以内基本不用担心,如果是小文件写2M以内
基本正常
– Cpu us: 持续大于50,服务高峰期可以接受
– Cpu wa: 稍微有些高
– Cpu id:持续小于50,服务高峰期可以接受
三、Top
这个命令可以查看系统中运行的进程的状况,CPU使 用状况,系统负载,内存使用等。它是检查系统进程 运行状况最方便的工具了,它默认显示部分活动的进 程,并且按照进程使用CPU的多少排序。它可以显示 全部CPU的使用状况,也可以显示每个进程都运行在 那个CPU上面。
我习惯使用这个命令查看那些进程或者那类进程占用 CPU和内存资源最多,以此迅速定位存在性能问题的 进程,以及运行异常的进程。
• Top命令的输出1 (CentOS 3.3)
• Top命令的输出2 (CentOS 3.3)
• 用 top 看到的内存的说明(Mem的第2行)
– actv
active 活跃的内存页,正在映射给进程使用
– in_d
inactive_dirty 非活跃的内存页,并且内存数据被 修改,需要写回磁盘
– in_c
inactive_clean 非活跃的内存页,干净的数据,可 以被重新分配使用
• 问题?
in_d 和 in_c 以及 cache, buffer 的内存有何 不同?
我的理解:
actv, in_d, in_c 是 VM 中对内存的管理组织 形式,buffer是块设备读写缓冲,cache是文 件系统缓存
• 用 top 看到的进程所处的几种状态(STAT列)。
– D 不可中断休眠,通常是 IO 操作所处的状态
– R 正在执行的或者处在等待执行的进程队列中
– S 休眠中
– T 暂停刮起的(比如Ctrl+Z),也可能是被 strace 命令调用中的状
态
– Z 僵尸进程,进程执行完成,但由于其父进程没有销毁该进程,而 被init进程接管进行销毁。
– W 没有使用物理内存,所占用的物理内存被切换到交换内存
– < 高优先级的进程
– N 低优先级
有时候一个进程会有多个状态的标志,比如SWN,SW
• 情景分析 前面两次top的输出那些信息值得关注?
– 图1)
• Load average: 系统负载有降低的趋势,但仍然较高
• Running: 有3个进程正在运行,正常,因为系统有 4颗
CPU
• Cpu user: 接近200%了,有些大,服务高峰时可以接受
• Cpu idle: 小于200%了,需要注意
– 图2)
– Cpu iowait:接近200%了,很大
free命令显示系统内存的使用状况(物理内存和 交换内存)
通过这个命令我们可以看到系统进程实际使用的 物理内存,buffer和cache使用的物理内存
• free命令输出的第二行(Mem)
这行分别显示了物理内存的总量(total)、已使用的 (used)、空闲的(free)、共享的(shared)、buffer(系统分配但未被使用的buffers 数量)、 cache(系统分配但未被使用的cache 数量)的内存。
• free命令输出的第三行(-/+ buffers/cache) 这行最容易让人迷惑。
它显示的第一个值(used这一列)是这样得来的: Mem行used列 - Mem行buffers列 - Mem行cached列。(这个值就是实际使用的内存总量)
它显示的第二个值(free这一列)是这样得来的:Mem行free列 + Mem行buffers列 + Mem行cached列。(这个值就是系统当前实际可用内存)
• free命令输出的第四行(Swap) 这行显示交换内存的总量、已使用量、 空闲量
下面是buffers与cached的区别。
buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.cached是用来给文件做缓冲。那就是说:buffers是用来存储,目录里面有什么内容,权限等等。而cached直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。
实验:在一台没有什么应用的机器上做会看得比较明显。记得实验只能做一次,如果想多做请换一个文件名。
#free
#man X
#free
#man X
#free
你可以先后比较一下free后显示buffers的大小。
另一个实验:
#free
#ls /dev
#free
你比较一下两个的大小,当然这个buffers随时都在增加,但你有ls过的话,增加的速度会变得快,这个就是buffers/chached的区别。
因为Linux将你暂时不使用的内存作为文件和数据缓存,以提高系统性能,当你需要这些内存时,系统会自动释放(不像windows那样,即使你有很多空闲内存,他也要访问一下磁盘中的pagefiles)
因此,一个最简单的判断Linux下内存是否足够的办法是,只要基本没用到swap,这台机器的内存就是足够的。
其他:
cpu占用特别是内核态和用户态占用分析其中还包括cou中断次数等
io速度分析,主要实时观察各硬盘读写速度
报告关于内存和交换区使用的广泛信息,其中还包括等待进程数等
sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等
#sar -q -u 5 1
Linux 2.6.16-18smp () 2003年03月07日
09时46分16? CPU %user %nice %system %idle
09时46分21? all 0.20 0.00 0.00 99.80
09时46分16? runq-szplist-sz ldavg-1 ldavg-5
09时46分21? 0 91 0.00 0.00
这些工具都是从 /proc 下相应项读取数据,各位可以自行研究