Linux性能监控与优化
性能指标
影响性能因素 | 评判标准 | ||
---|---|---|---|
好 | 坏 | 糟糕 | |
CPU(user% + sys%) | < 70% | = 85% | >= 90% |
内存(Swap In/Out ) | = 0 | Per CPU with 10 page/s | More |
磁盘(iowait%) | < 20% | = 35% | >= 50% |
-
user%
:表示CPU处在用户模式下的时间百分比。 -
sys%
:表示CPU处在系统模式下的时间百分比。 -
Swap In
:即si,表示虚拟内存的页导入,即从SWAP DISK交换到RAM -
Swap Out
:即so,表示虚拟内存的页导出,即从RAM交换到SWAP DISK。 -
iowait%
:表示CPU等待输入输出完成时间的百分比。
磁盘存储基础:
- 熟悉RAID存储方式,可以根据应用的不同,选择不同的RAID方式。
- 尽可能用内存的读写代替直接磁盘I/O,使频繁访问的文件或数据放入内存中进行操作 处理,因为内存读写操作比直接磁盘读写的效率要高千倍。
- 将经常进行读写的文件与长期不变的文件独立出来,分别放置到不同的磁盘设备上。
- 对于写操作频繁的数据,可以考虑使用裸设备代替文件系统。
使用裸设备的优点有:
- 数据可以直接读写,不需要经过操作系统级的缓存,节省了内存资源,避免了内存资源 争用。
- 避免了文件系统级的维护开销,比如文件系统需要维护超级块、I-node等。
- 避免了操作系统的cache预读功能,减少了I/O请求。
使用裸设备的缺点是:
- 数据管理、空间管理不灵活,需要很专业的人来操作。
常用性能工具组合
- 用vmstat、sar、iostat检测是否是CPU瓶颈
- 用free、vmstat检测是否是内存瓶颈
- 用iostat检测是否是磁盘I/O瓶颈
- 用netstat检测是否是网络带宽瓶颈
vmstat命令监控系统CPU
该命令可以显示关于系统各种资源之间相关性能的简要信息,这里我们主要用它来看CPU 一个负载情况。
下面是vmstat命令在某个系统的输出结果:
[root@node1 ~]# vmstat 2 3 procs ———————–memory———————— —swap– ——–io——— ––system–– —————–cpu——————— r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 162240 8304 67032 0 0 13 21 1007 23 0 1 98 0 0 0 0 0 162240 8304 67032 0 0 1 0 1010 20 0 1 100 0 0 0 0 0 162240 8304 67032 0 0 1 1 1009 18 0 1 99 0 0
Procs:
-
r
:列表示运行和等待cpu时间片的进程数,这个值如果长期大于系统CPU的个数,说明 CPU不足,需要增加CPU。 -
b
:列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
cpu:
-
us
:列显示了用户进程消耗的CPU 时间百分比。us的值比较高时,说明用户进程消耗的 cpu时间多,但是如果长期大于50%,就需要考虑优化程序或算法。 -
sy
:列显示了内核进程消耗的CPU时间百分比。Sy的值较高时,说明内核消耗的CPU资源 很多。根据经验,us+sy的参考值为80%,大于80%说明可能存在CPU资源不足。
memory:
-
swpd
:表示切换到内存交换区的内存数量(以k为单位)。如果swpd
的值不为0,或者 比较大,只要si
、so
的值长期为0,这种情况下一般不用担心,不会影响系统性能。 -
free
:表示当前空闲的物理内存数量(以k为单位) -
buff
:表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。 -
cache
:列表示page cached的内存数量,一般作为文件系统cached,频繁访问的文件 都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中bi比较小, 说明文件系统效率比较好。
swap:
-
si
:列表示由磁盘调入内存,也就是内存进入内存交换区的数量。 -
so
:列表示由内存调入磁盘,也就是内存交换区进入内存的数量。
一般情况下,si
、so
的值都为0
,如果si
、so
的值长期不为0,则表示系统内存
不足。需要增加系统内存。
sar命令监控系统
sar功能很强大,可以对系统的每个方面进行单独的统计, 但是使用sar命令会增加系统开销,不过这些开销是可以评估的, 对系统的统计结果不会有很大影响。
sar评估CPU性能
下面是sar命令对某个系统的CPU统计输出:
[root@webserver ~]# sar -u 3 5 Linux 2.6.9-42.ELsmp (webserver) 11/28/2008 _i686_ (8 CPU) 11:41:24 AM CPU %user %nice %system %iowait %steal %idle 11:41:27 AM all 0.88 0.00 0.29 0.00 0.00 98.83 11:41:30 AM all 0.13 0.00 0.17 0.21 0.00 99.50 11:41:33 AM all 0.04 0.00 0.04 0.00 0.00 99.92 11:41:36 AM all 90.08 0.00 0.13 0.16 0.00 9.63 11:41:39 AM all 0.38 0.00 0.17 0.04 0.00 99.41 Average: all 0.34 0.00 0.16 0.05 0.00 99.45
每项的输出解释如下:
-
%user
:用户进程消耗的CPU 时间百分比。 -
%nice
:运行正常进程所消耗的CPU 时间百分比。 -
%system
:系统进程消耗的CPU时间百分比。 -
%iowait
:IO等待所占用的CPU时间百分比 -
%steal
:内存相对紧张的环境下pagein强制对不同的页面进行的steal操作 。 -
%idle
:CPU处在空闲状态的时间百分比。
问题: 你是否遇到过系统CPU整体利用率不高,而应用缓慢的现象?
在一个多CPU的系统中,如果程序使用了单线程,会出现这么一个现象,CPU的整体使用率 不高,但是系统应用却响应缓慢,这可能是由于程序使用单线程的原因,单线程只使用一个 CPU,导致这个CPU占用率为100%,无法处理其它请求,而其它的CPU却闲置,这就导致了 整体CPU使用率不高,而应用缓慢现象的发生。
sar评估磁盘性能
通过sar –d
组合,可以对系统的磁盘IO做一个基本的统计,请看下面的一个输出:
[root@webserver ~]# sar -d 2 3 Linux 2.6.9-42.ELsmp (webserver) 11/30/2008 _i686_ (8 CPU) 11:09:33 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 11:09:35 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 11:09:35 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 11:09:37 PM dev8-0 1.00 0.00 12.00 12.00 0.00 0.00 0.00 0.00 11:09:37 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 11:09:39 PM dev8-0 1.99 0.00 47.76 24.00 0.00 0.50 0.25 0.05 Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util Average: dev8-0 1.00 0.00 19.97 20.00 0.00 0.33 0.17 0.02
需要关注的几个参数含义:
-
await
:平均每次设备I/O操作的等待时间(以毫秒为单位)。 -
svctm
:平均每次设备I/O操作的服务时间(以毫秒为单位)。 -
%util
:一秒中有百分之几的时间用于I/O操作。
对以磁盘IO性能,一般有如下评判标准:
正常情况下svctm
应该是小于await
值的,而svctm
的大小和磁盘性能有关,CPU、内存
的负荷也会对svctm
值造成影响,过多的请求也会间接的导致svctm
值的增加。
await
值的大小一般取决与svctm
的值和I/O队列长度以及I/O请求模式,如果svctm
的
值与await
很接近,表示几乎没有I/O等待,磁盘性能很好,如果await
的值远高于
svctm
的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过
更换更快的硬盘来解决问题。
%util
项的值也是衡量磁盘I/O的一个重要指标,如果%util
接近100%,表示磁盘产生的
I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响
系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。
uptime命令系统整体性能评估
[root@server ~]# uptime 16:38:00 up 118 days, 3:01, 5 users, load average: 1.22, 1.02, 0.91
load average
这个输出值,这三个值的大小一般不能大于系统CPU的个数。
例如,本输出中系统有8个CPU,如果load average的三个值长期大于8时,说明CPU很繁忙,
负载很高,可能会影响系统性能,但是偶尔大于8时,倒不用担心,一般不会影响系统性能
。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片,比如
本例中的输出,CPU是非常空闲的。
htop – 交互式进程查看器
htop是top的扩展版本,有更丰富的概貌(例如全命令、可视化、图形用户界面gui和用户 界面ui),有鼠标点击交互(译者注:看下面的截图,指的是最上面的列标题如CPU%、 MEM%等可以通过鼠标点击切换以显示不同的功能),也有许多的指导教你如何做进程管理。
iotop – 简单的类似top的I/O监控器
iotop是IO实时监控器。使用它们附属的详细输入输出(IO)使用方法可以展示出你系统中 每个进程线程的信息。
该命令可以与tcpdump(响应网络流量的命令)一起使用。如果你发现你的web服务器上有 程序在运行,你可以,比如运行tcpdump port 80检查端口80(标准的http端口)的网络 流量来观察细节。
最有用的信息可能是DISK WRITE这一列,从该列你可以准确的看到每个IO使用了多少个进程 ,单位为K/s。
apachetop – 展示web服务器实时统计数据
Apachetop展示Apache web服务器上关于http请求的实时表。
它显示统计(stats), 点击(hits), 请求(requests), 请求细节(request details) ,且能够获得当前你的web服务器正在运行程序的概貌,这一点很赞。
如果你使用的是Nginx,也有一些相似的工具,但似乎没有apachetop那么详细。
Glances – 基于CLI curses库的监控工具
Glances用各个分离的表列展示了你机器当前正运行的各种有用的实时数据。Glances旨在 用最小的空间显示尽可能多的信息,我认为它的目标完全达到了。
Glances用有限的交互可能性和更深层的信息监控PerCPU, Load, Memory, Swap, Network, Disk i/O, Mount data 和processes,但对于获得一个整体概貌绝对是完美的。
利用free指令监控内存
free是监控linux内存使用状况最常用的指令,看下面的一个输出:
[root@webserver ~]# free -m total used free shared buffers cached Mem: 8111 7185 926 0 243 6299 -/+ buffers/cache: 643 7468 Swap: 8189 0 8189
一般看「程序可用内存 / 系统物理内存」的比值:
-
> 70%
:非常充足,不影响系统性能 -
< 20%
:紧缺,需要增加系统内存, -
20% < 值 < 70%
:基本能满足应用需求,暂时不影响系统性能。
查看内存占用:free
跟踪内存的使用和资源一样重要,就像管理员执行的任何其它任务,可以使用free
命令
来在这里救援.当前内存使用状态(Current Usage Status of Memory):
[avishek@tecmint ~]$ free total used free shared buffers cached Mem: 2028240 1788272 239968 0 69468 363716 -/+ buffers/cache: 1355088 673152 Swap: 3905532 157076 3748456
设置输出单位为KB,MB或GB
[avishek@tecmint ~]$ free -b total used free shared buffers cached Mem: 2076917760 1838272512 238645248 0 71348224 372670464 -/+ buffers/cache: 1394253824 682663936 Swap: 3999264768 160845824 3838418944
[avishek@tecmint ~]$ free -k total used free shared buffers cached Mem: 2028240 1801484 226756 0 69948 363704 -/+ buffers/cache: 1367832 660408 Swap: 3905532 157076 3748456
[avishek@tecmint ~]$ free -m total used free shared buffers cached Mem: 1980 1762 218 0 68 355 -/+ buffers/cache: 1338 641 Swap: 3813 153 3660
[avishek@tecmint ~]$ free -g total used free shared buffers cached Mem: 1 1 0 0 0 0 -/+ buffers/cache: 1 0 Swap: 3 0 3
以可读的格式显示,检查当前内存使用
[avishek@tecmint ~]$ free -h total used free shared buffers cached Mem: 1.9G 1.7G 208M 0B 68M 355M -/+ buffers/cache: 1.3G 632M Swap: 3.7G 153M 3.6G
设定时间间隔后,持续检查使用状态
[avishek@tecmint ~]$ free -s 3 total used free shared buffers cached Mem: 2028240 1824096 204144 0 70708 364180 -/+ buffers/cache: 1389208 639032 Swap: 3905532 157076 3748456 total used free shared buffers cached Mem: 2028240 1824192 204048 0 70716 364212 -/+ buffers/cache: 1389264 638976 Swap: 3905532 157076 3748456
查看linux page cache里的内容
# free -mt total used free shared buffers cached Mem: 7168 7055 112 0 265 5772 -/+ buffers/cache: 1017 6150 Swap: 0 0 0 Total: 7168 7055 112
可以看到cache了5G多,那么cache里都装了哪些内容呢?
https://code.google.com/p/linux-ftools/
# ~/linux-ftools/linux-fincore --pages=false --summarize --only-cached * filename size total_pages min_cached page cached_pages cached_size cached_perc -------- ---- ----------- --------------- ------------ ----------- ----------- php_error.txt 10,290,322,753 2,512,286 462,368 1,337,965 5,480,304,640 53.26
可以看到,绝大部分cache里装的是php_error.txt
内容,我们一直在
tail -F php_error.txt
,因此被放入了cache。
内存不足:杀死进程还是牺牲子进程
监控系统已经察觉到进程死掉了,并且已经重启了崩溃的服务。在应用崩溃之前看起来 一切运行正常。日志中没有错误,没有告警,也没有其他任何异常。
在/var/log/kern.log
文件中发现了以下内容:
Jun 4 07:41:59 plumbr kernel: [70667120.897649] Out of memory: Kill process 29957 (java) score 366 or sacrifice child Jun 4 07:41:59 plumbr kernel: [70667120.897701] Killed process 29957 (java) total-vm:2532680kB, anon-rss:1416508kB, file-rss:0kB
内存杀手机制
Linux建立在一些守护进程之上。这些守护进程被几个看起来糟透了的内核任务看管。 所有现代Linux内核都内置了一个被称为「内存不足杀手」的机制,它在内存不足的情况下会 杀掉用户进程。当检测到内存不足时,杀手会被激活并选择一个进程杀死。选择机制是 用启发式算法对所有进程进行打分,最后选择得分最低的进程杀死。理解「内存不足杀手」
默认情况下,Linux内核允许进程请求比当前系统可用内存更多的内存。这种机制的一个 副作用是,一些程序会消耗系统内存。这将导致内存不足,使得没有内存页面可以分配给 进程。你可能遇到过这种情况,只有root账号才能杀掉offending任务。为了避免这种 情况发生,杀手进程会被启动,识别进程并杀死它。
更多关于「内存不足杀手」的内容请参见这篇RedHad的文档。
内存不足杀手触发原因
现在,我们知道了一些背景知识,但是内存不足杀手由谁触发?一些调查显示:
-
/proc/sys/vm/overcommit_memory
中的配置允许过量使用内存,它被设置为1
, 意味着每一次malloc都能够成功申请到内存。 - 应用运行在一个EC2 m1.small实例上。EC2实例默认是不支持交换区的。
这两点再加上突然增加的访问导致了我们的应用会申请越来越多的内存以支持这些用户。 过量使用内存配置也允许为这些进程申请越来越多的内存,最后触发了「内存不足杀手」,
示例
用一个小测试程序来复现这个问题。当在Linux(最新稳定版Ubuntu)上编译和加载下面的 Java代码片段时,
package eu.plumbr.demo; public class OOM { public static void main(String[] args){ java.util.List l = new java.util.ArrayList(); for (int i = 10000; i < 100000; i++) { try { l.add(new int[100_000_000]); } catch (Throwable t) { t.printStackTrace(); } } } }
你会发现类似下面的消息:Kill process (java) score 或牺牲子进程的消息。
注意:你可能需要修改交换区和堆大小。在我的测试程序中,将堆大小通过-Xmx2g
设置成2G,通过如下配置设置交换区大小:
swapoff -a dd if=/dev/zero of=swapfile bs=1024 count=655360 mkswap swapfile swapon swapfile
解决方案?
有很多种方法可以解决这个问题。在我们的示例中,我们只是把系统迁移到一个有更大 内存的实例中。并且我建议允许交换,但是Java虚拟机中的垃圾回收进程在交换时表现 不是很好,所以这个选项最后没有被采用。
其他可能有用的方案包括微调内存不足杀手,在几个实例间进行负载均衡或者降低应用的 内存需求。
iostat评估磁盘性能
[root@webserver ~]# iostat -d 2 3 Linux 2.6.9-42.ELsmp (webserver) 12/01/2008 _i686_ (8 CPU) Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 1.87 2.58 114.12 6479462 286537372 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.00 0.00 0.00 0 0 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 1.00 0.00 12.00 0 24
对上面每项的输出解释如下:
-
Blk_read/s
:每秒读取的数据块数。 -
Blk_wrtn/s
:每秒写入的数据块数。 -
Blk_read
:读取的所有块数。 -
Blk_wrtn
:写入的所有块数。
可以通过Blk_read/s
和Blk_wrtn/s
的值对磁盘的读写性能有一个基本的了解:
-
Blk_wrtn/s
大表示磁盘的写操作很频繁,可以考虑优化磁盘或者优化程序 -
Blk_read/s
大表示磁盘直接读取操作很多,可以将读取的数据放入内存中进行操作
对于这两个选项的值没有一个固定的大小,根据系统应用的不同,会有不同的值,但是 有一个规则还是可以遵循的:长期的、超大的数据读写,肯定是不正常的,这种情况一定会 影响系统性能。
lsof
它还有一个图形版的前端 FileMonitor
FileMonitor 使用 Linux 下的 lsof 命令实时的监控文件的打开和关闭操作,并返回一个列表。
使用 lsof 命令行列出所有打开的文件
# lsof
这可是一个很长的列表,包括打开的文件和网络,包含很多列,例如 PID、user、FD 和 TYPE 等等。
FD - File descriptor
FD 列包含这样一些值
cwd - Current working directory txt - Text file mem - Memory Mapped file mmap - Memory Mapped device Number - It represent the actual file descriptor. For example, 0u, 1w and 3r
r
是读的意思,w
是写,u
代表读写。
Type 代表文件类型,例如:
>REG - Regular file >DIR - Directory >CHR - Character special file >FIFO - First in first out
列出某个用户打开的文件
# lsof -u user_name
Example:
# lsof -u crybit COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 29609 crybit cwd DIR 144,233 4096 117711421 / sshd 29609 crybit rtd DIR 144,233 4096 117711421 / sshd 29609 crybit txt REG 144,233 409488 119020186 /usr/sbin/sshd sshd 29609 crybit mem REG 144,241 2443001619 (deleted)/dev/zero (stat: No such file or directory) sshd 29609 crybit mem REG 8,37 119021850 /lib64/libnss_dns-2.5.so (path dev=144,233) sshd 29609 crybit mem REG 8,37 119021984 /lib64/security/pam_succeed_if.so (path dev=144,233) sshd 29609 crybit mem REG 8,37 119022000 /lib64/security/pam_limits.so (path dev=144,233) sshd 29609 crybit mem REG 8,37 119021960 /lib64/security/pam_keyinit.so (path dev=144,233) sshd 29609 crybit mem REG 8,37 119021972 /lib64/security/pam_cracklib.so (path dev=144,233) sshd 29609 crybit mem REG 8,37 119021987 /lib64/security/pam_nologin.so (path dev=144,233) sshd 29609 crybit mem REG 8,37 119021988 /lib64/security/pam_deny.so (path dev=144,233) sshd 29609 crybit mem REG 8,37 119019223 /usr/lib64/libcrack.so.2.8.0 (path dev=144,233) ..... .....
列出在某个端口运行的进程
# lsof -i :port_number
Example:
# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 769 root 3u IPv6 2281738844 0t0 TCP *:ssh (LISTEN) sshd 769 root 4u IPv4 2281738846 0t0 TCP *:ssh (LISTEN) # lsof -i :3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 11106 mysql 10u IPv4 2340975114 0t0 TCP *:mysql (LISTEN)
只列出使用 IPv4 的打开文件
# lsof -i 4 - For IPv4
Example:
# lsof -i 4 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 769 root 4u IPv4 2281738846 0t0 TCP *:ssh (LISTEN) named 8362 named 20u IPv4 2334751017 0t0 TCP localhost.localdomain:domain (LISTEN) named 8362 named 21u IPv4 2334751019 0t0 TCP crybit.com:domain (LISTEN) named 8362 named 22u IPv4 2334751021 0t0 TCP localhost.localdomain:rndc (LISTEN) named 8362 named 512u IPv4 2334751016 0t0 UDP localhost.localdomain:domain named 8362 named 513u IPv4 2334751018 0t0 UDP crybit.com:domain tcpserver 9975 root 3u IPv4 2335487959 0t0 TCP *:pop3 (LISTEN) tcpserver 9978 root 3u IPv4 2335487967 0t0 TCP *:pop3s (LISTEN) tcpserver 9983 root 3u IPv4 2335487997 0t0 TCP *:imap (LISTEN) tcpserver 9987 root 3u IPv4 2335488014 0t0 TCP *:imaps (LISTEN) xinetd 10413 root 5u IPv4 2336070983 0t0 TCP *:ftp (LISTEN) xinetd 10413 root 6u IPv4 2336070984 0t0 TCP *:smtp (LISTEN) mysqld 11106 mysql 10u IPv4 2340975114 0t0 TCP *:mysql (LISTEN) # lsof -i 6 Example: # lsof -i 6 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 769 root 3u IPv6 2281738844 0t0 TCP *:ssh (LISTEN) named 8362 named 23u IPv6 2334751024 0t0 TCP localhost.localdomain:rndc (LISTEN) httpd 29241 root 4u IPv6 2439777206 0t0 TCP *:http (LISTEN) httpd 29241 root 6u IPv6 2439777211 0t0 TCP *:https (LISTEN) httpd 29243 apache 4u IPv6 2439777206 0t0 TCP *:http (LISTEN) httpd 29243 apache 6u IPv6 2439777211 0t0 TCP *:https (LISTEN) httpd 29244 apache 4u IPv6 2439777206 0t0 TCP *:http (LISTEN) httpd 29244 apache 6u IPv6 2439777211 0t0 TCP *:https (LISTEN) httpd 29245 apache 4u IPv6 2439777206 0t0 TCP *:http (LISTEN) httpd 29245 apache 6u IPv6 2439777211 0t0 TCP *:https (LISTEN) httpd 29246 apache 4u IPv6 2439777206 0t0 TCP *:http (LISTEN)
列出端口在 1-1024 之间的所有进程
# lsof -i :1-1024
Example:
# lsof -i :1-1024 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 769 root 3u IPv6 2281738844 0t0 TCP *:ssh (LISTEN) sshd 769 root 4u IPv4 2281738846 0t0 TCP *:ssh (LISTEN) named 8362 named 20u IPv4 2334751017 0t0 TCP localhost.localdomain:domain (LISTEN) named 8362 named 21u IPv4 2334751019 0t0 TCP crybit.com:domain (LISTEN) named 8362 named 22u IPv4 2334751021 0t0 TCP localhost.localdomain:rndc (LISTEN) named 8362 named 23u IPv6 2334751024 0t0 TCP localhost.localdomain:rndc (LISTEN) tcpserver 9975 root 3u IPv4 2335487959 0t0 TCP *:pop3 (LISTEN) tcpserver 9978 root 3u IPv4 2335487967 0t0 TCP *:pop3s (LISTEN) tcpserver 9983 root 3u IPv4 2335487997 0t0 TCP *:imap (LISTEN) tcpserver 9987 root 3u IPv4 2335488014 0t0 TCP *:imaps (LISTEN) xinetd 10413 root 5u IPv4 2336070983 0t0 TCP *:ftp (LISTEN) xinetd 10413 root 6u IPv4 2336070984 0t0 TCP *:smtp (LISTEN) httpd 29241 root 4u IPv6 2439777206 0t0 TCP *:http (LISTEN) httpd 29241 root 6u IPv6 2439777211 0t0 TCP *:https (LISTEN) httpd 29243 apache 4u IPv6 2439777206 0t0 TCP *:http (LISTEN) .... ....
根据进程id来列出打开的文件
# lsof -p PID
Example:
# lsof -p 11106 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 11106 mysql cwd DIR 144,233 4096 119025114 /var/lib/mysql mysqld 11106 mysql rtd DIR 144,233 4096 117711421 / mysqld 11106 mysql txt REG 144,233 9484782 119025094 /usr/libexec/mysqld mysqld 11106 mysql mem REG 8,37 119025094 /usr/libexec/mysqld (path dev=144,233) mysqld 11106 mysql mem REG 8,37 119021850 /lib64/libnss_dns-2.5.so (path dev=144,233) mysqld 11106 mysql mem REG 8,37 119021830 /lib64/libnss_files-2.5.so (path dev=144,233) mysqld 11106 mysql mem REG 8,37 119021841 /lib64/libsepol.so.1 (path dev=144,233) mysqld 11106 mysql mem REG 8,37 119021801 /lib64/libselinux.so.1 (path dev=144,233) mysqld 11106 mysql mem REG 8,37 119021785 /lib64/libresolv-2.5.so (path dev=144,233) mysqld 11106 mysql mem REG 8,37 119021920 /lib64/libkeyutils-1.2.so (path dev=144,233) mysqld 11106 mysql mem REG 8,37 119017006 /usr/lib64/libkrb5support.so.0.1 (path dev=144,233) .... ....
杀掉某个用户的所有活动进程
# killall -9 `lsof -t -u username`
列出某个目录中被打开的文件
# lsof +D path_of_the_directory
Example:
# lsof +D /var/log/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME syslogd 9729 root 1w REG 144,233 0 119019158 /var/log/kernel syslogd 9729 root 2w REG 144,233 350722 119021699 /var/log/messages syslogd 9729 root 3w REG 144,233 591577 119019159 /var/log/secure syslogd 9729 root 4w REG 144,233 591577 119019159 /var/log/secure
根据进程名称列出打开的文件
# lsof -c process_name
Example:
# lsof -c ssh COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 483 root cwd DIR 8,9 4096 2 / sshd 483 root rtd DIR 8,9 4096 2 / sshd 483 root txt REG 8,9 523488 1193409 /usr/sbin/sshd
列出所有网络连接
# lsof -i
该命令列出所有侦听和已建立的网络连接。Example:
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 769 root 3u IPv6 2281738844 0t0 TCP *:ssh (LISTEN) sshd 769 root 4u IPv4 2281738846 0t0 TCP *:ssh (LISTEN) named 8362 named 20u IPv4 2334751017 0t0 TCP localhost.localdomain:domain (LISTEN) named 8362 named 21u IPv4 2334751019 0t0 TCP crybit.com:domain (LISTEN) named 8362 named 22u IPv4 2334751021 0t0 TCP localhost.localdomain:rndc (LISTEN) named 8362 named 23u IPv6 2334751024 0t0 TCP localhost.localdomain:rndc (LISTEN) named 8362 named 512u IPv4 2334751016 0t0 UDP localhost.localdomain:domain
就这些!
磁盘空间满的清理
使用df -alh
命令可看各个磁盘的使用情况和挂载的目录:
若磁盘占用空间超过90%以上,需要清理空间
$ df -alh Filesystem Size Used Avail Use% Mounted on rootfs 116G 51G 65G 44% / none 116G 51G 65G 44% /dev sysfs 0 0 0 - /sys proc 0 0 0 - /proc devpts 0 0 0 - /dev/pts none 116G 51G 65G 44% /run none 116G 51G 65G 44% /run/lock none 116G 51G 65G 44% /run/shm none 116G 51G 65G 44% /run/user binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
如果看到分区爆满的情况有两种可能:
- block满了,block存放的则是数据内容。
- inode满了,inode主要用来存放文件的属性。
查找过大的目录
-
进入根目录:
cd /
-
使用命令 :
du -sh *
查看根目录下每个文件夹的大小
du -h --max-depth=1 |grep [TG] |sort # 查找上G和T的目录并排序 du -sh # 统计当前目录的大小,以直观方式展现 du -h --max-depth=1 |grep 'G' |sort # 查看上G目录并排序 du -sh --max-depth=1 # 查看当前目录下所有一级子目录文件夹大小 du -h --max-depth=1 |sort # 查看当前目录下所有一级子目录文件夹大小并排序 du -h --max-depth=1 |grep [TG] |sort -nr # 倒序排 du -s * | sort -nr | head # 显示前10个占用空间最大的文件或目录 # 显示前12个占用空间大的目录(包括二级目录) sudo du -hm --max-depth=2 | sort -nr | head -12
查找过大的单个文件
查找大文件命令,当目录下的大于1G、100MB、10MB的文件:
find . -type f -size +1024M find . -type f -size +100M find . -type f -size +10M
显示这些大文件的详细情况:
find / -type f -size +100M –exec ls –lh \;
如果确认是垃圾文件或者不重要的文件,已有备份,可以考虑删除
find / -type f -size +100M –exec rm {} \; # 或 find / -type f –size +100M | xargs rm –f
查找inode满了的目录
如果是inode
满了,df –ia
查看分区inode使用情况
$ df -ia Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/VolGroup00-lv_root 4666512 153481 4513031 4% / devtmpfs 1514362 369 1513993 1% /dev tmpfs 1517370 1 1517369 1% /dev/shm tmpfs 1517370 446 1516924 1% /run tmpfs 1517370 16 1517354 1% /sys/fs/cgroup /dev/vda1 128016 337 127679 1% /boot tmpfs 1517370 1 1517369 1% /run/user/1003
当前各大文件夹占用inode情况
for i in /var/*; do echo $i; find $i |wc -l; done
排序
sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
清理没有释放的文件
lsof | grep -i deleted