Centos7学习笔记(七)— 性能调优一
1、nice,renice 调整进程nice值,让进程使用更多的CPU
nice值 #范围, -20 ~ 19 越小优先级越高 普通用户0-19
作用:以什么优先级运行进程 。默认优先级是0
语法: nice -n 优先级数字 命令
例:
# nice -n -5 vim a.txt # vim进程以-5级别运行
查看:
ps -axu | grep a.txt
[root@xuegod63 ~]# ps -axu | grep a.txt
root 24318 0.0 0.2 143624 3280 pts/4 S+ 17:00 0:00 vim b.txt
[root@xuegod63 ~]# top -p 24318
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24129 root 15 -5 140m 3336 2200 S 0.0 0.3 0:00.08 vim
renice #修改正在运行的进程的优先级
#renice -n 5 PID #修改进程优先级
例:
#renice -n 5 24318
[root@xuegod63 ~]# top -p 24318
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24129 root 15 5 140m 3336 2200 S 0.0 0.3 0:00.08 vim
2、taskset
语法: taskset -c N 命令
taskset 作用:在多核情况下,可以认为指定一个进程在哪颗CPU上执行程序,减少进程在不同CPU之前切换的开销
例1:本机是4核CPU ,指定vim命令在第一个CPU上运行
[root@xuegod63 ~]# taskset -c 0 vim a.txt #1号CPU ID是0
[root@xuegod63 ~]# ps -axu | grep vim
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2614 1.3 0.2 143696 3332 pts/0 S+ 18:39 0:00 vim a.txt
[root@xuegod63 ~]# taskset -p 2614 # -p 要查看的进程ID
pid 2614's current affinity mask: 1 #CPU亲和力掩码,1代表第一个CPU核心
例2:查sshd进程运行在哪几个CPU上
[root@xuegod63 ~]# ps -axu | grep sshd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2030 0.0 0.0 64068 1140 ? Ss 18:26 0:00 /usr/sbin/sshd
[root@xuegod63 ~]# taskset -p 2030
pid 2030's current affinity mask: f #说明sshd在4颗CPU上随机进行切换
说明:
Cpu ID 号码,对应的16进制数为:
CPU ID: 7 6 5 4 3 2 1 0
对应的10数为: 128 64 32 16 8 4 2 1
pid 2030's current affinity mask: f的值为cpu ID 16进制的值的和(1+2+4+8=f),转换成二进制为:1111
这个说明了(pid=2030)的这个sshd进程工作在cpu ID 分别为0,1,2,3这个四个cpu上面的切换。
例:指定vim c.txt 程序运行在第2和第4个CPU上
[root@xuegod63 ~]# taskset -pc 1,3 vim b.txt
[root@xuegod63 ~]# ps -axu | grep vim
root 6314 1.5 0.2 143612 3280 pts/1 S+ 14:41 0:00 vim b.txt
root 6317 0.0 0.0 103300 848 pts/2 S+ 14:41 0:00 grep vim
[root@xuegod63 ~]# taskset -p 6314
pid 6314's current affinity mask: a
3、vmstat
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:
root@ubuntu:~# vmstat 2 1 root@ubuntu:~# vmstat 2 1 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0
2表示每个两秒采集一次服务器状态,1表示只采集一次。
r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b 表示阻塞的进程,这个不多说,进程阻塞, 大家懂的。
swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in 每秒CPU的中断次数,包括时间中断
cs (context switches)每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt 等待IO CPU时间。
4、内存优化
主要是清理buffer和cache
说一下buffer和cache的区别
buffer inode节点索引缓存 缓存(缓冲) 通常意义上说,是写时用,先写入内存
cache block 块/页缓存 快取, 读时用,先读入到内存
为了理解这一点,可以用dd命令生成一个2G的文件,用free -m查看cache的变化(centos6下)
[root@study6 ~]# dd if=/dev/zero of=/home/test bs=4096 count=500000 500000+0 records in 500000+0 records out 2048000000 bytes (2.0 GB) copied, 2.10772 s, 972 MB/s
[root@study6 ~]# free -h #《========dd执行前(已清理buffer和cache) total used free shared buffers cached Mem: 979M 123M 856M 192K 812K 6.4M -/+ buffers/cache: 116M 863M Swap: 2.0G 0B 2.0G [root@study6 ~]# free -h #《=======dd执行后 total used free shared buffers cached Mem: 979M 909M 70M 192K 604K 771M -/+ buffers/cache: 137M 841M Swap: 2.0G 0B 2.0G
因为是生成大文件,需要占用大量block,那么cache必然急速上升(6.4m变到771m)。这个生成文件的过程,跟常规比如nginx提供web服务,需要从磁盘读取大量不同的文件相反,此时,cache值也是升高的。
相反,用 find /来查找根目录下所有文件,是一个读取的过程,可以观测buffer值的变化
[root@study6 ~]# free -h total used free shared buffers cached Mem: 979M 121M 857M 192K 56K 6.5M #《========== find / 执行前,buffers是56K -/+ buffers/cache: 115M 864M Swap: 2.0G 0B 2.0G [root@study6 ~]# free -h total used free shared buffers cached #《============ find /执行后,buffers是16M Mem: 979M 153M 826M 192K 16M 7.2M -/+ buffers/cache: 129M 849M Swap: 2.0G 0B 2.0G
下面说一下 drop_caches:
清空 pagecache:
sync
echo 1 > /proc/sys/vm/drop_caches
清空 dentries 和 inodes:
sync
echo 2 > /proc/sys/vm/drop_caches
清空所有缓存(pagecache、dentries 和 inodes):
sync
echo 3 > /proc/sys/vm/drop_caches
5、ulimit
ulimit为shell内建指令,可用来控制shell执行程序的资源。(注意:ulimit的设定只对当前shell生效)
语法
ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]
参数:
-a 显示目前资源限制的设定。
-c <core文件上限> 设定core文件的最大值,单位为区块。
-d <数据节区大小> 程序数据节区的最大值,单位为KB。
-f <文件大小> shell所能建立的最大文件,单位为区块。
-H 设定资源的硬性限制,也就是管理员所设下的限制。
-m <内存大小> 指定可使用内存的上限,单位为KB。
-n <文件数目> 指定同一时间最多可开启的文件数。
-p <缓冲区大小> 指定管道缓冲区的大小,单位512字节。
-s <堆叠大小> 指定堆叠的上限,单位为KB。
-S 设定资源的弹性限制。
-t <CPU时间> 指定CPU使用时间的上限,单位为秒。
-u <程序数目> 用户最多可开启的程序数目。
-v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB。
查看系统用户所有限制值:ulimit -a
[root@studylinux ~]#ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 15643 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 15643 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
设置用户open files(用户可以打开文件的最大数目):ulimit -n 4096。执行该命令非root用户只能设置到4096。想要设置到8192需要sudo权限或者root用户。
查看当前系统打开的文件数量: lsof | wc -l
查看当前进程的打开文件数量:lsof -p pid | wc -l (lsof -p 1234 | wc -l )
查看当前进程的最大可以打开的文件数:cat /proc/PID/limits (如果通过ulimit -n 设置或者修改/etc/security/limits.conf,看看进程是否生效)
查看系统总限制打开文件的最大数量:cat /proc/sys/fs/file-max
lsof只能以root权限执行。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
ulimit要想永久生效,需要针对/etc/security/limits.conf文件进行修改,并系统重启。
/etc/security/limits.conf文件中,已经明确了其内容格式的写法。以下是对domain、type、resource具体值的解释:
domain:username|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。
type:有 soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的最大值不能超过hard的值。用 – 就表明同时设置了 soft 和 hard 的值。
resource:
core – 限制内核文件的大小
date – 最大数据大小
fsize – 最大文件大小
memlock – 最大锁定内存地址空间
nofile – 打开文件的最大数目
rss – 最大持久设置大小
stack – 最大栈大小
cpu – 以分钟为单位的最多 CPU 时间
noproc – 进程的最大数目(系统的最大进程数)
as – 地址空间限制
maxlogins – 此用户允许登录的最大数目
要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。
查看 /etc/pam.d/login 文件中有:
session required /lib/security/pam_limits.so
需要注意一点:/etc/security/limits.d下也有noproc最大进参数的限制(文件20-nproc.conf(CentOS7)或者90-nproc.conf(Centos6)):
即 /etc/security/limits.d/下的文件覆盖了/etc/security/limits.conf设置的值
* soft nproc 4096(这个是CentOS7默认C6是1024)
对于文件描述符的配置,需要注意以下几点:
所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max
单个进程打开的文件描述符数不能超过user limit中nofile的soft limit
nofile的soft limit不能超过其hard limit
nofile的hard limit不能超过/proc/sys/fs/nr_open
6、bonding
CentOS7下创建网卡绑定bond(主备模式)
A)nmcli connection delete eth0
nmcli connection delete eth1 #《========需要删除被绑定网卡的配置信息
B)nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode active-backup primary eth0 ipv4.addresses 192.168.205.129/24 #《======添加bond网卡类型,并指定ifname、con-name、miimon以及mode类型
说明:ifname ——指定bond的内核名称
con-name——指定bond的链接名称
miimon——指定MII链路监控频率,单位是毫秒(ms)。这将决定驱动检查每个slave链路状态频率。0表示禁止MII链路监控。100可以作为一个很好的初始参考值
mode——bond的模式类型
primary——主备模式下指定主接口
ipv4.address——指定bond的ipv4地址
C)nmcli connection add type bond-slave ifname eth0 con-name bond0-p1 master bond0
nmcli connection add type bond-slave ifname eth1 con-name bond0-p2 master bond0 #《=========将两个物理网卡分别添加为bond-slave并指定ifname、con-name以及master为谁
D)nmcli connection up bond0-p1
nmcli connection up bond0-p2 #《============激活2个物理网卡
激活后,bond0的ip地址,会从primary指定的接口原有配置信息获取。
E)查看bond信息
cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011) Bonding Mode: fault-tolerance (active-backup) Primary Slave: eth0 (primary_reselect always) Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eth0 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 00:0c:29:d1:aa:30 Slave queue ID: 0 Slave Interface: eth1 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 00:0c:29:d1:aa:3a Slave queue ID: 0
[root@studylinux /etc/sysconfig/network-scripts]#ifconfig bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST> mtu 1500 inet 192.168.205.129 netmask 255.255.255.0 broadcast 192.168.205.255 inet6 fe80::d731:5ba9:dc7d:759 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:d1:aa:30 txqueuelen 1000 (Ethernet) RX packets 58 bytes 4046 (3.9 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 16 bytes 1736 (1.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500 ether 00:0c:29:d1:aa:30 txqueuelen 1000 (Ethernet) RX packets 1140 bytes 81478 (79.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 290 bytes 37400 (36.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth1: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500 ether 00:0c:29:d1:aa:30 txqueuelen 1000 (Ethernet) RX packets 2297 bytes 165294 (161.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1154 bytes 119584 (116.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
关于mode模式,bond有7种模式:(可以用命令tab出来)
nmcli connection add type bond ifname bond1 con-name bond1 mode
802.3ad balance-alb balance-tlb broadcast active-backup balance-rr balance-xor
Mode=0(balance-rr) 表示负载分担round-robin,和交换机的聚合强制不协商的方式配合
Mode=1(active-backup) 表示主备模式,只有一块网卡是active,另外一块是备的standby
Mode=2(balance-xor) 表示XOR Hash负载分担,和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy)
Mode=3(broadcast) 表示所有包从所有interface发出,这个不均衡,只有冗余机制和交换机的聚合强制不协商方式配合
Mode=4(802.3ad) 表示支持802.3ad协议,和交换机的聚合LACP方式配合(需要xmit_hash_policy)
Mode=5(balance-tlb) 是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave
Mode=6(balance-alb) 在5的tlb基础上增加了rlb。
5和6不需要交换机端的设置,网卡能自动聚合。4需要支持802.3ad。0,2和3理论上需要静态聚合方式
但实测中0可以通过mac地址欺骗的方式在交换机不设置的情况下不太均衡地进行接收。
常用的有三种
mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。(思科设备要做etherchannel、foundry要做portgroup)
mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。
mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定。
http://www.mamicode.com/info-detail-2795052.html关于 mode有详细介绍。
https://www.cnblogs.com/hukey/p/6224969.html有介绍关于bond的team类型
7、内核优化
关于内核优化,有很多参数,其中,重要的一个是防止syn flood攻击。以下参数内容及解释,收集至互联网。
#系统所有进程一共可以打开的文件数量 ***** fs.file-max = 2097152 # 减少交换内存使用,默认60,建议10-30 vm.swappiness = 30 # 脏数据的比例和处理,根据场景不同设置, # 参考 https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/ # 如果是数据库服务器,希望数据能够尽快安全写入,可降低内存缓存比例 # vm.dirty_background_ratio = 5 # vm.dirty_ratio = 10 # 如果是业务服务器,对数据安全写入无要求,可加大内存缓存比例 # vm.dirty_background_ratio = 50 # vm.dirty_ratio = 80 # 设置为1,内核允许分配所有的物理内存,Redis常用 vm.overcommit_memory = 1 # 系统拥有的内存数,ElasticSearch启动必备 vm.max_map_count = 26214 # 一个tcp连接关闭后,把这个连接曾经有的参数比如慢启动门限snd_sthresh,拥塞窗口snd_cwnd 还有srtt等信息保存到dst_entry中, 只要dst_entry 没有失效,下次新建立相同连接的时候就可以使用保存的参数来初始化这个连接 net.ipv4.tcp_no_metrics_save = 1 # 使用sysrq组合键是了解系统目前运行情况,为安全起见设为0关闭 **** kernel.sysrq = 0 # 控制 core 文件的文件名中是否添加 pid 作为扩展 kernel.core_uses_pid = 1 # 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理 **** net.ipv4.tcp_syncookies = 1 # 消息队列的最大消息大小,默认8k,建议64kb **** kernel.msgmax = 65536 # 消息队列存放消息的总字节数 **** kernel.msgmnb = 163840 # TIME_WAIT socket的最大数目,不宜太大或者太小,默认是180000,nginx反向代理必备 **** net.ipv4.tcp_max_tw_buckets = 50000 # 开启有选择的应答,设置为1 **** net.ipv4.tcp_sack = 1 # 支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1 **** net.ipv4.tcp_window_scaling = 1 # TCP 缓冲区内存,连接数达到非常高时候需要配置好; 1st低于此值,TCP没有内存压力,2nd进入内存压力阶段,3rdTCP拒绝分配socket(单位:内存页) net.ipv4.tcp_mem = 786432 2097152 3145728 ###(该值应该是按8G内存计算得来) #TCP读buffer net.ipv4.tcp_rmem = 4096 4096 16777216 #TCP写buffer net.ipv4.tcp_wmem = 4096 4096 16777216 #为TCP socket预留用于发送缓冲的内存默认值(单位:字节) net.core.wmem_default = 8388608 #(系统默认值:124928) #为TCP socket预留用于接收缓冲的内存默认值(单位:字节) net.core.rmem_default = 8388608 #(系统默认值:124928) #为TCP socket预留用于接收缓冲的内存最大值(单位:字节) net.core.rmem_max = 16777216 #(系统默认值:124928) #为TCP socket预留用于发送缓冲的内存最大值(单位:字节) net.core.wmem_max = 16777216 #(系统默认值:124928) # ACCEPT等待队列长度,适当,太大了堆积也无用;每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目 **** net.core.netdev_max_backlog = 65535 # 不属于任何进程的socket数目,不宜太大,防止攻击; 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后) net.ipv4.tcp_max_orphans = 65535 # SYNC等待队列长度,适当,太大了排队也没用; 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128 net.ipv4.tcp_max_syn_backlog = 8192 # 禁用timestamp,重要,高并发下设置为0; 时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉 **** net.ipv4.tcp_timestamps = 0 # 发送 SYNC+ACK 的重试次数,不宜太大,5以内; 为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量 **** net.ipv4.tcp_synack_retries = 1 # 发送SYNC的重试次数,不宜太大,5以内 **** net.ipv4.tcp_syn_retries = 1 # 允许回收TCP连接,重要,必须为1; 开启TCP连接中time_wait sockets的快速回收 **** net.ipv4.tcp_tw_recycle = 1 # 允许重用TCP连接,重要,必须为1; 开启TCP连接复用功能,允许将time_wait sockets重新用于新的TCP连接(主要针对time_wait连接) **** net.ipv4.tcp_tw_reuse = 1 # 服务端主动关闭后,客户端释放连接的超时,重要,<30; 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些 **** net.ipv4.tcp_fin_timeout = 5 # 允许TCP保持的空闲keepalive时长,不需要太长 **** net.ipv4.tcp_keepalive_time = 30 # 系统作为TCP客户端连接自动使用的端口(start,end),可发起并发连接数为end-start **** net.ipv4.ip_local_port_range = 10240 65535 #web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值 **** net.core.somaxconn = 16384
#禁用包过滤功能 net.ipv4.ip_forward = 0 #启用源路由核查功能 net.ipv4.conf.default.rp_filter = 1 #禁用所有IP源路由 net.ipv4.conf.default.accept_source_route = 0 #单个共享内存段的大小(单位:字节)限制,计算公式64G*1024*1024*1024(字节) kernel.shmmax = 68719476736 #所有内存大小(单位:页,1页 = 4Kb),计算公式16G*1024*1024*1024/4KB(页) kernel.shmall = 4294967296
#当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可以更快的清理无效链接。 ner.ipv4.tcp_keepalive_time = 600

