Jade Dungeon

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,或者 比较大,只要siso的值长期为0,这种情况下一般不用担心,不会影响系统性能。
  • free:表示当前空闲的物理内存数量(以k为单位)
  • buff:表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。
  • cache:列表示page cached的内存数量,一般作为文件系统cached,频繁访问的文件 都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中bi比较小, 说明文件系统效率比较好。

swap:

  • si:列表示由磁盘调入内存,也就是内存进入内存交换区的数量。
  • so:列表示由内存调入磁盘,也就是内存交换区进入内存的数量。

一般情况下,siso的值都为0,如果siso的值长期不为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/sBlk_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