服务器系统调优之发现问题,还原问题
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、已经运行的进程
1 | taskset -pc 1,2 2047 |
将已经运行的2047进程绑定到第1,2颗cpu上,此时可能由于该进程没有运行,需要激活一下才能重新调度cpu
2、启动进程, 将某个进程启动并绑定cpu
1 | 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、
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 进程打开的线程数
1 | [root@szdz-MASTER apache-tomcat-8.0.22] # ps -Lf 3721 | wc -l |
629
3、查看tomcat的tcp状态发现close-wait过多
1 | 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
1 | [root@szdz-MASTER 2] # ss -tunp | grep 3721 | grep CLOSE-WAIT | wc -l |
3699
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· Supergateway:MCP服务器的远程调试与集成工具
· C# 13 中的新增功能实操