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_connections
    worker_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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haeasringnar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值