硬件性能调优

0 硬件性能对业务的意义

  在硬件层面,主要有cpu、内存、磁盘、网络这几方面。每个方面都可能成为性能瓶颈,从而影响业务的正常运行。

 

1 cpu

1.1 load average

  系统平均负载,在特定时间间隔内运行队列中的平均进程数量。在以下爆表案例中,平均15m有33个进程在队列中,5m有31个,1m有32个,属于持续化的爆表。

  这是一台4core的机器,所以分担到每个core上,有8个进程在运行或排队。这种情况下,大量进程无法获取cpu资源,导致无法获得运行结果。

  业务基本瘫痪。

  一般来说,load average 会在5以下。

 

1.2 cpu util(利用率)

  top命令下按‘1’,就会显示每个core的使用情况。需要关注的是us(user time),sy(system time),id(idel time)。

  以下是一台业务健康服务器的cpu利用率状态。

   在1.1的爆表案例中,id为0,在zabbix的cpu util图中会这样,红色是sy,蓝色是us,绿色是id。没有绿色,cpu已爆。

  %cpu一栏表示一个进程占用的cpu百分比,100%表示跑满一个core。就是说4core的机器,理论上最高可达400%。但一般来说,跑到100%已经是问题户了。有两种情况,要么业务真的负载太大,需要架构调整,要么进程出现内部错误,需要重启进程或者调整程序内部错误。

  按P可以按cpu降序排列。

 

1.3 进程状态

  在1.1的图中,Tasks一栏显示,一共有201个进程,17个在运行,184个在休眠。

   在以下图中,S一栏表示进程状态,R是running,S是sleeping,一般来说,大部分时间S,小部分时间切换到R。在1.1案例中,R状态是持续性的。下判断,进程内部错误,出现死循环,持续占用cpu不释放,让队列深度飙高。杀进程-->优化程序内部逻辑。

 

2 memery

2.1 系统级内存状态 

  服务器上的内存主要服务于两个方面:支持业务进程的运行,支持系统层面的操作(比如查日志、解包等)。在内存的使用上,如果剩余内存过少,这时有一个比较大的系统操作,或者业务进程并发增多,系统可能会杀进程,所以要预留一部分内存。我定的预留量是800M。

[root@VM ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          7870       7474        395          0         25       2944
-/+ buffers/cache:       4505       3365
Swap:            0          0          0
#total7870M内存,free395M。这是在OS层面的。有(25+2944)M被缓存起来用于了,对程序来说,实际可用的是3365M,这个数是我们需要关注的。

  

2.2 进程级内存状态

top下按M,进程按RES(内存)排序

 

2.3 内存不足系统杀进程

[root@VM_3_2_centos]# dmesg | tail
[437421.447859] [25087]     0 25087   141212    25226   0       0             0 xxx
[437421.447861] [25321]     0 25321    25491      150   0       0             0 YDLive
[437421.447863] [25343]     0 25343     1016       43   1       0             0 mingetty
[437421.447865] [25344]     0 25344     1016       44   0       0             0 mingetty
[437421.447867] [25345]     0 25345     1016       43   0       0             0 mingetty
[437421.447868] [25346]     0 25346     1016       43   0       0             0 mingetty
[437421.447870] [25347]     0 25347     1016       44   0       0             0 mingetty
[437421.447873] [25348]     0 25348     1016       42   0       0             0 mingetty
[437421.447874] Out of memory: Kill process 4830 (xxx) score 1 or sacrifice child
[437421.447878] Killed process 4830, UID 0, (xxx) total-vm:952616kB, anon-rss:21920kB, file-rss:1400kB
#当系统内存不足,会随机杀进程,以保证系统正常运行。
#在系统信息里可以看到相关杀进程信息。

  

3 disk

  这里我们关注3个指标,iops,就是每秒的磁盘io次数。读写速度,就是每秒io的量。等待和磁盘利用率,说明磁盘负载情况。

3.1 iops

  iops -x 60 5(显示详细信息,采样周期60s,次数5)

  下图,就是由于定时任务大量压缩日志而导致读io频率特别高的一个场景。db和log服务器这种依赖磁盘的服务,一般在iops上都会容易出现瓶颈。

  可以用iostat命令来查iops。下图就是采样周期为60s的数据采集,第二块磁盘的读iops为36,写io为24。

 3.2 await和%util

await表示io的等待时间。单位是ms。一般来说,连续30s的显示信息里,平均值不会大于10ms。

util是磁盘利用率,20%表示有1s内有80%的时间磁盘是空闲的。100%表示磁盘繁忙,满负荷运行。

 

如图:服务器上运行redis,由于redis进程会在key change后fork rdb子进程来持久化内存数据,所以写操作会突然出现一个很高的峰值。

但由于rdb子进程是非连续性的,一般几十秒就操作完毕进程消失了,然后await迅速回落。所以当采样周期为1s,会发现虽然await和util很高。但拉长采样周期,就还好。

所以这个数据是健康的。

 

如图:是一台日志集中存储服务器,await是持续大于100ms,util也是持续100%。这样,io就会阻塞并丢失数据。

这个数据说明磁盘不行了,要么换ssd,要么使用多节点分散io压力。

 

3.3 iotop

  iotop -oP(only show processes or threads actually doing I/O, only show processes, not all threads)

  iotop -p pid(监控一个进程)

  如图:是3.2中运行redis的服务器,磁盘写入会在短时间内飙高,但又很快回落。

 

3.4 disk usage

  在3.1的案例中,业务服务器上会产生大量日志,日志信息很庞大。

  如图,在业务高峰期,50GB多到0,只花了3个多小时。然后剩余量为0持续了坑爹的2小时,期间日志写入必然失败。直到日志压缩定时任务启动才开始释放空间。

 

posted @ 2018-05-30 17:47  jabbok  阅读(333)  评论(0编辑  收藏  举报