一般情况下, 服务器的性能除了编程技巧之外,还有一些操作系统本身的限制。这里我们假设服务器CPU 内存都是能满足需求的。来说说Linux 服务器的一些提高性能的方法。
- 文件描述符的限制 对于服务器,每当有一个连接到来都要消耗一个文件描述符,即系统对文件描述符的限制就成了高性能的障碍。我们可以用ulimit可以查看当前系统对资源的一些限制。
# ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 15739max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 120000pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 8192cpu time (seconds, -t) unlimitedmax user processes (-u) 15739virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited
这里可以看到有我们平时debug 程序的dump core 文件大小和文件描述符,消息队列一个消息的长度的限制等等。这里我们所看到的文件描述符,可以通过ulimit 进行配置
root:/etc# ulimit -SHn 500000root:/etc# ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 15739max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 500000pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 8192cpu time (seconds, -t) unlimitedmax user processes (-u) 15739virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited
经过测试,确实生效,但是重启之后就恢复了,要想永久生效就要修改/etc/security/limits.conf文件
#can have the two values:# - "soft" for enforcing the soft limits# - "hard" for enforcing hard limits## - can be one of the following:# - core - limits the core file size (KB)# - data - max data size (KB)# - fsize - maximum filesize (KB)# - memlock - max locked-in-memory address space (KB)# - nofile - max number of open files# - rss - max resident set size (KB)# - stack - max stack size (KB)# - cpu - max CPU time (MIN)# - nproc - max number of processes# - as - address space limit (KB)# - maxlogins - max number of logins for this user# - maxsyslogins - max number of logins on the system# - priority - the priority to run user process with# - locks - max number of file locks the user can hold# - sigpending - max number of pending signals# - msgqueue - max memory used by POSIX message queues (bytes)# - nice - max nice priority allowed to raise to values: [-20, 19]# - rtprio - max realtime priority# - chroot - change root to directory (Debian-specific)##
##* soft core 0#root hard core 100000#* hard rss 10000#@student hard nproc 20#@faculty soft nproc 20#@faculty hard nproc 50#ftp hard nproc 0#ftp - chroot /ftp#@student - maxlogins 4root soft nofile 120000root hard nofile 120000* soft nofile 120000* hard nofile 120000# End of file
在文件里面添加
1. soft nofile 120000 2. hard nofile 120000
这里的soft 个数一定要小于等于hard个数,重启后生效。
另外,如果想看一个正在运行的进程的资源限制,可以到/proc/进程id/ 下的limits文件里面查看。 2. 端口号限制 对于服务器来讲一般只需要开放一个端口号, 但是某些应用,需要多个端口号例如nginx 反向代理。这里如果正常情况下Nginx只能转发30000多个连接,因为默认情况下系统开放的端口号是3万多 - 65535之间。Nginx 反向代理转发时需要随机端口去转发,默认只能是3万多。对于端口号可以通过sysctl -a 查看。
root:~# sysctl -a | grep localfs.nfs.nsm_local_state = 0net.ipv4.conf.all.accept_local = 0net.ipv4.conf.all.route_localnet = 0net.ipv4.conf.default.accept_local = 0net.ipv4.conf.default.route_localnet = 0net.ipv4.conf.docker0.accept_local = 0net.ipv4.conf.docker0.route_localnet = 0net.ipv4.conf.eth0.accept_local = 0net.ipv4.conf.eth0.route_localnet = 0net.ipv4.conf.lo.accept_local = 0net.ipv4.conf.lo.route_localnet = 0net.ipv4.conf.vethc30f7f2.accept_local = 0net.ipv4.conf.vethc30f7f2.route_localnet = 0net.ipv4.ip_local_port_range = 32768 61000net.ipv4.ip_local_reserved_ports = net.ipv4.ip_nonlocal_bind = 0
这里还不到3万 。对于这个限制可以修改/etc/sysctl.conf 来实现 添加 net.ipv4.ip_local_port_range = 1024 65535
.
sysctl -p
或重启即可生效。 但是即使这样也只能转发6万多个链接。 如果要增加转发数量,这里可以在后端server 多加虚拟IP 添加网卡别名 ifconfig eth0:1 192.168.1.11 netmask 255.255.255.0 up