渐进式性能监测案例

下面的案例中一个终端用户报告了一个web用户接口需要20分钟才能处理完本该15分钟就能搞定的问题。
系统配置:
* RHEL3.7
* Dell 1850双核处理器,2G内存,75G 15K硬盘
* 标准LAMP架构
性能分析流程:
1.vmstat判断基本信息
# vmstat 1 10 
procs                      memory      swap          io     system         cpu 
 r  b   swpd   free   buff   cache     si   so    bi    bo   in    cs  us  sy id wa 
 1  0 249844  19144  18532 1221212    0    0     7     3   22   17  25  8 17  18 
 0  1 249844  17828  18528 1222696    0    0 40448     8  1384  1138 13  7 65  14 
 0  1 249844  18004  18528 1222756    0    0 13568     4   623   534  3  4 56  37 
 2  0 249844  17840  18528 1223200    0    0 35200     0  1285  1017 17  7 56  20 
 1  0 249844  22488  18528 1218608    0    0 38656     0  1294  1034 17  7 58  18 
 0  1 249844  21228  18544 1219908    0    0 13696   484  609   559  5  3 54  38 
 0  1 249844  17752  18544 1223376    0    0 36224     4  1469  1035 10  6 67  17 
 1  1 249844  17856  18544 1208520    0    0 28724     0  950   941  33 12 49  7 
 1  0 249844  17748  18544 1222468    0    0 40968     8  1266  1164 17  9 59  16 
 1  0 249844  17912  18544 1222572    0    0 41344    12  1237  1080 13  8 65  13 
关键点:
* si,so为0,swpd,free稳定,说明内存够用;
* idle保持在50%左右,说明CPU也没问题;
* cs,bo值都很高;
* wa保持在20%左右。
 
2.使用iostat判断数据读取请求来自哪里
 
关键点:
* 唯一活动的分区时/dev/sda3;
* sda3上有1200左右的IOPS(r/s);
* rkB/s为0,这点与vmstat观察到的高IO等待相符;
* 高IOPS与vmstat观察到的高cs值相符。
 
3.使用top命令判定活跃度最高的应用
# top -d 1 
 11:46:11  up 3 days, 19:13,  1 user,  load average: 1.72, 1.87, 1.80 
176 processes: 174 sleeping, 2 running, 0 zombie, 0 stopped 
CPU states:  cpu    user    nice  system    irq  softirq  iowait    idle 
           total   12.8%    0.0%    4.6%   0.2%     0.2%   18.7%   63.2% 
           cpu00   23.3%    0.0%    7.7%   0.0%     0.0%   36.8%   32.0% 
           cpu01   28.4%    0.0%   10.7%   0.0%     0.0%   38.2%   22.5% 
           cpu02    0.0%    0.0%    0.0%   0.9%     0.9%    0.0%   98.0% 
           cpu03    0.0%    0.0%    0.0%   0.0%     0.0%    0.0%  100.0% 
Mem:  2055244k av, 2032692k used,   22552k free,  0k shrd,   18256k buff 
                   1216212k actv,  513216k in_d,   25520k in_c 
Swap: 4192956k av,  249844k used, 3943112k free                 1218304k cached  
 
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                          
14939 mysql     25   0  379M 224M 1117 R  38.2 25.7% 15:17.78 mysqld    
 4023 root      15   0  2120  972  784 R  2.0  0.3   0:00.06 top     
    1 root      15   0  2008  688  592 S  0.0  0.2   0:01.30 init                
    2 root      34  19     0    0    0 S  0.0  0.0   0:22.59 ksoftirqd/0         
    3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0          
4 root      10  -5     0    0    0 S  0.0  0.0   0:00.05 events/0    
 
关键点:
* mysql进程使用系统资源最多;
* mysql的大量请求导致IO等待。
4.使用strace命令观察读取请求的来路
# strace -p 14939 
 
Process 14939 attached - interrupt to quit 
read(29, "\3\1\237\1\366\337\1\222%\4\2\0\0\0\0\0012P/d", 20) = 20 
read(29, "ata1/strongmail/log/strongmail-d"..., 399) = 399 
_llseek(29, 2877621036, [2877621036], SEEK_SET) = 0 
read(29, "\1\1\241\366\337\1\223%\4\2\0\0\0\0\0012P/da", 20) = 20 
read(29, "ta1/strongmail/log/strongmail-de"..., 400) = 400 
_llseek(29, 2877621456, [2877621456], SEEK_SET) = 0 
read(29, "\1\1\235\366\337\1\224%\4\2\0\0\0\0\0012P/da", 20) = 20 
read(29, "ta1/strongmail/log/strongmail-de"..., 396) = 396 
_llseek(29, 2877621872, [2877621872], SEEK_SET) = 0 
read(29, "\1\1\245\366\337\1\225%\4\2\0\0\0\0\0012P/da", 20) = 20 
read(29, "ta1/strongmail/log/strongmail-de"..., 404) = 404 
_llseek(29, 2877622296, [2877622296], SEEK_SET) = 0 
read(29, "\3\1\236\2\366\337\1\226%\4\2\0\0\0\0\0012P/d", 20) = 20
关键点:
* 数据表明mysql在执行大量的随机IO;
* 大量的读取请求来自一个特别的查询。
 
5.使用mysqladmin命令检查查询耗时最长的语句
# ./mysqladmin -pstrongmail processlist 
 
+----+------+-----------+------------+---------+------+----------+---------------------------------------- 
| Id | User | Host      | db         | Command | Time | State    | Info                                                 
+----+------+-----------+------------+---------+------+----------+---------------------------------------- 
| 1  | root | localhost | strongmail | Sleep   | 10   |          |                                                      
| 2  | root | localhost | strongmail | Sleep   | 8    |          |                                                      
| 3  | root | localhost | root       | Query   | 94   | Updating | update `failures` set 
ùpdate_datasource`='Y' where database_id='32' and  update_datasource='N' and  | 
| 14 | root | localhost |            | Query   | 0    |          | show processlist   
关键点:
* mysql不断地执行update查询至failures表;
* 为了实施update,数据库必须对该表进行索引。
* 就是mysql的这个动作导致了系统性能的下降。
   

 

posted on 2017-07-13 14:17  JasonKwok  阅读(141)  评论(0)    收藏  举报

导航