linux 监控命令与调优方法
文章的最前面提出以下几个问题:
- 通过哪些指标数据及命令来判断当前系统磁盘IO、CPU、内存是否存问题?
- 如何对这些问题进行优化?
1. 内存交换区
1.1 内存交换对于读操作
通过将信息从磁盘上仅读入一次并将其存于内存中,除了第一次读以外,可以加快所有其它读的速度。这叫作磁盘缓冲(Disk Buffering),被用作此目的的内存称为高速缓冲(Buffer Cache)。但是,由于内存是一种有限而又不充足的资源,高速缓冲不可能做的很大(它不可能包容要用到的所有数据)。当缓冲充满了数据时,其中最长时间不用的数据将被舍弃以腾出内存空间用于新的数据。
1.2 内存交换对于写操作
对写磁盘操作来说磁盘缓冲技术同样有效。一方面,被写入磁盘的数据常常会很快地又被读出(例如,原代码文件被保存到一个文件中,又被编译器读入),所以将要被写的数据放入缓冲中是个好主意。另一方面,通过将数据放入缓冲中,而不是将其立刻写入磁盘,程序可以加快运行的速度。以后,写的操作可以在后台完成,而不会拖延程序的执行。
1.3 发生内存交换对性能的影响
当操作系统因为没有足够的内存而将一些虚拟内存写到磁盘就会发生内存交换,内存交换对mysql性能影响是很糟糕的,他破坏缓存在内存的目的,并且相对于“使用很小内存做缓存”,使用交换区的性能更差。因为内存交换对用户进程不可见,mysql并不知道数据实际上已经移动到磁盘,还以为在内存中,结果会导致很差的性能。
在linux上使用vmstat来监控内存交换,查看si和so列报告的内存交换I/O活动,我们喜欢si和so列的值为0,并且一定要保证他们低于每秒10个块
1.4 控制内存交换的办法
操作系统通常允许对虚拟内存和I/O进行一些控制,最近本的方法是修改 /proc/sys/vm/swappiness
为一个很小的值,例如0或1.这告诉内核除非虚拟内存完全满了,否则不要使用交换区(swappiness=0表示最大限度使用物理内存,然后才是swap)
$ cat /proc/sys/vm/swappiness
60
这个值默认是60,对于服务器而言这是个很糟糕的默认值,这个值只对笔记本适用,服务器应该设置为0
$echo 0 > /proc/sys/vm/swappiness
另外一个选项是修改存储引擎怎么读取和写入数据。例如使用 innodb_flush_method=0_DIRECT
,减轻I/O压力,direct I/O并不缓存,因此操作系统并不能把mysql视为增加文件缓存的原因。这个参数只对innodb有效
2. Top命令
名词解释:
虚拟内存VIRT:linux系统把内存空间扩展到磁盘空间,物理内存(RAM)和交换区(SWAP,磁盘空间的一部分)组合在一起作为虚拟内存,为linux提供了一个连贯的虚拟内存空间。用户进程在linux操作系统中,并不是直接操作物理内存地址的,而是以页为单位通过虚拟地址映射到物理地址来使用内存的。内存管理器不止管理物理内存还管理交换空间,页默认的大小一般为4K。
物理内存RES:就是我们通常所说的内存(RAM)
交换区SWAP:属于内存管理器管理的,当内存不足,需要将不常用的页换出到磁盘上的。交换到磁盘的页,在使用时会首先被page in到物理内存,如果此时没有足够的物理内存来容纳这些页,那么他们又要被立马page out。如此往复,交换区中可能没有足够的空间来存储这些页,这时可能造成系统死机,服务异常。
2.1 Top命令说明:
第一行表示的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。
第二行显示的是所有启动的进程、目前运行的、挂起(Sleeping)的和无用(Zombie)的进程。
第三行显示的是目前CPU的使用情况,包括系统占用的比例、用户使用比例、闲置(Idle)比例。
第四行显示物理内存的使用情况,包括总的可以使用的内存、已用内存、空闲内存、缓冲区占用的内存。
第五行显示交换分区使用情况,包括总的交换分区、使用的、空闲的和用于高速缓存的大小。
第六行显示的项目最多,下面列出了详细解释。
栏目 | 说明 |
---|---|
PID(Process ID) | 进程标示号 |
USER | 进程所有者的用户名 |
PR | 进程的优先级别 |
NI | 进程的优先级别数值 |
VIRT | 进程占用的虚拟内存值 |
RES | 进程占用的物理内存值 |
SHR | 进程使用的共享内存值 |
S | 进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。D 不可中断休眠,通常是 IO 操作所处的状态 |
%CPU | 该进程占用的CPU使用率 |
%MEM | 该进程占用的物理内存和总内存的百分比 |
TIME+ | 该进程启动后占用的总的CPU时间 |
Command | 进程启动的启动命令名称,如果这一行显示不下,进程会有一个完整的命令行 |
2.2 Top快捷启动
top命令使用过程中,还可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的:
M:根据使用内存大小进行排序。
P:根据CPU使用大小进行排序。
U : 如果想查看指定用户的情况,在终端中按“U”键,然后输入用户名,系统就会切换为指定用户的进程运行界面。
q:退出top命令。
c : 显示完整的command命令,这个快捷键很有用
h : top快捷方式说明
2.3 load的说明
load average: 8.13, 5.90, 4.94
load average 命令输出的最后内容表示在过去的1、5、15分钟内运行队列中的平均进程数量。
一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的,如果每个CPU的任务数大于5,那么就表示这台机器的性能有严重问题。对于上面的例子来说,假设系统有两个CPU,那么其每个CPU的当前任务数为:8.13/2=4.065。这表示该系统的性能是可以接受的。
那么这又带来了一个问题:
2.3.1 我们以哪个数字为准?一分钟?五分钟?还是十五分钟?
其实对于这些数字我们已经谈论了很多,我认为你应该着眼于五分钟或者十五分钟的平均数 值。坦白讲,如果前一分钟的负载情况是 1.00,那么仍可以说明认定服务器情况还是正常的。 但是如果十五分钟的数值仍然保持在 1.00,那么就值得注意了(根据我的经验,这时候你应该增加的处理器数量了)。
2.3.2 我如何得知我的系统装备了多少核心的处理器?
获取你系统上的每个处理器的信息。如果你只想得到数字,那么就使用下面的命令:
grep ‘model name’ /proc/cpuinfo | wc -l
3. Vmstat 命令
3.1 Vmstat命令说明
1)procs 显示进程相关信息
r :表示运行和等待cpu时间片的进程数,如果长期大于服务器cpu的个数,则说明cpu不够用了;
b :表示等待资源的进程数,比如等待I/O, 内存等,这列的值如果长时间大于1,则需要你关注一下了;
2)memory 内存相关信息
swpd :表示切换到交换分区中的内存数量 ;
free :当前空闲的内存数量;
buff :缓冲大小,(即将写入磁盘的);
cache :缓存大小,(从磁盘中读取的);
3)swap 内存交换情况
si :由内存进入交换区的数量;
so :由交换区进入内存的数量;
4)io 磁盘使用情况
bi :从块设备读取数据的量(读磁盘);
bo: 从块设备写入数据的量(写磁盘);
5)system 显示采集间隔内发生的中断次数
in :表示在某一时间间隔中观测到的每秒设备中断数;
cs :表示每秒产生的上下文切换次数;
6)CPU 显示cpu的使用状态
us :显示了用户下所花费 cpu 时间的百分比;
sy :显示系统花费cpu时间百分比;
id :表示cpu处于空闲状态的时间百分比;
wa :表示I/O等待所占用cpu时间百分比;
st :表示被偷走的cpu所占百分比(一般都为0,不用关注);
3.2 Vmstat需要注意的列
以上所介绍的各个参数中,需要关注r列,b列,si列,so列和wa列,三列代表的含义在上边说得已经很清楚。
IO部分的bi以及bo也是我要经常参考的对象。如果磁盘io压力很大时,这两列的数值会比较高。
si, so两列的数值比较高(并且一定要保证他们低于每秒10个块,这两列反应了页面交换),并且在不断变化时,说明内存不够了,内存中的数据频繁交换到交换分区中,这往往对系统性能影响极大。
当vmstat命令输出中的r队列数量长时间超过2倍系统的CPU核数时,系统的cpu资源肯定会紧张。
当vmstat显示很多处理器在非中断休眠(b列)状态,并且在%wa这一列的值很高,说明cpu花费大量时间在等待I/O请求完成。
3.3 CPU密集型的服务器
vmstat输出通常在us列会有一个很高的值,也可能在sy列有很高的值,表示cpu利用率,超过20%就足以令人不安了。大部分情况下也会有进程队列在排队(r列报告的)
4. iostat命令
4.1 iostat命令说明
await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctime:表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。
%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
4.2 I/O密集型
工作负载下,cpu花费大量时间在等待I/O请求完成。这意味着vmstat会显示很多处理器在非中断休眠(b列)状态,并且在%wa这一列的值很高
4.3 计算设备服务的并发请求数
concurrency=(r/s+w/s)*(svctm/1000)
如果concurrnecy=9.6,来自于一个10快盘的raid10卷,则操作系统对这个设备的并行请求运行得相当好,如果concurrency=1,并发公式展示了这个设备每秒只处理一个请求,当%util接近100%,,说明正在处理串行请求。
5. free命令
Used(-/+ buffers/cache) = Used(Mem) - buffers(Mem) - Cached(Mem)
Free(-/+ buffers/cache)= Free(Mem)+buffers(Mem)+Cached(Mem)
对用户来说,可用的内存是free+buffers+cache,也就是 -/+ buffers/cache 这一行的free列。
buffer和cache的区别?
cache :针对文件系统,单位是页,用来缓存文件数据,比如:打开的文件和程序。
buffer:针对块设备,直接对磁盘进行操作的数据会缓存到buffer cache中,比如,文件系统的元数据,文件目录有什么内容,文件属性,文件权限。
简单的说:在有文件系统的情况下,对文件操作,那么数据会缓存到page cache;
如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。
一般来说对于4G 以下的物理内存,配置2倍的swap,4G 以上配置1倍
6. lsof命令
6.1 监控文件系统
lsof +D /var/log
这在 umount 某个文件系统失败时非常有用(通常会报该 FS is busy)
6.2 监控进程
指定进程号,可以查看该进程打开的文件:
lsof -p 进程号
监控网络
lsof -i :3306
7. Sar命令
sar -u 检查cpu负载沉重程度
sar -d 查找I/O问题
总结
1. IO瓶颈
1.1 如何定位IO问题
iostat
iotop
vmstat
1.2 IO调整办法
根据oracle数据库物理文件增长情况:
Disk space consumption area | Expected growth |
---|---|
Oracle archived REDO log files | High |
Oracle data files | High |
Oracle index files | High |
Oracle control files | Medium |
Oracle initialization files | Small |
Oracle archived REDO log files增长快,说明redo log写入很频繁。从实际大数据量和高性能OLTP应用系统性能测试发现,磁阵IO是限制系统性能的瓶颈,因此降低IO是oracle数据库优化的关键,结合oracle数据库物理存储架构图、数据库物理文件增长情况和实际测试发现,给磁阵IO带来很大负荷的是redo log文件、数据文件、索引文件的读写三个方面,并且当数据量、性能和持续压力时间都达到一定的量时,这三者产生的IO负荷相当,因此降低磁盘IO的最终目标也就是降低这三类文件的IO,通过将oracle的redo log文件、数据文件、索引文件都建立到内存盘上的实际测试结果表明,采用这种几乎零IO的模式很大程度的提高了oracle的性能,
基于以上分析,可以对oracle数据库的IO做以下优化:
- 在选择的列上面创建索引。如果索引上读取数据消耗的I/O数比从表上读取少,则可以考虑使用此方法。
- 重建索引。主要针对碎片比较多 、索引层数较高、cluster因子较大的索引,重建时建议将索引的PCTFREE参数设置为0,这样一个索引块中就可以保存更多的数据行信息。
- 删除无效索引。过多的无效索引不仅容易引起CBO优化器选择错误,从而导致执行计划变差 而且会降低DML操作效率。
- 重组表。重组表针对碎片严重、行迁移和行链接较严重的表。表重组之后,oracle一次I/O操作可以读取更多的数据。
- 以内存换取I/O。适当加大BUFFER CACHE。如果内存足够,可以对小的热表执行KEEP BUFFER CACHE。
- 将不重要的表设置为NOLOGGING模式。需要注意的是:由于NO LOGGING模式的操作记录不会完全记录在redolog中 因此不能用物理备份恢复技术来恢复NOLOGGING的数据。
- 对于其值不断增加的表(如日志表)因为这些表很少更新,所以最好设置一个非常低的PCTFREE(甚至是可以为0)从而节省存储空间。
- 分散热块中的数据,避免I/O争用。最常见的优化手段是使用:hash 分区、hash cluster table、反转键索引、加大表PCTFREE参数。
- 固态硬盘存储redo log,提高redo log的写入速度,从实际运用的角度看,由于内存盘的易失性,把redo log文件建立在内存盘上是不安全的,再考察redo log文件具有大小稳定,一般在2到3个G之间的特性,因此把redo log文件建立在固态硬盘上是个不错的选择。
- 由于内存足够大,因此将临时表空间建立在内存盘上,对于统计、大数据量查询、大数据量sql运算(比如:group by、sum等)的操作,需要大量临时表空间存储临时数据,这些临时数据就直接存储到内存上了,消除了oracle的大读取和大运算产生的临时IO。
2. CPU瓶颈
2.1 如何定位CPU问题
使用top命令分析,在top界面输入大写的P,可以按照cpu占比从大到小排序
ps aux | sort -k3nr | head -n 10 可以看出top 10 CPU占用进程
vmstat 1 5
sar 1 10
sar -B
strace -c -p 进程号
2.2 CPU调整办法
- 调整应用
- 清理或迁移不必要的进程
- 增加cpu
3. 内存瓶颈
3.1 如何定位内存问题:
- 启动进程后空闲内存明显降低
这时需要检查是否该进程启动耗用太多内存 - 持续较久的内存换入换出
包括pgpgin/pgpgout或swapin/swapout指标 - 主缺页中断
缺页中断包含住缺页中断和次缺页中断。在内存中可以找到页时是次缺页中断,在内存中找不到页需要到磁盘去找时就是主缺页中断。主缺页中断需要访问磁盘,因此访问速度下降明显。使用sar -B 查看majglt/s列
ps aux | sort -k3nr | head -n 10
pmap -xq 进程号
3.2 内存调整办法
- 调整应用内存分配(比如调整sga等)
- 清理或迁移不必要进程
- 增加内存容量
- 内存参数调整
比如:数据库一般有自己管理的内存sga,是否有必要把大块文件系统缓存在buff和cache里面呢?没有必要,这样我们能释放很多内存了
参考内容
《高性能MySQL》