服务器系统调优之发现问题,还原问题

1.系统状态监控

操作系统调优工具

 

观测cpu

top 、htop、pidstat、mpstat、dstat,perf,vmstat(进程调度器,cpu队列,上下文,系统调用接口)

 

内存:

free ,top ,dstat ,vmstat , slabtop

 

 网络相关

netstat,ss

观测网卡:

nicstat,sar,dtrace,/proc,ping,datat

 

磁盘

dstat,iostat,iotop,blktrace,dtrace

 

应用程序和内核的调用

strace

 

重量级工具:开发一个程序

systemtap, oprofile, perf, valgrind

 

proc :内核的映像,与内核交互的接口

 

CPU时钟周期的分配:(本地)

1、cpu给出到本地内存控制器的内存地址

2、内存控制器设置对内存地址的访问

3、cpu在哪个内存地址执行读取或写入操作

 

cpu调优

1、将进程绑定到某颗cpu上

taskset:

  处理器标示:十六进制掩码

      一个十六进制数字--->4位2进制

  0x00000001,1的二级制 0000 0001 标示第0颗cpu

  0x00000003,3的二进制   0000   0011 标示第0颗和第1颗

      0x00000008,   0000  1000 标示第3颗cpu

      0x00000009,   0000  1001 标示第3颗和第0颗

      0x0000000a,10二进制  0000 1010  标示地3和第1颗

      #taskset -p CPU_MASK PID

     taskset -c 0,4,5 --PID

    taskset 2中启动方式,1将已经运行的进程绑定到某颗cpu上,启动进程让其运行在某颗cpu上

ps axo pid ,psr psr(处理器核心)观察那个进程运行在那个cpu上

 1、已经运行的进程

taskset -pc 1,2 2047

将已经运行的2047进程绑定到第1,2颗cpu上,此时可能由于该进程没有运行,需要激活一下才能重新调度cpu

2、启动进程, 将某个进程启动并绑定cpu

taskset -c 1,2, nginx

  

  

打开文件

在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。
对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象squid、mysql、java
  等单进程处理大量请求的应用来说就有 点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值,
  就会提到“too many files open”的错误提示。如何知道当前进程打开了多少个文件句柄呢?下面一段小脚本可以帮你查看:
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
在系统访问高峰时间以root用户执行上面的脚本,可能出现的结果如下:
# lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more
131 24204
57 24244
57 24231
56 24264
其中第一行是打开的文件句柄数量,第二行是进程号。得到进程号后,我们可以通过ps命令得到进程的详细内容。
ps -aef |grep 24204
mysql 24204 24162 99 16:15 ? 00:24:25 /usr/sbin/mysqld
哦,原来是mysql进程打开最多文件句柄数量。但是他目前只打开了131个文件句柄数量,远远底于系统默认值1024。
但是如果系统并发特别大,尤其是squid服务器,很有可能会超过1024。这时候就必须要调整系统参数,以适应应用变化。
Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数。方法如下,以root用户运行以下命令:
ulimit -HSn 4096
以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,
毕竟打开的文件句柄 数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,
可以修改.bash_profile文件,可以修改 /etc/profile 把上面命令加到最后。

 

分析:

1、

[root@szdz-MASTER ]# lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more

10572 3721
815 13852
178 12238
164 16754

[root@szdz-MASTER apache-tomcat-8.0.22]# ps aux | grep 3721
chaijing 3721 6.4 21.3 6303700 3483492 ? Sl 2016 391:24 /path/to/jdk1.7.0_02/bin/java -Djava.util.logging.config.file=/path/to/apache-tomcat-8.0.22/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms3072m -Xmx3072m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:+UseGCOverheadLimit -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -

 

tomcat 打开的文件描述符到达了10572个

 

2、  tomcat 进程打开的线程数

[root@szdz-MASTER apache-tomcat-8.0.22]# ps -Lf 3721 | wc -l

629

 

3、查看tomcat的tcp状态发现close-wait过多

 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  

TIME_WAIT 861
CLOSE_WAIT 4280
SYN_SENT 1
FIN_WAIT1 29
FIN_WAIT2 66
ESTABLISHED 720

 

[root@szdz-MASTER 2]# ss -tunp | grep 3721 | grep CLOSE-WAIT | wc -l

3699

  

 

posted @ 2016-12-22 14:09  wawahan  阅读(279)  评论(0编辑  收藏  举报