linux-tutorial/docs/linux/commands/系统管理/系统性能管理.md
2018-02-28 10:23:56 +08:00

548 lines
18 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: linux 常用命令-系统性能管理
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
<!-- TOC -->
- [linux 常用命令-系统性能管理](#linux-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4-%E7%B3%BB%E7%BB%9F%E6%80%A7%E8%83%BD%E7%AE%A1%E7%90%86)
- [df](#df)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [du](#du)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [top](#top)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [top交互命令](#top%E4%BA%A4%E4%BA%92%E5%91%BD%E4%BB%A4)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [free](#free)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [iotop](#iotop)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [安装](#%E5%AE%89%E8%A3%85)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [实例](#%E5%AE%9E%E4%BE%8B)
<!-- /TOC -->
# linux 常用命令-系统性能管理
## df
显示磁盘的相关信息
### 补充说明
**df命令** 用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间目前还剩下多少空间等信息。
### 语法
```
df(选项)(参数)
```
### 选项
```
-a或--all包含全部的文件系统
--block-size=<区块大小>:以指定的区块大小来显示区块数目;
-h或--human-readable以可读性较高的方式来显示信息
-H或--si与-h参数相同但在计算时是以1000 Bytes为换算单位而非1024 Bytes
-i或--inodes显示inode的信息
-k或--kilobytes指定区块大小为1024字节
-l或--local仅显示本地端的文件系统
-m或--megabytes指定区块大小为1048576字节
--no-sync在取得磁盘使用信息前不要执行sync指令此为预设值
-P或--portability使用POSIX的输出格式
--sync在取得磁盘使用信息前先执行sync指令
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
-T或--print-type显示文件系统的类型
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
--help显示帮助
--version显示版本信息。
```
### 参数
文件:指定文件系统上的文件。
### 实例
查看系统磁盘设备默认是KB为单位
```
[root@LinServ-1 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 146294492 28244432 110498708 21% /
/dev/sda1 1019208 62360 904240 7% /boot
tmpfs 1032204 0 1032204 0% /dev/shm
/dev/sdb1 2884284108 218826068 2518944764 8% /data1
```
使用`-h`选项以KB以上的单位来显示可读性高
```
[root@LinServ-1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 140G 27G 106G 21% /
/dev/sda1 996M 61M 884M 7% /boot
tmpfs 1009M 0 1009M 0% /dev/shm
/dev/sdb1 2.7T 209G 2.4T 8% /data1
```
查看全部文件系统:
```
[root@LinServ-1 ~]# df -a
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 146294492 28244432 110498708 21% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
devpts 0 0 0 - /dev/pts
/dev/sda1 1019208 62360 904240 7% /boot
tmpfs 1032204 0 1032204 0% /dev/shm
/dev/sdb1 2884284108 218826068 2518944764 8% /data1
none 0 0 0 - /proc/sys/fs/binfmt_misc
```
## du
显示每个文件和目录的磁盘使用空间
### 补充说明
**du命令** 也是查看使用空间的但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看还是和df命令有一些区别的。
### 语法
```
du [选项][文件]
```
### 选项
```
-a或-all 显示目录中个别文件的大小。
-b或-bytes 显示目录或文件大小时以byte为单位。
-c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-k或--kilobytes 以KB(1024bytes)为单位输出。
-m或--megabytes 以MB为单位输出。
-s或--summarize 仅显示总计,只列出最后加总的值。
-h或--human-readable 以KMG为单位提高信息的可读性。
-x或--one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-L<符号链接>或--dereference<符号链接> 显示选项中所指定符号链接的源文件大小。
-S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
-X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
--exclude=<目录或文件> 略过指定的目录或文件。
-D或--dereference-args 显示指定符号链接的源文件大小。
-H或--si 与-h参数相同但是KMG是以1000为换算单位。
-l或--count-links 重复计算硬件链接的文件。
```
### 实例
显示目录或者文件所占空间:
```
root@localhost [test]# du
608 ./test6
308 ./test4
4 ./scf/lib
4 ./scf/service/deploy/product
4 ./scf/service/deploy/info
12 ./scf/service/deploy
16 ./scf/service
4 ./scf/doc
4 ./scf/bin
32 ./scf
8 ./test3
1288 .
```
只显示当前目录下面的子目录的目录大小和当前目录的总的大小最下面的1288为当前目录的总大小
显示指定文件所占空间:
```
[root@localhost test]# du log2012.log
300 log2012.log
```
查看指定目录的所占空间:
```
[root@localhost test]# du scf
4 scf/lib
4 scf/service/deploy/product
4 scf/service/deploy/info
12 scf/service/deploy
16 scf/service
4 scf/doc
4 scf/bin
32 scf
```
显示多个文件所占空间:
```
[root@localhost test]# du log30.tar.gz log31.tar.gz
4 log30.tar.gz
4 log31.tar.gz
```
只显示总和的大小:
```
[root@localhost test]# du -s
1288 .
[root@localhost test]# du -s scf
32 scf
[root@localhost test]# cd ..
[root@localhost soft]# du -s test
1288 test
```
## top
显示或管理执行中的程序
### 补充说明
**top命令** 可以实时动态地查看系统的整体运行情况是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面用热键可以管理。
### 语法
```
top(选项)
```
### 选项
```
-b以批处理模式操作
-c显示完整的治命令
-d屏幕刷新间隔时间
-I忽略失效过程
-s保密模式
-S累积模式
-i<时间>:设置间隔时间;
-u<用户名>:指定用户名;
-p<进程号>:指定进程;
-n<次数>:循环显示的次数。
```
### top交互命令
在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的如果在命令行中使用了-s选项 其中一些命令可能会被屏蔽。
```
h显示帮助画面给出一些简短的命令总结说明
k终止一个进程
i忽略闲置和僵死进程这是一个开关式命令
q退出程序
r重新安排一个进程的优先级别
S切换到累计模式
s改变两次刷新之间的延迟时间单位为s如果有小数就换算成ms。输入0值则系统将不断刷新默认值是5s
f或者F从当前显示中添加或者删除项目
o或者O改变显示项目的顺序
l切换显示平均负载和启动时间信息
m切换显示内存信息
t切换显示进程和CPU状态信息
c切换显示命令名称和完整命令行
M根据驻留内存大小进行排序
P根据CPU使用百分比大小进行排序
T根据时间/累计时间进行排序;
w将当前设置写入~/.toprc文件中。
```
### 实例
```
top - 09:44:56 up 16 days, 21:23, 1 user, load average: 9.59, 4.75, 1.92
Tasks: 145 total, 2 running, 143 sleeping, 0 stopped, 0 zombie
Cpu(s): 99.8%us, 0.1%sy, 0.0%ni, 0.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4147888k total, 2493092k used, 1654796k free, 158188k buffers
Swap: 5144568k total, 56k used, 5144512k free, 2013180k cached
```
**解释:**
* top - 09:44:56[当前系统时间],
* 16 days[系统已经运行了16天],
* 1 user[个用户当前登录],
* load average: 9.59, 4.75, 1.92[系统负载,即任务队列的平均长度]
* Tasks: 145 total[总进程数],
* 2 running[正在运行的进程数],
* 143 sleeping[睡眠的进程数],
* 0 stopped[停止的进程数],
* 0 zombie[冻结进程数],
* Cpu(s): 99.8%us[用户空间占用CPU百分比],
* 0.1%sy[内核空间占用CPU百分比],
* 0.0%ni[用户进程空间内改变过优先级的进程占用CPU百分比],
* 0.2%id[空闲CPU百分比], 0.0%wa[等待输入输出的CPU时间百分比],
* 0.0%hi[],
* 0.0%st[],
* Mem: 4147888k total[物理内存总量],
* 2493092k used[使用的物理内存总量],
* 1654796k free[空闲内存总量],
* 158188k buffers[用作内核缓存的内存量]
* Swap:  5144568k total[交换区总量],
* 56k used[使用的交换区总量],
* 5144512k free[空闲交换区总量],
* 2013180k cached[缓冲的交换区总量],
## free
显示内存的使用情况
### 补充说明
**free命令** 可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。
### 语法
```
free(选项)
```
### 选项
```bash
-b # 以Byte为单位显示内存使用情况
-k # 以KB为单位显示内存使用情况
-m # 以MB为单位显示内存使用情况
-g # 以GB为单位显示内存使用情况。
-o # 不显示缓冲区调节列;
-s<间隔秒数> # 持续观察内存使用状况;
-t # 显示内存总和列;
-V # 显示版本信息。
```
### 实例
```bash
free -t # 以总和的形式显示内存的使用信息
free -s 10 # 周期性的查询内存使用信息每10s 执行一次命令
```
显示内存使用情况
```bash
free -m
total used free shared buffers cached
Mem: 2016 1973 42 0 163 1497
-/+ buffers/cache: 312 1703
Swap: 4094 0 4094
```
**第一部分Mem行解释**
```
total内存总数
used已经使用的内存数
free空闲的内存数
shared当前已经废弃不用
buffers Buffer缓存内存数
cached Page缓存内存数。
```
关系total = used + free
**第二部分(-/+ buffers/cache)解释:**
```
(-buffers/cache) used内存数第一部分Mem行中的 used buffers cached
(+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached
```
可见-buffers/cache反映的是被程序实实在在吃掉的内存而+buffers/cache反映的是可以挪用的内存总数。
第三部分是指交换分区。
输出结果的第四行是交换分区SWAP的也就是我们通常所说的虚拟内存。
区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看第一行是从OS的角度来看因为对于OSbuffers/cached 都是属于被使用所以他的可用内存是2098428KB,已用内存是30841684KB,其中包括内核OS使用+Application(X, oracle,etc)使用的+buffers+cached.
第三行所指的是从应用程序角度来看对于应用程序来说buffers/cached 是等于可用的因为buffer/cached是为了提高文件读取的性能当应用程序需在用到内存的时候buffer/cached会很快地被回收。
所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。
如本机情况的可用内存为:
18007156=2098428KB+4545340KB+11363424KB
接下来解释什么时候内存会被交换,以及按什么方交换。
当可用内存少于额定值的时候,就会开会进行交换。如何看额定值:
```bash
cat /proc/meminfo
MemTotal: 16140816 kB
MemFree: 816004 kB
MemAvailable: 2913824 kB
Buffers: 17912 kB
Cached: 2239076 kB
SwapCached: 0 kB
Active: 12774804 kB
Inactive: 1594328 kB
Active(anon): 12085544 kB
Inactive(anon): 94572 kB
Active(file): 689260 kB
Inactive(file): 1499756 kB
Unevictable: 116888 kB
Mlocked: 116888 kB
SwapTotal: 8191996 kB
SwapFree: 8191996 kB
Dirty: 56 kB
Writeback: 0 kB
AnonPages: 12229228 kB
Mapped: 117136 kB
Shmem: 58736 kB
Slab: 395568 kB
SReclaimable: 246700 kB
SUnreclaim: 148868 kB
KernelStack: 30496 kB
PageTables: 165104 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 16262404 kB
Committed_AS: 27698600 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 311072 kB
VmallocChunk: 34350899200 kB
HardwareCorrupted: 0 kB
AnonHugePages: 3104768 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 225536 kB
DirectMap2M: 13279232 kB
DirectMap1G: 5242880 kB
```
交换将通过三个途径来减少系统中使用的物理页面的个数: 
1. 减少缓冲与页面cache的大小
2. 将系统V类型的内存页面交换出去 
3. 换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。
事实上少量地使用swap是不是影响到系统性能的。
那buffers和cached都是缓存两者有什么区别呢
为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式
Buffer Cache和Page Cache。前者针对磁盘块的读写后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。
磁盘的操作有逻辑级文件系统和物理级磁盘块这两种Cache就是分别缓存逻辑和物理级数据的。
Page cache实际上是针对文件系统的是文件的缓存在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘这种映射关系由文件系统来完成。当page cache的数据需要刷新时page cache中的数据交给buffer cache因为Buffer Cache就是缓存磁盘块的。但是这种处理在2.6版本的内核之后就变的很简单了没有真正意义上的cache操作。
Buffer cache是针对磁盘块的缓存也就是在没有文件系统的情况下直接对磁盘进行操作的数据会缓存到buffer cache中例如文件系统的元数据都会缓存到buffer cache中。
简单说来page cache用来缓存文件数据buffer cache用来缓存磁盘数据。在有文件系统的情况下对文件操作那么数据会缓存到page cache如果直接采用dd等工具对磁盘进行读写那么数据会缓存到buffer cache。
所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准.
如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了也是该考虑优化程序或加内存了。
## iotop
用来监视磁盘I/O使用状况的工具
### 补充说明
**iotop命令** 是一个用来监视磁盘I/O使用状况的top类工具。iotop具有与top相似的UI其中包括PID、用户、I/O、进程等相关信息。Linux下的IO统计工具如iostatnmon等大多数是只能统计到per设备的读写情况如果你想知道每个进程是如何使用IO的就比较麻烦使用iotop命令可以很方便的查看。
iotop使用Python语言编写而成要求Python2.5及以上版本和Linux kernel2.6.20及以上版本。iotop提供有源代码及rpm包可从其官方主页下载。
### 安装
**Ubuntu**
```
apt-get install iotop
```
**CentOS**
```
yum install iotop
```
**编译安装**
```
wget http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.gz
tar zxf iotop-0.4.4.tar.gz
python setup.py build
python setup.py install
```
### 语法
```
iotop选项
```
### 选项
```
-o只显示有io操作的进程
-b批量显示无交互主要用作记录到文件。
-n NUM显示NUM次主要用于非交互式模式。
-d SEC间隔SEC秒显示一次。
-p PID监控的进程pid。
-u USER监控的进程用户。
```
**iotop常用快捷键**
1. 左右箭头改变排序方式默认是按IO排序。
2. r改变排序顺序。
3. o只显示有IO输出的进程。
4. p进程/线程的显示方式的切换。
5. a显示累积使用量。
6. q退出。
### 实例
直接执行iotop就可以看到效果了
```
Total DISK read: 0.00 B/s | Total DISK write: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> command
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init [3]
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
5 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1]
7 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/1]
8 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/1]
9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [events/0]
10 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [events/1]
11 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khelper]
2572 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bluetooth]
```