swap内存当然会慢点,所以我们必须想尽办法尽量别用它。即使设置系统参数 vm.swappiness = 0 ,系统也会使用swap,而且测试中发现,swap的使用与Java服务进程没有必然联系,即使不起任何Java进程,swap也会被使用。
所以 vm.swappniess 参数的值只是告诉系统要“积极地”使用swap(设为100),还是“尽量别”使用swap(设为0)。
一般数据库服务器,需要将 vm.swappniess 参数设置成 0,以获得流畅的数据读写。
如果能“确保”系统不使用任何swap,可以使用如下命令真正关闭系统的swap内存:
swapoff -a
当然,需要反复使用如下命令“确保”swap真的不需要使用:
free –mt
原则就是:Mem:total 始终大于 Total:used,你要“确保”这个条件总是成立。通过编写一个脚本在服务器上反复执行一段时间是验证这个原则的办法。
谨慎:关闭swap就会产生严重后果——如果内存消耗完毕,系统很可能崩溃。
配置差不多的服务器,运行的服务相同,效果一个好一个差,那么就可以考虑比较系统上的进程和参数了:
分别执行 ps –ef / sysctl –a ,比较两台服务器上的 进程 / 系统配置,看看有何不同?
另外,ps auxf 可以显示父子进程的树状关系,ps –eLF 可以显示到线程。
检查系统:TCP连接,内存,CPU负载,IO的信息。
检查前端代理服务的访问日志(例如:access.log)可以分析集中访问攻击和请求分布的问题。例如:有的页面出现了问题,用户可能会疯狂的刷页面的URL,导致此URI的请求短时间内暴增。
检查应用服务器标准输出日志(例如:stdout.log)里连接数满等情况。应用服务器并发连接数是有上限的,例如Resin企业版:
……
[05:08:48.687][05:08:48.687] WebApp[ http://localhost:8080] stopping
[05:09:03.375][05:09:03.375] WebApp[ http://localhost:8080] closing with 512 active requests.
……
检查应用服务器标准错误输出日志(例如:stderr.log),在这里面发现的问题应该是很明显的。
检查应用程序的日志(包括业务日志),在这里能否发现问题取决于应用程序的日志架构设计了。如果程序员把异常都“吃”了,那么神仙也查不出问题了——除非查代码。
如果以上都查不出问题,那就上工具。拿JavaEE应用程序来说,JDK自带的jmap可以查内存泄漏、jstack可以查线程阻塞(线程可能被数据库慢查询、频繁打日志造成的IO繁忙、线程对象死锁等问题阻塞)、jstat可以查GC情况(这可以指导你调整JVM启动参数)。
如果还查不出问题,那么可以考虑人肉查代码了……
看网络质量 。使用ping命令,参数 -l 指定包大小,-n 指定包数,-f 洪水发包,看丢包情况,了解网络质量。
看路由信息 。例如:mtr -r --c www.baidu.com 或 traceroute -n www.baidu.com ,一看便知。
看Socket统计信息 。ss -s:
Total: 215 (kernel 216)
TCP: 159 (estab 115, closed 21, orphaned 0, synrecv 0, timewait 9/0), ports 72
Transport Total IP IPv6
* 216 - -
RAW 0 0 0
UDP 11 11 0
TCP 138 138 0
INET 149 149 0
FRAG 0 0 0
看开启的网络端口 。ss -l。
看进程开启的网络端口 。ss –pl。
看抓包 。tcpdump,分析网络抓包是个精细活……
看客户端Http请求回放 。建立服务端:nc –l 8888,然后要求客户端访问:http://(serverhost):8888 。即可在服务端收到客户端的Http请求,分析其请求头信息,可以发现客户端的问题——很多时候服务端是被冤枉的
在首次连接或者闲置一段时间后重新连接总是出现问题。
只在集中访问本站的公司内部网络中出现问题。
定位:局域网内有很多用户同时访问,会出现首次连接服务器超时。
这个问题是由于系统的 tcp_tw_recycle 参数设置为1造成的。执行:sysctl net.ipv4.tcp_tw_recycle=0,即可。
在多CPU服务器上执行 top ,然后输入 1 ,发现不是所有的CPU在扛负载,那么服务很可能会由于负载过高受到影响。
定位:有可能服务器在执行 IRQ Affinity ——绑定特定的硬件中断到特定的CPU上,分散和平衡各个中断到不同的CPU上以获取更大性能的处理能力。
重新启动系统服务 IRQBalance 和应用服务即可。IRQBalance是个用来自动绑定和平衡IRQ 的系统服务。