高性能服务器性能优化
所属分类 performance
浏览量 1565
1 服务器的参数调优
一般会修改两个文件,/etc/sysctl.conf和/etc/security/limits.conf, 用来配置TCP/IP参数和最大文件描述符。
1.1 TCP/IP参数配置
修改文件/etc/sysctl.conf,配置网络参数。
net.ipv4.tcp_wmem = 4096 87380 4161536
net.ipv4.tcp_rmem = 4096 87380 4161536
net.ipv4.tcp_mem = 786432 2097152 3145728
1.2 最大文件描述符
Linux内核本身有文件描述符最大值的限制,你可以根据需要更改:
系统最大打开文件描述符数:/proc/sys/fs/file-max
临时性设置:echo 1000000 > /proc/sys/fs/file-max
永久设置:修改/etc/sysctl.conf文件,增加fs.file-max = 1000000
进程最大打开文件描述符数
使用ulimit -n查看当前设置。使用ulimit -n 1000000进行临时性设置。
要想永久生效,你可以修改/etc/security/limits.conf文件,增加下面的行:
* hard nofile 1000000
* soft nofile 1000000
root hard nofile 1000000
root soft nofile 1000000
还有一点要注意的就是hard limit不能大于/proc/sys/fs/nr_open,因此有时你也需要修改nr_open的值。
执行echo 2000000 > /proc/sys/fs/nr_open
查看当前系统使用的打开文件描述符数,可以使用下面的命令
[root@localhost ~]# cat /proc/sys/fs/file-nr
1632 0 1513506
其中第一个数表示当前系统已分配使用的打开文件描述符数,第二个数为分配后已释放的(目前已不再使用),第三个数等于file-max。
总结一下:
所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max
单个进程打开的文件描述符数不能超过user limit中nofile的soft limit
nofile的soft limit不能超过其hard limit
nofile的hard limit不能超过/proc/sys/fs/nr_open
1.3 应用运行时调优
Java 应用内存调优
服务器使用12G内存,吞吐率优先的垃圾回收器:
JAVA_OPTS="-Xms12G -Xmx12G -Xss1M -XX:+UseParallelGC"
V8引擎
node --nouse-idle-notification --expose-gc --max-new-space-size=1024 --max-new-space-size=2048 --max-old-space-size=8192 ./webserver.js
1.4 OutOfMemory Killer
如果服务器本身内存不大,比如8G,在不到100万连接的情况下,你的服务器进程有可能出现”Killed”的问题。 运行dmesg可以看到:
Out of memory: Kill process 10375 (java) score 59 or sacrifice child
这是Linux的OOM Killer主动杀死的。
开启oom-killer的话,在/proc/pid下对每个进程都会多出3个与oom打分调节相关的文件。临时对某个进程可以忽略oom-killer可以使用下面的方式:
echo -17 > /proc/$(pidof java)/oom_adj
解决办法有多种,可以参看文章最后的参考文章,最好是换一个内存更大的机器。
2 客户端的参数调优
在一台系统上,连接到一个远程服务时的本地端口是有限的。
根据TCP/IP协议,由于端口是16位整数,也就只能是0到 65535,
而0到1023是预留端口,所以能分配的端口只是1024到65534,也就是64511个。
也就是说,一台机器一个IP只能创建六万多个长连接。
要想达到更多的客户端连接,可以用更多的机器或者网卡,也可以使用虚拟IP来实现,
比如下面的命令增加了19个IP地址,其中一个给服务器用,其它18个给client,这样可以产生18 * 60000 = 1080000个连接。
ifconfig eth0:0 192.168.77.10 netmask 255.255.255.0 up
ifconfig eth0:1 192.168.77.11 netmask 255.255.255.0 up
ifconfig eth0:2 192.168.77.12 netmask 255.255.255.0 up
ifconfig eth0:3 192.168.77.13 netmask 255.255.255.0 up
ifconfig eth0:4 192.168.77.14 netmask 255.255.255.0 up
ifconfig eth0:5 192.168.77.15 netmask 255.255.255.0 up
ifconfig eth0:6 192.168.77.16 netmask 255.255.255.0 up
ifconfig eth0:7 192.168.77.17 netmask 255.255.255.0 up
ifconfig eth0:8 192.168.77.18 netmask 255.255.255.0 up
ifconfig eth0:9 192.168.77.19 netmask 255.255.255.0 up
ifconfig eth0:10 192.168.77.20 netmask 255.255.255.0 up
ifconfig eth0:11 192.168.77.21 netmask 255.255.255.0 up
ifconfig eth0:12 192.168.77.22 netmask 255.255.255.0 up
ifconfig eth0:13 192.168.77.23 netmask 255.255.255.0 up
ifconfig eth0:14 192.168.77.24 netmask 255.255.255.0 up
ifconfig eth0:15 192.168.77.25 netmask 255.255.255.0 up
ifconfig eth0:16 192.168.77.26 netmask 255.255.255.0 up
ifconfig eth0:17 192.168.77.27 netmask 255.255.255.0 up
ifconfig eth0:18 192.168.77.28 netmask 255.255.255.0 up
修改/etc/sysctl.conf文件:
net.ipv4.ip_local_port_range = 1024 65535
执行/sbin/sysctl -p即时生效。
上一篇
下一篇
带孙谣第一篇
带孙谣第二篇
程序员眼中的女人
AOP要点整理
linux命令速查
币圈修炼指南