Linux 高并发核心配置

1、open file(调整同时打开文件数量)的限制 使用命令ulimit -a可以查看

修改在 vim /etc/security/limits.conf 文件最后输入
建议配置:注意open file建议不超过65535

* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535

注意:
root :指定用户,如对所有用户,则写 *
soft:软限制
hard:硬件限制
nofile 是代表最大文件打开数

2、内核的配置修改

在文件 /etc/sysctl.conf 内 修改后 使用命令 sysctl -p 生效

net.ipv4.tcp_syncookies = 0  
# 此参数是为了防止洪水攻击的,但对于大并发系统,要禁用此设置net.ipv4.tcp_max_tw_buckets = 6000
# timewait的数量,默认是180000。可以不修改net.ipv4.tcp_tw_recycle = 1
# 是否加速TIME_WAIT的sockets的回收,默认为0。net.ipv4.tcp_tw_reuse = 1
# 是否可将TIME_WAIT状态的sockets用于新的TCP连接,默认为0。net.core.somaxconn = 20480  
# 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。默认是128 优化可以根据系统配置做优化。不更改uwsgi的监听队列不能大于这个值net.ipv4.ip_local_port_range = 1024 65000
# 允许系统打开的端口范围,这表明将系统对本地端口范围限制设置为1024~65000之间。注意,最小值必须大于或等于1024;最大值则应小于或等于65535。net.ipv4.ip_conntrack_max = 20480
# 这表明将系统对最大跟踪的TCP连接数限制设置为20480。请注意,此限制值要尽量小,以节省对内核内存的占用。net.ipv4.tcp_max_syn_backlog = 20480
# 定义SYN_RECV状态队列的数量,一般默认值为512或者1024,即超过这个数量,系统将不再接受新的TCP连接请求,一定程度上可以防止系统资源耗尽。可根据情况增加该值以接受更多的连接请求。

注意:swap空间使用
推荐的配置:
修改 /etc/sysctl.conf 增加以下内容

net.ipv4.tcp_syncookies = 0 # 注意查看是否和原有的冲突
# net.ipv4.tcp_max_tw_buckets = 18000 # 使用默认即可
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.core.somaxconn = 20480 
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_conntrack_max = 20480
net.ipv4.tcp_max_syn_backlog = 20480

其他云服务器的推荐配置
Tencent server:

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 0
kernel.msgmnb = 65536
kernel.msgmax = 65536
net.ipv4.conf.all.promote_secondaries = 1
net.ipv4.conf.default.promote_secondaries = 1
net.ipv6.neigh.default.gc_thresh3 = 4096
net.ipv4.neigh.default.gc_thresh3 = 4096
kernel.softlockup_panic = 1
kernel.sysrq = 1
kernel.numa_balancing = 0
kernel.shmmax = 68719476736
kernel.printk = 5

ali server:

vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
kernel.sysrq=1

3、nginx配置

# 配置用户 推荐使用安装时默认即可
user nginx;
# 工作进程数(建议跟CPU的核数量一致) 推荐使用auto即可
worker_processes auto;
# 设置自动绑定cpu,目的是将进程分配到指定cpu
worker_cpu_affinity auto;
# 设置可由工作进程打开的同时连接的最大数量(不能超过系统设置的最大值)
worker_rlimit_nofile 65535;
# 进程文件 默认即可
pid /run/nginx.pid;
# 包含其他的配置
include /etc/nginx/modules-enabled/*.conf;events {# 工作模式(多路IO复用方式)use epoll;# 每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes * worker_connectionsworker_connections 1024;# 是否同时接受多个新的网络连接请求multi_accept on;# 设置网路连接序列化,是否防止惊群现象发生accept_mutex on;
}# HTTP服务器相关配置
http {# 日志格式# log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';# 访问日志 默认即可 access_log off;表示关闭访问日志access_log /var/log/nginx/access.log main;# 错误日志 默认即可 彻底关闭的配置error_log /dev/null;常见的错误日志级别有debug|info|notice|warn|error|crit|alert|emerg,级别越高记录的信息越少error_log /var/log/nginx/error.log crit;# 是否启用文件快速传输 开启高效文件传输模式 用sendfile传输文件时有利于改善性能sendfile on;# 是否缓存数据后集中发送,适用于大文件传输tcp_nopush on;# 是否立即发送数据包,使用于即时性传输 禁用Nagle来解决交互性问题tcp_nodelay on;# 是否隐藏nginx版本号 默认即可# server_tokens off;# 客户端保持连接时间 可以禁用用来提高并发keepalive_timeout 30;# types_hash_max_size影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快types_hash_max_size 2048;# 包含MIME类型的配置include /etc/nginx/mime.types;# 默认使用二进制流格式default_type application/octet-stream;# 开启gzip压缩gzip on;# 一下gzip配置一般默认即可# 不压缩临界值,大于1K的才压缩 # gzip_min_length 1k;# 指定申请缓存空间的个数和每个空间的大小# gzip_buffers 16 8k;# 设置压缩的最低HTTP版本,默认是1.1# gzip_http_version 1.0; # 压缩级别,1-10,数字越大压缩的越好,时间也越长,根据实际情况调整;默认是 1# gzip_comp_level 2; # 指定压缩的 MIME 类型# gzip_types text/plain application/x-javascript text/css application/xml image/gif image/png;# 表示不对IE6进行Gzip压缩,因为IE6支持的不友好# gzip_disable "MSIE [1-6]\."; # 包含其他配置文件 默认即可include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;# 一般情况下下面的配置都会按项目放在单独的配置文件中# 定义一个简单负载均衡 指定权重方式upstream test {# weight表示权重,max_fails允许失败的次数 超过次数认为宕机,fail_timeout设置超时时间,当超时60秒时认为失败server 127.0.0.1:8000 weight=1 max_fails=3 fail_timeout=60;server 127.0.0.1:8001 weight=1 max_fails=3 fail_timeout=60 down; # down表示该server不参与负载均衡}# 定义一个简单负载均衡 ip_hash方式upstream mycom {ip_hash;server 127.0.0.1:8002;server 127.0.0.1:8003;}server {# 指定监听端口listen 80;# 指定监听地址或域名 默认为_server_name _;# 指定根目录root /usr/share/nginx/html;# 指定请求体的大小client_max_body_size 20M;# 包含项目的Nginx配置文件include /etc/nginx/default.d/*.conf;location ~*^.+$ { # 请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。# root path;  # 根目录# index vv.txt;  # 设置默认页proxy_pass  http://127.0.0.1:8000;  # 请求转发给本地8000端口处理# proxy_pass http://test; # 使用http代理 将所有请求转发给负载均衡test处理# deny 127.0.0.1;  # 拒绝的ip# allow 172.18.5.54; # 允许的ip# 地址重定向 break本条规则匹配完成后终止,不在匹配任何规则,redirect返回302临时重定向,permanent返回301永久重定向# rewrite ^/api/(.*) /$1 break;# 下面这段在反向代理时 用来设定被代理服务器接收到的header信息 一般情况下,这也是反向代理的标配proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Protocol $scheme;}# index的指定用法location / {root /var/www/mycom; # 此时/var/www/mycom目录下如果有一个index.html 那么访问配置域名时会默认进入该文件}# 使用uwsgi代理的推荐配置location api/ {include uwsgi_params; # 使用uwsgi代理uwsgi_pass mycom; # 将所有请求转发给负载均衡mycom处理proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Protocol $scheme;}# 指定静态文件地址location /static/ {alias /var/www/mycom/static/; # 使用alias指定路径 需要到实际静态文件所在的目录的当前目录名,并且 / 必须前后一致# root /var/www/mycom; # 使用root指定路径 需要到实际静态文件所在的目录的上一级目录,并且路由名需和实际目录名一致}# 404时的页面重定向error_page 404 /404.html;location = /40x.html {}# 发生错误时的页面重定向error_page 500 502 503 504 /50x.html;location = /50x.html {}}
}

注解:::
单机最大连接数:
系统用一个4四元组来唯一标识一个TCP连接:
{local ip, local port, remote ip, remote port}。
client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到不同的server ip。
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接=客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。
在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口。对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万是没问题的。

题外话,使用uwsgi的推荐配置:

[uwsgi]# 配置前导路径
base = /root/bin/django-test
# 配置项目名称
name = django-test
# 守护进程
master = true
# 进程个数
processes = 4
# 线程个数
threads = 2
# 通信的地址和端口(自己服务器的IP地址和端口)
socket = 127.0.0.1:8000
# wsgi-file文件地址
wsgi-file = %(base)/%(name)/wsgi.py
# 项目地址
chdir = %(base)
# 虚拟环境
home = /root/.envs/%(name)
# 指定python解释器
pythonpath = %(home)/bin/python
# 日志文件地址
daemonize = %(base)/%(name).log
# 关闭uwsgi访问日志
disable-logging = True
# 监听队列的长度,不能超过系统内核的net.core.somaxconn长度,该数值的增加有助于提供并发性。
listen = 10240

启动示例:
正常启动:uwsgi --ini uwsgi.ini
以协程方式启动:uwsgi --gevent 100 --gevent-early-monkey-patch uwsgi.ini
注意:要提前安装好gevent

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注