一、linux系统调优之基础原理及CPU、内存、网络、IO调优
linux 常用性能调优工具
cpu评测工具:top htop pidstat mpstat dstat
内存评测工具:top free dstat slabtop vmstat
网络IO评测工具:netstat tcpdump nicstat dtrace sar proc ping dstat tcpdump ip
磁盘IO评测工具:iostat iotop blktrack dtrace
应用程序&系统评测:strace
设定运行进程的CPU亲和性:taskset
查看某个进程运行在哪个CPU上,以Httpd为例
#ps aux |grep httpd 查看http进程号
#ps axo pid,psr |grep 2047 查看2047运行在哪CPU上
2047 3 // 2047进程运行在第三个CPU上
#watch -n 1 'ps axo pid,psr |grep 2047' 每一秒更新一次,一直观察变化
将2047进程绑定在CPU1上,
#taskset -pc 1 2047
pid 2047's current addinity list:0-3
pid 2047's new affinity list:1
解析:2047进程可以在0-3之间的CPU上,现在绑定在1上。
#taskset -pc 1-2 2047 也可以绑定在1和2上面。
#ps axo pid,psr |grep -E "2302|2303"
二、linux系统调优之内存调优
整个操作系统的运行包含用户空间和内核空间,用户空间比如sh ,httpd, nginx 等占用的是User space Processes, 而内核空间如buddy alocator kswapd bdflush等 通过MMU转换成物理内存的空间
三、linux系统调优之网络调优
网络优化参数: 目录 /proc/sys
net.ipv4.tcp_max_tw_buckets
timewait的数量,默认为8192;net.ipv4.ip_local_port_range = 1024 65000
允许系统打开的端口范围,前而为下限,后面的数字为上限;默认为“3276861000”;
注意:此可用范围决定了最后timewait状态的连接的数量;下面的两项可有效降低tw状态连接的数量;
net.ipv4.tcp_tw_recycle = {0|1}
是否启用timewait快速回收;注意:开启此功能在NAT环境下可能会出现严重的问题:因为TCP有一种行为,它可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存中的时间戳,即被视为无效并丢弃相应的请求报文;Linux是否启用这种行为取决于tcp_timestamp和tcp_tw_recycle,而前一个参数默认是启用的,所以启用后面的参数就会激活此功能;
因此,如果是NAT环境,安全起见,应该禁用tcp_tw_recycle。另一种解决方案:把tcp_timestamps设置为0,tcp_tw_recycle设置为1并不会如想象中奏效,因为一旦关闭了tcp_timestamps,那么即便打开了tcp_tw_recycle,后面的参数也没有效果。此时降低net.ipv4.tcp_max_tw_buckets的值就可以显著降低tw连接的数量了。
net.ipv4.tcp_tw_reuse = {0|1}
是否开启tw重用,即是否允许将TIME-WAIT sockets 用于新的TCP连接;
net.ipv4.tcp_syncookies = {0|1}
是否开启SYN Cookies,即当SYN等待队列溢出时,是否启用cookies功能;
net.ipv4.tcp_timestamps = 0
tcp报文时间戳,关闭时可以避免序列号的卷绕,如上所述;
net.ipv4.tcp_max_syn_backlog = 262144
保存的那些尚未收到客户端确认信息的连接请求的最大值;默认为128,可增大此值;
net.ipv4.tcp_synack_retries = #
为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK,这也即所谓的三次握手中的第二次;这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量;繁忙的服务器上建议设置为0或者1;
net.ipv4.tcp_syn_retries = #
在内核放弃建立连接之前发送SYN包的数量;繁忙的服务器上建议设置为0或者1;
net.ipv4.tcp_max_orphans = 262144
系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上;如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息;
这个限制仅仅是为了防止简单的DoS ***,不能过分依靠它或者人为地减小这个值,如果需要修改,在确保有足够内存可用的前提下,应该增大此值;
net.ipv4.tcp_fin_timeout = 5
如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间;缺省值是60秒。
然而,对端可能会出错或意外宕机并永远不关闭连接。即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2 的危险性比FIN-WAIT-1要小,因为每个连接最多只能消耗1.5K内存,但是它们的生存期长些;
net.ipv4.tcp_keepalive_time = 30
当keepalive起用的时候,TCP发送keepalive消息的频度,默认是是2小时;
net.core.rmem_max=8388608
定义内核用于所有类型的连接的最大接收缓冲大小;
net.core.rmem_default=65536
定义内核用于所有类型的连接的默认接收缓冲大小;
net.core.wmem_max=8388608
定义内核用于所有类型的连接的最大发送缓冲大小;
net.core.wmem_default=65536
定义内核用于所有类型的连接的默认发送缓冲大小;
net.ipv4.tcp_mem='8388608 8388608 8388608'
定义TCP协议栈使用的内存空间;分别为最小值,默认值和最大值;
net.ipv4.tcp_rmem='4096 87380 8388608'
定义TCP协议栈用于接收缓冲的内存空间;第一个值为最小值,即便当前主机内存空间吃紧,也得保证tcp协议栈至少有此大小的空间可用;第二个值为默认值,它会覆盖net.core.rmem_default中为所有协议定义的接收缓冲的大小;第三值为最大值,即能用于tcp接收缓冲的最大内存空间;
net.ipv4.tcp_wmem='4096 65536 8388608'
定义TCP协议栈用于发送缓冲的内存空间;
京东内核参数16G
kernel.shmall=4294967296
net.core.somaxconn=32768
net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 100
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets=20000
四、常用的linux系统监控工具(命令)
sar tsar top htop dstat glances vmstat netperf iftop ss lsof iostat
sar:
tsar 淘宝研发的工具
top:
htop:
dstat :
glances:类似top 需要epel源 直接yum安装
vmstat:
netperf:网络性能评估的工具,用的不多
iptop:网络监控工具
ss:
lsof:列出某个进程打开的所有文件信息
lsof /path/to/somefile
lsof -c string ,如 lsof -c httpd
lsof -p pid 查看某指定进程打开的文件
lsof -u username 显示指定用户的进程打开的文件
losf +d /dir/ 显示指定目录下被进程打开的文件
lsof -N 列出所有NFS网络文件系统文件
lsof -d FD 显示指定文件描述符的相关进程
lsof -a 可组合多个条件 ,如 lsof -a -c httpd -u apache
lsof -i 用以显示符合条件的进程情况 lsof -i :80
lsof -n 不反解ip至hostname ,如 lsof -i :80 -n
命令解析:
command:进程名称 pid:进程标识符 user:进程所有者 FD:文件描述符 TYPE:文件类型 DEVICE:指定磁盘名称 SIZE:文件大写小 NODE:索引节点 NAME:打开文件的确切名称
四、linux系统调优之内存和IO调优