Skip to content

{ Category Archives } *nix

Libtool library used but `LIBTOOL’ is undefined

Install HandlerSocket 时,报如下错误:

handlersocket/Makefile.am:3: Libtool library used but `LIBTOOL' is undefined

(Solution) Libtool library used but `LIBTOOL’ is undefined这里有提到类似的问题,解决办法很简单,合并文件后,删除多余的,然后创建一符号链接。

This is caused because FreeBSD renames the default tools, like aclocal to aclocal19. When aclocal is run, it looks for files in its FreeBSD set directory,
/usr/local/share/aclocal19 but most normal apps, like libtool, install to /usr/local/share/aclocal. The solution? Simple! Just merge the contents into one
directory, delete the other, and create a symlink!

当然,也可以直接:

cp -R /usr/local/share/aclocal /usr/share/
Tagged ,

vim 正则匹配

:%s/(\d\+,//gc 匹配 (123, , (1,
:%s/test=\(\d\+\)/test=\1/gc \1 匹配第一个 \( \) 的部分 \2 以此类推

Tagged

Linux Commands

FROM: Linux Command

文件命令

  • ls 列出目录下的文件和文件夹
  • ls -al 已列表方式列出目录下的文件和文件夹,包括隐藏文件
  • cd dir 将目录切换到 dir
  • cd ~ 切换到用户目录
  • pwd 打印当前目录
  • mkdir dir 新建 dir 目录
  • rm file 删除 file 文件
  • rm -r dir 删除 dir 目录及其子目录
  • rm -f file 强制删除 file 文件
  • rm -rf dir 强制删除 dir 目录及其子目录
  • rm -rf / 这个就不用说了,该命令敲完再回车下,系统就玩完了
  • cp file1 file2 将 file1 复制到 file2
  • mv file1 file2 将 file1 重命名为file2
  • ln -s file link 为文件 file 在另外一个位置建立一个软链接
  • touch file 创建名为 file 的文件,如果该文件已存在,则更新其文件的时间戳, 之前文件内容并不会丢失。
  • cat > file 创建新文件,并接下来的键盘输入重定向到 file 文件,直到退出该输入。
  • more file 分页显示 file 的内容, 支持 ctrl+B ctrl+F …..上下滚屏,但不支持像shift+G(跳到文件尾)这种操作
  • less file 分页显示 file 的内容,支持各种命令, 随便翻页,跳转,查找…
  • head file 显示文件 file 的前 10 行内容
  • tail file 显示文件 file 的最后1 10 行内容
  • tail -f file 实时显示文件 file 的最后 10 行内容

SSH

  • ssh user@host 连接远程主机
  • ssh -p port user@host 连接远程主机上的 port。 不用这个选项,默认就是22
  • ssh -D port user@host 使用非特定的 port 去对外联机。如果被访问机器的防火墙不淮许从特定的 port 联机,就可以使用这个选项。这个选项会关掉 RhostsAuthenticationRhostsRSAAuthentication

安装软件

  • ./configure
  • make
  • make install

网络

  • ping host 测试本机和目标主机的连通状况
  • whois domain 查找并显示指定域名的用户相关信息
  • dig domain 查找域 domain 的 DNS 服务器
  • dig -x host 查看反向解析
  • wget file 从网络上自动下载 file
  • wget -c file 断点下传 file
  • wget -r url 从 url 递归下载文件

系统信息

  • date 显示当前时间
  • cal 显示当月日历
  • uptime 查询系统当前负载
  • w 用于显示登录到系统的用户情况
  • whoami 显示当前用户名
  • uname -a 显示系统所有信息
  • cat /proc/cpuinfo 查看 CPU 的相关信息
  • cat /proc/meminfo 查看内存的信息
  • man command 显示 command 的手册
  • df 检查文件系统的磁盘空间占用情况
  • du 查询文件或目录的磁盘使用空间
  • du -sh 以易读方式显示当前目录所使用空间, 进制为 1024(忽略子目录)
  • free 显示当前内存及其 swap 的信息
  • whereis app 用于程序名的搜索,而且只搜索二进制文件(参数-b), man说明文件(参数-m)和源代码文件(参数-s)
  • which app 在 $PATH 变量指定的路径中,搜索 app 系统命令的位置,并且返回第一个搜索结果

查找文件

进程管理

  • ps 列出系统中正在运行的进程
  • ps aux   列出所有使用者的进程
  • kill pid 杀死 pid 为 pid 的进程
  • killall proc杀死所有名为 proc 的进程
  • bg 将一个在后台暂停的命令,变成继续执行. 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过 jobs 命令查到的后台正在执行的命令的序号(不是pid)
  • fg 将后台中的命令调至前台继续运行, 如果后台中有多个命令,可以用 fg %jobnumber 将选中的命令调出,%jobnumber 是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
  • fg n 把 job n 调回到前台执行
  • jobs 查看当前有多少在后台运行的命令,若未指定jobsid,则显示所有活动的任务状态信息; 如果报告了一个任务的终止(即任务的状态被标记为Terminated)SHELL 从当前的 SHELL 环境已知的列表中删除任务的进程标识

文件权限

chmod octal file – 修改文件的权限
4 – read(r)
2 – write(w)
1 – execute(x)
order: owner/group/world
eg:
chmod 777 – 每个人都有写,读,执行的权限
chmod 755 – 用户的创建者有所有的权限,同组/其他组有写读的权限

压缩

  • tar cf file.tar files 将 files 全部以 tar 方式 压缩到 file.tar
  • tar xf file.tar 将 file.tar 解压到当前目前目录
  • tar tf file.tar 列出 file.tar 压缩包中的文件

tar OPTIONS

  • c 创建新的档案文件,不可与x, t同时使用
  • t 列出档案文件中的文件, 不可与x, c同时使用
  • x 解压, 不可与c, t同时使用
  • f 使用档案文件或设备,该选项通常是必选的, 该参数后必须直接接档案名
  • z 用 zip/gzip 来压缩/解压缩 文件,加上该选项后可将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩
  • j 用 bzip2 来压缩/解压缩 文件,加上该选项后可将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩
  • k 保存已经存在的文件。即如果把某个文件还原,遇到相同的文件,不会进行覆盖
  • T 从文件中得到要展开或要创建的文件名
  • w 每一步都要求确认
  • v 详细报告 tar 处理的文件嘻嘻你,如故此选项,tar 不报告文件信息
  • r 附加到存档

gzip file – 用 gzip 压缩文件,压缩完后,原文件会删除
gzip -d file.gz – 解压

快捷方式

  • ctrl+c 终止当前进程
  • ctrl+z 挂起当前进程
  • fg 将后台中的命令调至前台继续运行
  • bg 将一个在后台暂停的命令,变成继续执行
  • ctrl+d 退出当前 SHELL
  • ctrl+w 擦除当前命令行字符
  • ctrl+r 方向搜索执行过的命令
  • !! 重复上条命令
  • exit 退出当前 SHELL

VIM

退出

  • :x 退出并保存修改
  • :wq 退出并保存修改
  • :q 没有修改的情况下,可退出
  • :q! 强制退出,忽略修改

插入文本

  • i 进入命令模式输入
  • I 行首插入
  • a 字符后面插入追加文本
  • A 行尾插入
  • o 光标下新建空行
  • O 光标上新建空行
  • r 取代光标所在的那一个字符
  • R 取代光标所在的文字,直到按 ESC 为止

移动光标

  • h 向左移动
  • j 向下移动
  • k 向上移动
  • l 向右移动
  • w 移动光标到下一个单词
  • W 移动光标到下一个单词
  • b 移动光标到前一个单词
  • B 移动光标到前一个单词
  • e 移动光标到下个单词的末尾
  • E 移动光标到下个单词的末尾
  • ( 移动光标到当前句首
  • ) 移动光标到下一句开始
  • { 移动光标到段开始
  • } 移动光标到下一段开始
  • 0 移动光标到行开始
  • $ 移动光标大行尾
  • nG 移动光标到第 n 行
  • :n 移动光标到第 n 行
  • G 移动光标到最后一行
  • fc 移动光标到前一个 c
  • Fc 移动光标到下一个 c
  • H 移动光标到屏幕的顶部
  • M 移动光标到屏幕的中部
  • L 移动光标到屏幕的底部
  • % 移动光标到配对的(), {}, []

删除文本

  • x 删除当前字符
  • X 删除光标前一个字符
  • D 删除当前到行尾的所有字符
  • dd 删除当前行
  • :d 删除当前行
  • dG 删除当前到文件末
  • dgg 删除当前到文件首

搜索

  • /string 向下搜索字符串 string
  • ?string 向上搜索字符串 string
  • n 在同一方向重复上一次搜索命令
  • N 在反方向上重复上一次搜索命令

替换

  • :s/pattern/string/flags 根据flags, 将当前行中所有pattern 均用 string 替代
  • g flag, 替换所有匹配的
  • c flag, 确定是否进行替换
  • & 重复上一次 替换 命令

files

  • :w file 保存文件
  • :r file 读入 file 内容到当前位置后
  • :n 打开多个文件时,将当前文件转到下一个(先保存当前文件)
  • :e file 打开另外一个文件 file (打开新文件前,先保存当前文件)
  • :! cmd 运行命令 cmd 后,返回到编辑器中
  • !! cmd 将运行命令 cmd 返回的结果体换当前行

other

  • u 恢复最后一个指令之前的结果,可以多次撤消指令,一次撤消一个操作,直至本次操作开始为止
  • U 恢复光标所在行所有改变
Tagged

iostat

FROM: iostat来对linux硬盘IO性能进行了解

iostat 是sysstat 一组件, 用来即时显示系统, 比如 自从系统启动开始的 CPU 平均时间 (与 uptime相似) 和整个系统, 适配器, tty 设备, 磁盘 etc 的输入/输出统计信息.

iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [interval [ count ] ]

OPTION

  • -c 显示 CPU 使用的相关信息
  • -d 显示磁盘使用的相关信息
  • -h-n参数时, 以易读的方式显示 NFS 的相关信息
  • -k 以 KB/s 为单位代替 blocks/s 显示统计信息. NOTE: kernel >= v2.4, 数据才能正确显示
  • -m 以 MB/s 为单位代替 blocks/s or KB/s 显示统计信息. NOTE: kernel >= v2.4, 数据才能正确显示
  • -N 显示映射的设备信息, 用于查看 LVM2 的统计信息
  • -n 显示 NFS 的统计信息NOTE: kernel >= v2.6.17
  • -p [ { device [,...] | ALL } ] 显示系统所用到的块设备 or 指定的设备及其分区的统计信息. NOTE: kernel = v2.5
  • -t 输出的每一行边上的时间戳记. 时间戳格式由环境变量 S_TIME_FORMAT所决定
  • -V 显示版本信息
  • -x 显示扩展信息. NOTE: 因为其需要 /proc/diskstats 文件 or 挂载 sysfs, 所以 kernel = v2.5. 但如果 kernel 有 patch /proc/partitions, 老版本 kernel(e.g. 2.4) 也可以选用该参数
  • -z 测试时段时, 如果设备的输出不处于 activity 状态, 则将其忽略
  • interval 参数指定在每个报告之间的以秒计算的时间量. 第一份报告包含了自系统启动 (引导) 以来的时间统计信息. 每一份后继报告都包含在和前一份报告的时间间隔之间收集的统计信息
  • count 参数可被指定来连接 interval 参数. 如果指定了 count 参数, 它的记数值就确定在 interval 秒间生成的报告数. 如果指定了 interval 参数但没有 count 参数, iostat 命令就会不断生成报告
输出解析

对于kernel 2.4, iostat 的数据的主要来源是 /proc/partitions, 而对于kernel 2.6, 数据主要来自 /proc/diskstats 或 /sys/block/[block-device-name]/stat.

/proc/partitions 信息

[root@localhost ~]# cat /proc/partitions
major minor  #blocks  name

   3     0   11534336 hda
   3     1     522081 hda1
   3     2    2096482 hda2
   3     3    8908042 hda3
  • major 主设备号, 3 代表 hda
  • minor 次设备号, 1 代表 No.1 分区
  • #blocks 设备总块数 (1024 bytes/block), 11 534 336 * 1024 = 11 811 160 064(bytes) ~ 1G
  • name 设备名称, e.g. hda1

iostat 输出结果

[root@localhost ~]# iostat
Linux 2.6.18-92.el5 (localhost.localdomain)     03/17/2011      _i686_  (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.03    0.03    0.13    0.03    0.00   99.78

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
hda               0.88         0.25        10.86    2282383  100713668

CPU 使用情况
CPU 值是所有处理器的总平均, 同时, I/O 等待状态是系统级定义的, 而不是每个处理器.

  • %user 显示用户级别(应用) 所占用 CPU 的百分比
  • %nice 显示拥有 nice 优先级用户所占用 CPU 的百分比
  • %system 显示系统级别(内核) 所占用 CPU 的百分比
  • %iowait 显示等待 IO 所占用 CPU 的百分比
  • %steal
  • %idle 显示空闲 CPU 的百分比

磁盘使用情况

  • tps 设备每秒钟传输的数量(每秒钟 I/O 的请求数). 多个单独的 I/O 请求看合并到一个传输请求中, 因为每个传输请求可以有不同的大小
  • Blk_read/s Blk_wrtn/s 每秒钟块设备读写块的数量. 可设置不同的块大小, 一般为1024, 2048, 4048字节, 取决于分区的容量.
  • Blk_read Blk_wrtn 显示自系统启动后读写块的总数

对于配置有大量磁盘的大型系统配置, 当 iostat 没有执行时, 系统可以设置为避免收集物理硬盘的 I/O 数据. 如果系统用上述的方式配置, 那么第一个磁盘报告将显示消息引导不可用后 的磁盘历史记录而不是磁盘统计信息. 由 iostat 命令生成的后继时间间隔报告包含在报告时间间隔期间收集的磁盘统计信息. 引导后的任何 tty 和 CPU 都不会影响. 如果一个系统管理命令用来重新保留磁盘统计信息, 那么第一个 iostat 命令报告会显示从启用磁盘输入/输出统计信息那一刻时间间隔起点起的行为.

注: 可使用如下命令来获得 /dev/hda1 的块大小

[root@localhost ~]# dumpe2fs -h /dev/hda1 | grep -F "Block size"
dumpe2fs 1.39 (29-May-2006)
Block size:               1024

iostat -x 输出结果

[root@localhost ~]# iostat -x
Linux 2.6.18-92.el5 (localhost.localdomain)     03/17/2011      _i686_  (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.03    0.03    0.13    0.03    0.00   99.78

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
hda               0.00     0.49    0.01    0.87     0.25    10.86    12.62     0.00    4.51   0.91   0.08
  • rrqm/s 每秒进行 merge 的读操作数目, 即 delta(rmerge)/s
  • wrqm/s 每秒进行 merge 的写操作数目, 即 delta(wmerge)/s
  • r/s 每秒完成的读 I/O 设备次数, 即 delta(rio)/s
  • w/s 每秒完成的写 I/O 设备次数, 即 delta(wio)/s
  • rsec/s 每秒读扇区数, 即 delta(rsect)/s
  • wsec/s 每秒写扇区数, 即 delta(wsect)/s
  • rkB/s 每秒读 K 字节数, 是 rsect/s 的一半, 因为每扇区大小为 512 字节
  • wkB/s 每秒写 K 字节数, 是 wsect/s 的一半
  • avgrq-sz 平均每次设备 I/O 操作的数据大小 (扇区), 即 delta(rsect+wsect)/delta(rio+wio)
  • avgqu-sz 平均 I/O 队列长度, 即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)
  • await 平均每次设备 I/O 操作的等待时间 (毫秒), 即 delta(ruse+wuse)/delta(rio+wio)
  • svctm 平均每次设备 I/O 操作的服务时间 (毫秒), 即 delta(use)/delta(rio+wio)
  • %util 一秒中有百分之多少的时间用于 I/O 操作, 或者说一秒中有多少时间 I/O 队列是非空的, 即 delta(use)/s/1000 (因为use的单位为毫秒)

I/O 系统 VS 超市排队

举一个例子, 我们在超市排队 checkout 时, 怎么决定该去哪个交款台呢? 首当是看排的队人数, 5个人总比20人要快吧? 除了数人头, 我们也常常看看前面人购买的东西多少, 如果前面有个采购了一星期食品的大妈, 那么可以考虑换个队排了. 还有就是收银员的速度了, 如果碰上了连钱都点不清楚的新手, 那就有的等了. 另外, 时机也很重要, 可能 5 分钟前还人满为患的收款台, 现在已是人去楼空, 这时候交款可是很爽啊, 当然, 前提是那过去的 5 分钟里所做的事情比排队要有意义 (不过我还没发现什么事情比排队还无聊的).

I/O 系统也和超市排队有很多类似之处:

  • r/s+w/s 类似于交款人的总数
  • 平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
  • 平均服务时间(svctm)类似于收银员的收款速度
  • 平均等待时间(await)类似于平均每人的等待时间
  • 平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
  • I/O 操作率 (%util)类似于收款台前有人排队的时间比例

我们可以根据这些数据分析出 I/O 请求的模式, 以及 I/O 的速度和响应时间.

实例

# iostat -x 1
avg-cpu: %user    %nice    %sys        %idle
         16.24       0.00     4.31        79.44
rrqm/s      wrqm/s      r/s      w/s      rsec/s   wsec/s   rkB/s       wkB/s     avgrq-sz   avgqu-sz          await    svctm    %util
/dev/cciss/c0d0
0.00        44.90       1.02   27.55      8.16     579.59   4.08        289.80      20.57        22.35         78.21     5.00     14.29
.......

上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: delta(io)/s = r/s + w/s = 1.02 + 27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1).

平均每次设备 I/O 操作只需要 0.91 就可以完成, 但每个 I/O 请求却需要等上 78 ms, 为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个), 假设这些请求是同时发出的, 那么平均等待时间可以这样计算:
平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + … + 请求总数-1) / 请求总数
应用到上面的例子: 平均等待时间 = 5ms * (1+2+…+28)/29 = 70ms, 和 iostat 给出的 78ms 的平均等待时间很接近. 这反过来表明 I/O 是同时发起的.

每秒发出的 I/O 请求很多 (约 29 个), 平均队列却不长 (只有 2 个 左右), 这表明这 29 个请求的到来并不均匀, 大部分时间 I/O 是空闲的.

一秒中有 14.29% 的时间 I/O 队列中是有请求的, 也就是说, 85.71% 的时间里 I/O 系统无事可做, 所有 29 个 I/O 请求都在142毫秒之内处理掉了.

delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s = 78.21 * delta(io)/s = 78.21*28.57 = 2232.8, 表明每秒内的I/O请求总共需要等待2232.8ms. 所以平均队列长度应为 2232.8ms/1000ms = 2.23, 而 iostat 给出的平均队列长度 (avgqu-sz) 却为 22.35(sysstat >= v4.1.6 已修改该问题 )

准则

  • 如果 %util 接近 100%, 说明产生的I/O请求太多, I/O系统已经满负荷, 该磁盘可能存在瓶颈.
  • svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了), svctm 的大小一般和磁盘性能有关, CPU/内存的负荷也会对其有影响, 请求过多也会间接导致 svctm 的增加. await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式. 如果 svctm 比较接近 await, 说明 I/O 几乎没有等待时间;如果 await 远大于 svctm, 说明 I/O 队列太长, 应用得到的响应时间变慢, 如果响应时间超过了用户可以容许的范围, 这时可以考虑更换更快的磁盘, 调整内核 elevator 算法, 优化应用, 或者升级 CPU.
  • 队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标, 但由于 avgqu-sz 是按照单位时间的平均值, 所以不能反映瞬间的 I/O
Tagged ,

sysstat

FROM: 系统状态查看工具sysstat

关于 sysstat

sysstat 是一个软件包, 包含监测系统性能及效率的一组工具, 这些工具对于收集系统性能数据, 比如 CPU 使用率, 硬盘和网络吞吐数据, 这些数据的收集和分析, 有利于判断系统是否正常运行和提高系统运行效率.

sysstat 软件包集成如下工具

  • iostat 提供 CPU 使用率及硬盘吞吐效率的数据
  • mpstat 提供单个处理器或多个处理器相关数据
  • sar 负责收集, 报告并存储系统活跃的信息
  • pidstat 提供 Linux 进程的 I/O, CPU , Memory 等相关信息
  • sadc 收集系统 activity data, 是为 sar 所设计的后端
  • sa1 负责收集并存储每天系统动态信息到一个二进制的文件中. 它是通过计划任务工具cron来运行, 是为 sadc 所设计的程序前端程序
  • sa2 负责把每天的系统活跃性息写入总结性的报告中. 它是为 sar 所设计的前端, 要通过cron来调用
  • sadc 是系统动态数据收集工具, 收集的数据被写一个二进制的文件中, 它被用作 sar 工具的后端
  • sadf 显示被sar通过多种格式收集的数据
  • nfsiostat 提供 NFS input/output 的统计数据
  • cifsiostat 提供 CIFS 统计数据

安装 sysstat

对于大多数系统, 都有这个软件包, 软件名以 sysstat 开头.

对于 Debian 或 deb 软件包为基础的系统

[root@localhost ~]# apt-get install sysstat

Fedora 系统或以 RPM 包管理的系统

[root@localhost ~]# yum   install sysstat

如果是RPM包, 可用下面的命令来安装

[root@localhost ~]#rpm -ivh sysstat-*.*.*-*.src.rpm

通过源码包编译安装
到官方下载源码包, 目前最新版本是 sysstat-10.0.0, 下载地址

[root@localhost ~]# tar zxvf sysstat-10.0.0.tar.gz
[root@localhost ~]$ cd sysstat-10.0.0
[root@localhost sysstat-10.0.0]# ./configure
[root@localhost sysstat-10.0.0]# make
[root@localhost sysstat-10.0.0]# make install

在运行配置脚本时, 可设置各参数.通过 ./configure -help可获得各参数列表及其说明.

NOTE:sysstat <= v7.0.4 不支持配置脚本, 所以在配置 sysstat 时需要用 make config来代替./configure

sysstat 计划任务及其运行

如果想得到 sysstat 工具集所收集的系统信息自动存为某个文件中, 则必须通过cron 为 sa1 和sa2 做计划任务. 我们可以通过修改用户的crontab. 在默认的情况下, sysstat 历史信息将被存放在/var/log/sa文件中.

cron 计划
在root用户, 通过 crontab -e 来添加下面的一段(如果安装时有修改过参数, 请对照执行修改如下)

# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/local/lib/sa/sa1 -d 1 1
# 0 * * * * root /usr/local/lib/sa/sa1 -d 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/local/lib/sa/sa2 -A

每天运行得到的信息都会保存到/var/log/sa目录, 运行sar -A 命令可得到类似于该报告的信息.

创建 sysstat 的启动脚本

[root@localhost ~]# touch  /etc/rc.d/init.d/sysstat
[root@localhost ~]# vim /etc/rc.d/init.d/sysstat

将如下代码加入 /etc/rc.d/init.d/sysstat

#!/bin/sh
# Begin $rc_base/init.d/sysstat

# Based on sysklogd script from LFS-3.1 and earlier.
# Rewritten by Gerard Beekmans  - gerard@linuxfromscratch.org

. /etc/sysconfig/rc
. $rc_functions

case "$1" in
        start)
                echo "Calling the system activity data collector (sadc)..."
                /usr/lib/sa/sadc -F -L -
                evaluate_retval
                ;;
        *)

                echo "Usage: $0 start"
                exit 1
                ;;
esac

# End $rc_base/init.d/sysstat

保存后, 执行如下命令

[root@localhost ~]# chmod 755 /etc/rc.d/init.d/sysstat

sysstat 启动脚本需要在系统启动时就开始运行. 所以, 需要为其在 /etc/rc.d/rcsysinit.d下创建一符号链接.命令如下:

[root@localhost ~]# ln -sf /etc/rc.d/init.d/sysstat /etc/init.d/rc.sysinit/sysstat

有了 sysstat 的守护进程, 这样开机后, sysstat的守护进程, 就时时刻刻的为我们服务了. sa , sa1或sa2自动把信息存在 /var/log/sa 目录的二进制文件中.

当然, 也可以通过手动的方法来打开 sysstat 的守护程序;

[root@localhost ~]# /etc/rc.d/init.d/sysstat start

or

[root@localhost ~]# /usr/local/lib/sa/sa1
[root@localhost ~]# /usr/local/lib/sa/sa2

NOTE:如果在配置时有加入--enable-install-cron参数, 则上面所创建的 crontab, startup script and link在安装时自动创建.

REFRENCE: sysstat

Tagged ,

df 命令

df [OPTION]... [FILE]...

  • -a 显示文件系统的磁盘使用情况, 包括 0 块(block)的文件系统, eg, /proc
  • -k 以 KB 为单位显示
  • -i 显示 i 节点信息, 而不是磁盘块
  • -t 显示各指定类型的文件系统的磁盘空间使用情况
  • -x 列出不是某一指定类型文件系统的磁盘空间使用情况(与-t相反
  • -T 显示文件系统类型

df 是来自于coreutils 软件包, 系统安装自带, 通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置.

列出各文件系统的磁盘空间使用情况

[root@localhost tmp]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda3              8628896   3851748   4331748  48% /
/dev/hda1               505604     16006    463494   4% /boot
tmpfs                   517644         0    517644   0% /dev/shm
  • Filesystem 列, 代表文件系统对应的设备文件的路径名(一般是硬盘上的分区)
  • 1K-blocks 列, 分区包含的数据块(1024 B)的数目
  • Used, Available 列, 表示已用和可用的数据块数目, 但这两列之和 != 1K-blocks. 这是因为缺省的每个分区都留了少量空间供系统管理员使用. 即使遇到普通用户空间已满的情况, 管理员仍能登陆和留有解决问题所需的工作空间
  • Use% 列, 表示普通用户使用的百分比, 即使这一数字达到 100%, 分区仍然留有系统管理员使用的空间, 原因如上条所释
  • Mounted on 列, 表示文件系统的挂载点

另外, -a参数, 系统所有的分区, 默认情况下, 不显示 0 块的分区

[root@localhost tmp]# df -ah
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda3             8.3G  3.7G  4.2G  48% /
proc                     0     0     0   -  /proc
sysfs                    0     0     0   -  /sys
devpts                   0     0     0   -  /dev/pts
/dev/hda1             494M   16M  453M   4% /boot
tmpfs                 506M     0  506M   0% /dev/shm
none                     0     0     0   -  /proc/sys/fs/binfmt_misc
sunrpc                   0     0     0   -  /var/lib/nfs/rpc_pipefs

列出各文件系统的 innod 节点使用情况

[root@localhost tmp]# df -ih
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/hda3               2.2M    134K    2.0M    7% /
/dev/hda1               128K      34    128K    1% /boot
tmpfs                   127K       1    127K    1% /dev/shm

列出文件系统的类型

[root@localhost tmp]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/hda3     ext3    8.3G  3.7G  4.2G  48% /
/dev/hda1     ext3    494M   16M  453M   4% /boot
tmpfs        tmpfs    506M     0  506M   0% /dev/shm

-h -H -k参数

-h, -H, 都是以易读的方式显示目前磁盘空间和使用情况.

[root@localhost tmp]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda3             8.3G  3.7G  4.2G  48% /
/dev/hda1             494M   16M  453M   4% /boot
tmpfs                 506M     0  506M   0% /dev/shm

-h不同, -H, 它是采用 1000 进行容量转换,而-h采用的是1024

[root@localhost tmp]# df -H
Filesystem             Size   Used  Avail Use% Mounted on
/dev/hda3              8.9G   4.0G   4.5G  48% /
/dev/hda1              518M    17M   475M   4% /boot
tmpfs                  531M      0   531M   0% /dev/shm
[root@localhost tmp]# df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda3              8628896   3851728   4331768  48% /
/dev/hda1               505604     16006    463494   4% /boot
tmpfs                   517644         0    517644   0% /dev/shm

-k, 以 KB 为单位显示磁盘的使用情况

-l, 过滤 nfs 驱动器

[root@localhost tmp]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda3             8.3G  3.7G  4.2G  48% /
/dev/hda1             494M   16M  453M   4% /boot
tmpfs                 506M     0  506M   0% /dev/shm

如果服务器 nfs 了远程服务器的磁盘, 加-l显示的是过滤 nfs 驱动后的结果

Tagged ,

vmstat 命令

vmstat [-a] [-n] [delay [ count]]
vmstat [-f] [-s] [-m]
vmstat [-S unit]
vmstat [-d]
vmstat [-p disk partition]
vmstat [-V]
vmstat, Virtual Meomory Statistics(虚拟内存统计), 可对操作系统的虚拟内存、进程、CPU活动进行监视. 它是对系统的整体情况进行统计, 但不能针对某个进程进行深入分析.

  • -a 开启 or 关闭显示 active/inactive 内存
  • -n 开启 or 关闭周期性循环输出时, 输出的头部信息仅显示一次
  • delay 两次输出之间的延迟时间
  • count 按照这个指定的时间间隔统计的次数
  • -f 开启 or 关闭显示自系统启动后 forks 的数目, 包括(fork, vfork and clone system calls)
  • -m 显示 slabinfo
  • -s 开启 or 关闭以表格形式显示的 event counters and memory statistics
  • -d 显示 disk statistics
  • -p 显示参数所指定的分区的详细信息
  • -S (k|K|m|M) 以k|kB|m|MB为单位显示,对应转换(1000|1024|1000000|1048576)
  • -V 打印版本信息
[root@localhost ~]# vmstat
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    284  66240 165924 419584    0    0     0     5    2    1  0  0 100  0  0

#To output active/inactive memory info
[root@localhost ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 0  0    284  65620  86928 833976    0    0     0     5    3    1  0  0 100  0  0

#To run vmstat with 2 updates, five seconds apart
[root@localhost ~]# vmstat 5 2
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    284  65620 165924 419824    0    0     0     5    3    1  0  0 100  0  0
 0  0    284  65620 165924 419828    0    0     0     7 1014   64  0  0 100  0  0

procs, 下面三种状态的进程数

  • r 等待运行的进程数
  • b 在等待的进程数(通常在等待 IO)
  • w 可进入运行队列但被替换的进程(Solaris vmstat)

memory, 虚拟内存和实存信息

  • swpd 虚拟内存使用情况, unit:kb
  • free 空闲的内存, unit:kb
  • buff 被用来做 buffer 的内存数, unit:kb
  • cache 被用来做 cache 的内存数, unit:kb
  • inactive 闲置的内存,unit:kb, -a显示
  • active 活动内存, unit:kb,-a显示

swap, 显示磁盘与内存每秒的交换

  • si 从磁盘交换到内存的交换页数量, unit:kb
  • so 从内存交换到磁盘的交换页数量, unit:kb

io, 显示块设备每秒发送和收到的块数

  • bi 发送到块设备的块数, unit: blocks
  • bo 从块设备接收到的数据, unit:blocks

system

  • in 每秒的中断数, 包括时钟中断
  • cs 每秒的环境切换次数

CPU, CPU 故障时间的百分比, 在多处理器系统上, 这是全部处理器的平均值

  • us CPU 使用时间(except kernel)
  • sy CPU 系统使用时间(内核)
  • id 闲置时间
  • wa 等待 IO 的时间
  • st

disk, 显示每秒的磁盘操作, s 表示 scsi 盘, 0 表示盘号

pages, 每秒页面调度活动数量的信息(Solaris vmstat)

  • re 回收的页面
  • mf 非常严重错误的页面
  • pi 进入页面数, unit:KB
  • po 出页面数, unit:KB
  • fr 空也的页面数, unit:KB
  • de 提前读入的页面中的未命中数
  • sr 通过时钟算法扫描的页面

fault, 显示每秒的中断数(Solaris vmstat)

  • in 设备中断
  • sy 系统中断
  • cy cpu交换

准测

  • r<5, b≈0
  • 如果free < MINFREE, 将会出现连续不断的页面调度, 将导致系统性能问题.
  • 如果在多用户环境中us+sys>80, 进程就会在运行队列中花费等待时间, 响应时间和吞吐量就会下降.
  • wa > 40, 表明磁盘io没有也许存在不合理的平衡, 或者对磁盘操作比较频繁
  • 如果 r 经常大于 4 , 且 id 经常少于 40, 表示 CPU 的负荷很重
  • 如果 pi, po 长期不等于 0, 表示内存不足
  • 如果 disk 经常不等于 0, 且在 b 中的队列大于 3, 表示 io 性能不好

通过 vmstat 识别 CPU 瓶颈

r(运行队列)展示了正在执行和等待 CPU 资源的任务个数. 当这个值超过了 CPU 数目, 就会出现CPU瓶颈

获得 CPU 个数的命令(Linux):

[root@localhost ~]# cat /proc/cpuinfo | grep processor | wc -l

当 r 值超过了CPU个数, 就会出现CPU 瓶颈, 解决办法大体如下

  • 最简单的就是 增加 CPU个数
  • 通过调整任务执行时间, 如大任务放到系统不繁忙的情况下进行执行, 进尔平衡系统任务
  • 调整已有任务的优先级

通过 vmstat 识别 CPU 满负荷

vmstat 中 CPU 的度量是百分比. 当us+sy≈100时, 表示 CPU 正在接近满负荷工作. 但要注意的是, CPU 满负荷工作并不能说明什么, *nix 总是试图要 CPU 尽可能的繁忙, 使得任务的吞吐量最大化. 唯一能够确定 CPU 瓶颈的还是 r(运行队列) 的值.

通过 vmstat 识别 RAM 瓶颈

数据库服务器都只有有限的 RAM, 出现内存争用现象是常见问题

首先察看 RAM 的数量, 命令如下

[root@localhost ~]# free
             total       used       free     shared    buffers     cached
Mem:       1035292     969548      65744          0     165924     419720
-/+ buffers/cache:     383904     651388
Swap:      2096472        284    2096188

也可使用 top 等其他命令来显示RAM.
当内存的需求大于RAM的数量, 服务器启动虚拟内存机制, 通过虚拟内存, 可以将 RAM 段移到 SWAP DISK 的特殊磁盘段上, 这样会出现虚拟内存的页导出和页导入现象, 页导出并不能说明 RAM 瓶颈, 虚拟内存系统经常会对内存段进行页导出, 但页导入操作就表明了服务器需要更多的内存了, 页导入需要从 SWAP DISK 上将内存段复制回 RAM, 导致服务器速度变慢.

解决办法有如下几种

  • 加大 RAM
  • 改小 SGA, 使得对 RAM 需求减少
  • 减少 RAM 的需求(减少 PGA etc)

Reference:

Tagged ,

查看 CPU, Memory, I/O and NetFlow

iostat 查看磁盘 I/O

[root@localhost ~]# iostat -d -x 2
                             extended device statistics
device mgr/s mgw/s    r/s    w/s    kr/s    kw/s   size queue   wait svc_t  %b
hda        0     0    0.0    0.9     0.1     5.4    6.3   0.0    4.7   0.9   0
                             extended device statistics
device mgr/s mgw/s    r/s    w/s    kr/s    kw/s   size queue   wait svc_t  %b
hda        0     3    0.0    2.0     0.0    20.0   10.0   0.0    0.8   0.5   0
 ......

命令释意: 查看磁盘 I/0 情况,且每两秒刷新一次

[root@localhost ~]# vmstat 5
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    284  68700 165876 416748    0    0     0     5    1    1  0  0 100  0  0
 ......

命令释意: 查看CPU使用情况的命令, 每 5 秒刷新一次,最右侧列为 CPU 的占用率的数据

top 查看进程占有率

[root@localhost ~]# top

然后在 top 的命令内部命令栏输入shift+p or P

top - 13:38:52 up 102 days,  4:17,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  81 total,   2 running,  79 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1035292k total,   966592k used,    68700k free,   165876k buffers
Swap:  2096472k total,      284k used,  2096188k free,   416760k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 4875 root      15   0  2192 1000  800 R  0.3  0.1   0:00.15 top
    1 root      15   0  2060  620  532 S  0.0  0.1   0:01.65 init
    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
.......

命令释意: 查看进程处理器占用率情况,并对其进行排序

free 查看内存使用情况

[root@localhost ~]# free
             total       used       free     shared    buffers     cached
Mem:       1035292     966592      68700          0     165876     416768
-/+ buffers/cache:     383948     651344
Swap:      2096472        284    2096188

命令释意: 查看内存使用情况

top 查看进程内存使用

[root@localhost ~]# top

然后在 top 的命令内部命令栏输入shift+m or M

top - 13:48:52 up 102 days,  4:27,  1 user,  load average: 0.00, 0.01, 0.00
Tasks:  81 total,   2 running,  79 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1035292k total,   966592k used,    68700k free,   165876k buffers
Swap:  2096472k total,      284k used,  2096188k free,   416784k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 4128 root      34  19  280m 266m 2112 S  0.0 26.4   1:48.40 yum-updatesd
 8314 www       18   0  171m  34m  34m S  0.0  3.4   0:06.03 memcacheq
 8280 www       15   0 88084  34m  588 S  0.0  3.4   0:01.23 memcached
10907 mysql     15   0  122m  16m 3892 S  0.0  1.7   0:25.29 mysqld
......

命令释意: 查看进程内存占用率情况,并对其进行排序

获得针对某个 Interface 的网络流量

[root@localhost ~]# date;ifconfig eth0
Sun Mar 13 13:51:29 CST 2011
eth0      Link encap:Ethernet  HWaddr 00:50:56:A4:0D:89
          inet addr:172.10.7.215  Bcast:172.10.7.255  Mask:255.255.248.0
          inet6 addr: fe80::250:56ff:fea4:d89/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:72113071 errors:12213 dropped:30790 overruns:0 frame:0
          TX packets:1062902 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3311165612 (3.0 GiB)  TX bytes:101244262 (96.5 MiB)
          Interrupt:59 Base address:0x2000

[root@localhost ~]# date;ifconfig eth0
Sun Mar 13 13:53:13 CST 2011
eth0      Link encap:Ethernet  HWaddr 00:50:56:A4:0D:89
          inet addr:172.10.7.215  Bcast:172.10.7.255  Mask:255.255.248.0
          inet6 addr: fe80::250:56ff:fea4:d89/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:72113528 errors:12213 dropped:30790 overruns:0 frame:0
          TX packets:1062968 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3311204659 (3.0 GiB)  TX bytes:101285190 (96.5 MiB)
          Interrupt:59 Base address:0x2000

命令释意: 通过比较两个时间网络接口的 RXTX 数据来获得针对某个 Interface 的网络流量

Tagged

free 命令

free [-b | -k | -m] [-o] [-s 间隔秒数 ] [-t] [-V]
free, Linux 内存查看命令, 它不仅会显示内存的使用情况, 还包括实际物理内存, 虚拟的交换文件内存, 共享内存区段, 以及系统核心使用的缓冲区等.

  • -b 以 Byte 为单位显示内存使用情况
  • -k 以 KB 为单位显示内存使用情况
  • -m 以 MB 为单位显示内存使用情况
  • -o 不显示缓冲区调节剂
  • -s 间隔秒数持续观察内存使用状况
  • -t 显示内存总和列
  • -V 显示版本信息
[root@localhost ~]# free
             total       used       free     shared    buffers     cached
Mem:       1035292     965476      69816          0     165876     415680
-/+ buffers/cache:     383920     651372
Swap:      2096472        284    2096188

各值释意如下:

  total used free shared buffers cached
Mem 物理内存 1035292 物理内存总量 965476 总计分配给缓存(buffer, chahe)使用的数量,但其中可能部分缓存并未实际使用 69816 未被分配的内存 0 共享内存 165876 系统分配但未被使用的 buffer 数量 415680 系统分配但未被使用的 cache 数量
-/+ buffers/cached 物理内存的缓存统计   383920 实际使用的 buffer 和 cache 数量, 即实际使用的内存总量 651372 未被使用的 buffer, cache和未被分配的内存之和, 即当前系统实际可用内存      
Swap 硬盘上交换分区的使用情况 2096472 284 2096188      

从上可得如下等式:

  • Mem|total = Mem|used + Mem|free
  • Mem|total = -/+ buffers/cached|used + -/+ buffers/cached|free
  • Mem|used = Mem|buffers + Mem|cached + -/+ buffers/cached|used
  • -/+ buffers/cached|free = Mem|free + Mem|buffers + Mem|cached

Mem 的 used/free与 -/+ buffers/cache used/free

  • Mem 行是从 OS 的角度来看, 因为对于 OS, buffers/cached 都是属于被使用, 所以他的可用内存是 69816KB, 已用内存是 965476KB, 包括OS 系统内核使用 + Application(X, Nginx etc)使用 + buffers + cached, 即 Mem|used = Mem|buffers + Mem|cached + -/+ buffers/cached|used
  • -/+ buffers/cache 行是从应用程序角度来看, 对于应用程序来说, buffers, cached 是等于可用, 因为 buffers/cached 是为了提高文件读取的性能, 当应用程序需在用到内存的时候, buffers/cached 会很快地被回收. 所以从应用程序的角度来说, -/+ buffers/cached|free = Mem|free + Mem|buffers + Mem|cached

buffer 与 cache 的区别

  • cache, 高速缓存, 位于 CPU 与 主内存间的一种容量较小但速度很高的存储器. 由于 CPU 的速度高于主内存, CPU 直接从内存中存取数据要等待一定时间周期, Cache 中保存着 CPU 干用过后循环使用的一部分数据, 当 CPU 再次使用该部分数据时可从 Cache 中直接调用, 这样可减少 CPU 的等待时间, 提高系统的效率. Cache 分为一级 Cache(L1 Cache)和二级 Cache(L2 Cache), L1 Cache集中在 CPU 内部, L2 Cache 早期一般焊在主板上, 现在也集中在 CPU 内部.
  • buffer, 缓冲区, 一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域. 通过缓冲区, 可使进程之间的相互等待变少, 从而使速度慢的设备读入数据时, 速度快的设备的操作进程不发生间断.
  • Free 中的 buffer and cache(它们都是占用内存), buffers, 做为 buffer cache 的内存, 是块设备的读写缓冲区;cached, 做为 page cache 的内存, 是文件系统的 cache.
  • 如果 cache 值很大, 说明 cache 住的文件和数据很多. 频繁访问到的文件都能被 cache 住, 如此, 磁盘的读 IO 必会非常小.这样也就提高了系统性能, 当需要这些内存时, 系统也会自动释放(Windows 除外)

在 Linux 的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(Mem|free >0),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。
因此查看目前进程正在实际被使用的内存,是Mem|used = Mem|buffers + Mem|cached + -/+ buffers/cached|used,也可认为如果 Swap 没有大量使用,Mem 还是够用,只有 Mem 被当前进程实际占用完(Mem|buffers=0 and Mem|cached=0), 才使用到 Swap.

另外, 为了提高磁盘存取效率, Linux 还做了一些精心的设计, 除了对 dentry 进行缓存(用于 VFS, 加速文件路径名到 inode 的转换), 还采取了两种主要 Cache 方式:Buffer Cache 和 Page Cache, 前者针对磁盘块的读写, 后者针对文件 inode 的读写. 这些 Cache 有效缩短了 I/O 系统调用(read, write, getdents etc)的时间.

如果感兴趣可以进一步参考文件 /proc/meminfo, free命令就是根据它的信息生成的. free命令的源码可从procps-xxx-.src.rpm获取, xxx为版本号, 比如procps-3.2.3-5.3.src.rpm.

内核参考代码
arch/i386/mm/init.c
fs/proc/proc_misc.c
include/linux/swap.h
mm/filemap.c
fs/buffer.c

另外还可参考O’REILLY的书《Understanding the LINUX KERNEL》.

Tagged ,

top 命令

top 显示系统当前的进程和其他状况,它是一个动态显示过程, 即可通过用户按键来不断刷新当前状态, 如果在前台执行该命令, 它将独占前台, 直到用户终止该程序.
top [-] [d] [p] [q] [C] [S] [s] [n]
参数说明:

  • -d 指定每两次屏幕信息刷新之间的时间间隔, 当前用户可用s交互命令来改变之
  • -p 通过指定监控进程 ID 来仅仅监控某个进程的状态
  • -q 该选项将使 top 没有任何延迟的进行刷新, 如果调用程序有超级用户权限, 那么 top 将以尽可能高的优先级运行
  • -C 显示整个命令行而不只是命令
  • -S 指定累计模式
  • -s 使 top 命令在安全模式中运行, 这将去除交互命令所带来的潜在危险
  • -n 使 top 不显示任何闲置或僵尸进程
[root@localhost ~]# top

结果如下:

top - 16:25:34 up 15 days, 23:29,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 107 total,   2 running, 104 sleeping,   1 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.3%hi,  0.0%si,  0.0%st
Mem:   1035292k total,   915272k used,   120020k free,   166948k buffers
Swap:  2096472k total,        0k used,  2096472k free,   403444k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
24083 root      15   0  2192 1020  800 R  0.7  0.1   0:00.75 top
    1 root      15   0  2060  624  532 S  0.0  0.1   0:01.44 init
    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
    3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
    4 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
    5 root      10  -5     0    0    0 S  0.0  0.0   0:00.70 events/0
			.......

命令行输入top后,界面以全屏的方式显示信息,其结果包括三个部分,系统信息栏,命令输入栏, 进程列表栏(如上)

系统信息栏

第一行(top), 同 uptime 命令的执行结果

  • 16:25:34 current system time
  • 15 days, 23:29 系统自启动后到当前的运行时间
  • 2 users 登录到系统的用户的终端数
  • load average 当前系统的负载平均值,之后的 0.00, 0.00, 0.00 分别为 1 min, 5 min, 15 min前进程的平均数,一般认为这个数超过CPU数目时,CPU 的负载将会过重

第二行(Tasks)

  • 107 total 为当前系统的进程数
  • 2 running 为当前运行中的进程数
  • 104 sleeping 为睡眠中的进程数
  • 1 stopped 被停止的系统进程数
  • 0 zombie 被复原的进程数

第三行(Cpus)

  • 0.0%us 用户空间占用 CPU 百分比
  • 0.0%sy 内核空间占用 CPU 百分比
  • 0.0%ni 用户进程空间内改变过优先级的进程占用 CPU 百分比
  • 99.7%id 空闲 CPU 百分比
  • 0.0%wa 等待输入输出的 CPU 时间百分比
  • 0.3%hi 硬件中断请求
  • 0.0%st 软件中断请求

当有多个 CPU 时,该内容可能会有多行
第四行(Mem)

  • 1035292k total 物理内存总量
  • 915272k used 使用的物理内存总量
  • 120020k free 空闲内存总量
  • 166948k buffers 用作内核缓存的内存总量

第五行(Swap)
表示类别同第四行(Mem),但此处反映着交换分区 (Swap) 的使用情况。通常,交换分区被频繁使用被视为物理内存不足而造成的。
内存中的内容被换出到交换区,而后又被换入到内存,但是用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。

中间部分的内部命令提示栏

top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下表:

  • s 改变两次刷新之间的延迟时间. 系统将提示用户输入新的时间, unit:s. 如果有小数,则会换成 ms, 输入 0 值则系统将不断刷新, 默认值是 5. 如果设置的值太小, 则会引起屏幕不断刷新, 且同时系统负载也会大大增加
  • l 关闭或开启第一部分平均负载和启动时间的信息
  • t 关闭或开启第一部分进程和 CPU 的信息
  • m 关闭或开启第一部分内存和 Swap 的信息
  • N 以 PID 的大小的顺序排列表示进程列表
  • P 以 CPU 占用率大小的顺序排列进程列表
  • M 以内存占用率大小的顺序排列进程列表
  • h or ? 显示帮助
  • n 设置在进程列表所显示进程的数量
  • q 退出 top
  • CTRL+L 重写屏幕
  • k 终止一个进程, 系统将提示用户输入需要终止的进程 PID, 以及需要发送给进程什么样的信号, 一般的终止进程使用 15 信号, 如果不能正常结束那就使用信号 9 强制结束该进程. 默认值是信号 15, 在安全模式中刺命令被屏蔽
  • i 忽略闲置和僵死的进程
  • r 重新安排一个进程的优先级. 系统提示用户输入需要改变的进程 PID 以及需要设自豪的优先级值. 输入一个正值将使优先级降低, 反之则可使该进程拥有更高的优先级. 默认值是 10
  • S 切换到累计模式
  • f or F 从当前显示中添加或删除项目
  • o or O 改变显示项目的顺序
  • c 切换显示命令名称和完整命令行
  • T 根据时间/累计时间进行排序
  • W 将当前设置写入~/.toprc文件中, 写 top 配置文件的推荐方法

另外,按top后, 再Z+X可飘红显示。

进程列表栏

各列的含义

序号 列名 含义
a PID 进程ID
b PPID 父进程ID
c RUSER Real user name
d UID 进程所有者的用ID
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名,不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice 值,负值表示高优先级
j P 最后使用的 CPU, 仅在多 CPU 环境下有意义
k %CPU 上次更新到目前的 CPU 时间占用百分比
l TIME 进程使用的 CPU 时间总计, unit: s
m TIME+ 进程使用的 CPU 时间总计, unit: 1/100 s
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量, unit: kb VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,unit:kb
q RES 进程使用的,未被换出的物理内存大小, unit:kb RES=CODE+DATA
r CODE 可执行代码占的物理内存大小, unit:kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小.unit:kb
t SHR 共享内存大小, unit:kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在, 被修改过的页面数
w S 进程状态 D(不可中断的睡眠状态) R(运行) T(跟踪/停止) Z(僵尸进程) S(睡眠)
x COMMAND 命令名/命令行/td>
y WCHAN 若该进程在睡眠, 则显示睡眠中的系统函数名
z Flags 任务标志

默认情况下仅显示 PID, USER, PR, NI, VIRT, RES, SHR, S, %CPU, %MEM, TIME+, COMMAND 列. 可通过快捷键来更改显示的内容
f键之后会显示列的列表, 再按a-z即可显示/隐藏对应的列, 最后按Enter键确定。
o后改变列显示的顺序, 再按a-z可将相对应的列向右移动,而按A-Z可将相对应的列向左移动, 最后按Enter键确定。
F or O键, 再按a-z可将进程按照相对应的列进行排序, 而R键可将当前的排序倒转。

Tagged ,