一、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调优