Nginx系统优化篇

dlcpk 2022-1-19

2787 0

Linux(centos 7)文件数限制

内核参数fs.file-max  /proc/sys/fs/file-max

655360

内核参数fs.file-nr    /proc/sys/fs/file-nr

它有三个值:已分配文件句柄的数目,已使用文件句柄的数目,文件句柄的最大数目

该参数只读,不修改 3648 0 655360

文件数限制分三个级别

系统级限制        /proc/sys/fs/file-max

/proc/sys/fs/file-max是系统给出的建议值,

系统会计算资源给出一个和合理值,一般跟内存有关系,内存越大,改值越大,但是仅仅是一个建议值,limits.conf的设定完全可以超过/proc/sys/fs/file-max。

用户级限制        /etc/security/limits.conf

soft nofile表示软限制,hard nofile表示硬限制,软限制要小于等于硬限制。

如果root用户的软限制为1000,硬限制为1200,即表示root用户能打开的最大文件数量为1000,不管它开启多少个shell。

配置文件 /etc/security/limits.conf ,加入下面两行

*  soft  nofile  65536

*  hard  nofile  65536

shell级限制      ulimit -n xxx

使用ulimit -a 可以查看当前文件数限制

ulimit -n xxxx 修改的是当期用户当期环境的限制,重启和退出用户就恢复了

如果在limits.conf里没有设置,则默认值是1024,如果limits.con有设置,则默认值以limits.conf为准

补充说明

1,/proc/sys/fs/file-max限制不了/etc/security/limits.conf

2,只有root用户才有权限修改/etc/security/limits.conf

3,对于非root用户, /etc/security/limits.conf会限制ulimit -n,但是限制不了root用户,ulimit -n只能越设置越小,root用户则无限制

4,任何用户对ulimit -n的修改只在当前环境有效,退出后失效,重新登录新来后,ulimit -n由limits.conf决定

5,如果limits.conf没有做设定,则默认值是1024,当前环境的用户所有进程能打开的最大问价数量由ulimit -n决定

```

```

内核优化

net.ipv4.ip_forward = 0  #表示禁止数据包转发,关闭linux 的转发功能

net.ipv4.conf.default.rp_filter = 1  #启用源路由核查功能

net.ipv4.conf.default.accept_source_route = 0  ##禁用所有IP源路由

kernel.sysrq = 0  #使用sysrq组合键是了解系统目前运行情况,为安全起见设为0关闭

kernel.core_uses_pid = 1  #控制core文件的文件名是否添加pid作为扩展

# 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;什么是SYN

# SYN Cookie是对TCP服务器端的三次握手做一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器

# 接收到TCP SYN包并返回TCP SYN + ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。这个cookie作为将要返回的SYN ACK包的初始序列号。当客户端返回一个ACK包时,根据包头信息计算cookie,与返回的确认序列号(初始序列号 + 1)进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接。

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536  #每个消息队列的大小(单位:字节)限制, 所有在消息队列中的消息总和的最大值(msgmnb=64k)

kernel.msgmax = 65536  #指定内核中消息队列中消息的最大值(msgmax=64k)

# 前方高能!是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,64位linux系统:可取的最大值为物理内存值-1byte,

# 建议值为多于物理内存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理内存-1byte。

# 例如,如果为64GB物理内存,可取64*1024*1024*1024-1=68719476735

kernel.shmmax = 68719476735 (使用公式计算)

# 该参数控制可以使用的共享内存的总页数。Linux共享内存页大小为4KB,共享内存段的大小都是共享内存页大小的整数倍。一个

# 共享内存段的最大大小是 16G,那么需要共享内存页数是16GB/4KB=16777216KB /4KB=4194304(页),也就是64Bit系统下16GB物理内存,设置kernel.shmall = 4194304才符合要求(几乎是原来设置2097152的两倍)

kernel.shmall = 4294967296(使用公式计算)

# 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000。设为较小数值此项参数可以控制TIME_WAIT套接字的最大数量,避免服务器被大量的TIME_WAIT套接字拖死。

net.ipv4.tcp_max_tw_buckets = 6000

# 使 用 Selective ACK﹐它可以用来查找特定的遗失的数据报— 因此有助于快速恢复状态。该文件表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段)。(对于广域网通信来说这个选项应该启用,但是这会增加对 CPU 的占用。)

net.ipv4.tcp_sack = 1

#打开FACK拥塞避免和快速重传功能。(注意,当tcp_sack设置为0的时候,这个值即使设置为1也无效)启用转发应答(Forward Acknowledgment),这可以进行有选择应答(SACK)从而减少拥塞情况的发生;这个选项也应该启用。

net.ipv4.tcp_fack = 1

# 允许TCP发送”两个完全相同”的SACK。

##一个布尔类型的标志,控制着当有很多的连接请求时内核的行为。启用的话,如果服务超载,内核将主动地发送RST包。

net.ipv4.tcp_abort_on_overflow = 1

net.ipv4.tcp_dsack = 1

#对于高速网络该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力。对普通地百M网络而言,关闭会降低开销,所以如果不是高速网络,可以考虑设置为0

net.ipv4.tcp_window_scaling = 1

# #TCP接收缓冲区

net.ipv4.tcp_rmem = 4096 87380 4194304

# #TCP发送缓冲区

net.ipv4.tcp_wmem = 4096 66384 4194304

# #该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)。

net.core.wmem_default = 8388608

#该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)。

net.core.rmem_default = 8388608

# #指定了接收套接字缓冲区大小的最大值(以字节为单位)。

net.core.rmem_max = 16777216

#指定了发送套接字缓冲区大小的最大值(以字节为单位)。

net.core.wmem_max = 16777216

# 该参数决定了, 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目, 不要设的过大

net.core.netdev_max_backlog = 262144

# 定义了系统中每一个端口最大的监听队列的长度, 对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。

net.core.somaxconn = 262144  允许等待中的监听

# 系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制,更应该增加这个值(如果增加了内存之后)。每个孤儿套接字最多能够吃掉你64K不可交换的内存。

net.ipv4.tcp_max_orphans = 3276800

# 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_syn_backlog = 262144

# 时间戳,0关闭, 1开启,在(请参考RFC 1323)TCP的包头增加12个字节, 关于该配置对TIME_WAIT的影响及可能引起的问题: http://huoding.com/2012/01/19/142 , Timestamps 用在其它一些东西中﹐可以防范那些伪造的 sequence 号码。一条1G的宽带线路或许会重遇到带 out-of-line数值的旧sequence 号码(假如它是由于上次产生的)。Timestamp 会让它知道这是个 ‘旧封包’。(该文件表示是否启用以一种比超时重发更精确的方法(RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。)

net.ipv4.tcp_timestamps = 0

# tcp_synack_retries 显示或设定 Linux 核心在回应 SYN 要求时会尝试多少次重新发送初始 SYN,ACK 封包后才决定放弃。这是所谓的三段交握 (threeway handshake) 的第二个步骤。即是说系统会尝试多少次去建立由远端启始的 TCP 连线。tcp_synack_retries 的值必须为正整数,并不能超过 255。因为每一次重新发送封包都会耗费约 30 至 40 秒去等待才决定尝试下一次重新发送或决定放弃。tcp_synack_retries 的缺省值为 5,即每一个连线要在约 180 秒 (3 分钟) 后才确定逾时.

net.ipv4.tcp_synack_retries = 1

# 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)

net.ipv4.tcp_syn_retries = 1

# 放弃回应一个TCP连接请求前﹐需要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 - 8分钟之间。(注意:这个值同时还决定进入的syn连接)

net.ipv4.tcp_retries1 = 3

# 在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)

net.ipv4.tcp_retries2 = 15

# 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_tw_recycle = 1  tcp连接快速回收

# 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1 tcp连接重用

net.ipv4.tcp_mem = 94500000 915000000 927000000

# 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

net.ipv4.tcp_fin_timeout = 1

# TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)

net.ipv4.tcp_keepalive_probes = 5

# 探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)

net.ipv4.tcp_keepalive_intvl = 15

# 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。

net.ipv4.tcp_keepalive_time = 30

# 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。

net.ipv4.ip_local_port_range = 1024 65000

# 本端试图关闭TCP连接之前重试多少次。缺省值是7,相当于50秒~16分钟(取决于RTO)。如果你的机器是一个重载的WEB服务器,你应该考虑减低这个值,因为这样的套接字会消耗很多重要的资源。参见tcp_max_orphans.

net.ipv4.tcp_orphan_retries = 3

# 跟踪的连接超时结束时间,

net.netfilter.nf_conntrack_tcp_timeout_established = 180

在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)

net.nf_conntrack_max = 655360

防火墙(建议关掉)防火墙开启情况下此模块可能失效

在kernel2.6之前的添加项:

net.ipv4.netfilter.ip_conntrack_max = 655360

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180

kernel2.6之后的添加项:

net.nf_conntrack_max = 655360

net.netfilter.nf_conntrack_tcp_timeout_established = 120

对于带有超过1G内存的系统,CONNTRACK_MAX的默认值会被限制在65536(但是可以手工设置成更大的值)

这个错误可能是你的防火墙没有开启或者自动处理可载入的模块ip_conntrack没有自动载入,解决办法有二,一是开启防火墙,二是自动处理开载入的模块ip_conntrack

modprobe nf_conntrack

echo "modprobe nf_conntrack">> /etc/rc.local

error: "net.bridge.bridge-nf-call-ip6tables"isan unknown key

error: "net.bridge.bridge-nf-call-iptables"isan unknown key

error: "net.bridge.bridge-nf-call-arptables"isan unknown key

这个错误是由于自动处理可载入的模块bridge没有自动载入,解决办法是自动处理开载入的模块 ip_conntrack

modprobe bridge

echo "modprobe bridge">> /etc/rc.local

```

```

内核优化参考配置  /etc/sysctl.conf

net.ipv4.ip_forward = 0

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 68719476735 (使用公式计算(服务器内存xG,)16G*1024*1024*1024-1)

kernel.shmall = 4294967296 (使用公式计算 服务器内存xG,)16G*1024*1024*1024/4KB(页))

net.ipv4.tcp_max_tw_buckets = 6000

net.ipv4.tcp_sack = 1

net.ipv4.tcp_fack = 1

net.ipv4.tcp_dsack = 1

net.ipv4.tcp_window_scaling = 1

net.ipv4.tcp_rmem = 4096 87380 4194304

net.ipv4.tcp_wmem = 4096 66384 4194304

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.core.netdev_max_backlog = 262144 /(超过10W并发用这个)862144

net.core.somaxconn = 262144

net.ipv4.tcp_max_orphans = 262144 /(超过10W并发用这个) 327680

net.ipv4.tcp_max_syn_backlog = 262144 / (超过10W并发用这个)1020000  (根据情况配置)

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_retries1 = 3

net.ipv4.tcp_retries2 = 5

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_orphan_retries = 3

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_fin_timeout = 15/(超过十万调为)1

net.ipv4.tcp_keepalive_probes = 5/3

net.ipv4.tcp_keepalive_intvl = 15

net.ipv4.tcp_keepalive_time = 1200 / (超过十万调为)30

net.ipv4.ip_local_port_range = 1024 65000

net.nf_conntrack_max = 655360/(超过10W并发用这个)1048576

net.netfilter.nf_conntrack_tcp_timeout_established = 180/(超过10W并发用这个)120

#####网上超过十万并发参考配置

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_abort_on_overflow = 1

net.ipv4.tcp_max_tw_buckets = 6000

net.ipv4.tcp_sack = 1

net.ipv4.tcp_window_scaling = 1

net.ipv4.tcp_rmem = 4096        87380  4194304

net.ipv4.tcp_wmem = 4096        66384  4194304

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.core.optmem_max = 81920

net.core.wmem_default = 8388608

net.core.wmem_max = 16777216

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.ipv4.tcp_max_syn_backlog = 1020000

net.core.netdev_max_backlog = 862144

net.core.somaxconn = 262144

net.ipv4.tcp_max_orphans = 327680

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_fin_timeout = 15

net.ipv4.tcp_keepalive_time = 30

net.ipv4.ip_local_port_range = 1024    65000

net.netfilter.nf_conntrack_tcp_timeout_established = 180

net.nf_conntrack_max = 1048576

实战Nginx取代Apache的高性能Web服务器 建议配置

net.ipv4.tcp_max_syn_backlog=65536

net.core.netdev_max_backlog=32768

net.core.somaxconn=32768

net.core.wmen_default=8388608

net.core.rmen_default=8388608

net.core.rmem_max=16777216

net.core.wmen_max=16777216

net.ipv4.tcp_timestamps=0

net.ipv4.top_synack_retrides=2

net.ipv4.tcp_syn_retries=2

net.ipv4.tcp_tw_recycle=1

#net.ipv4.tcp_tw_len=1

net.ipv4.tcp_tw_reuse=1

net.ipv4.tcp_mem=94500000 915000000 927000000

net.ipv4.tcp_max_orphans=3276800

#net.ipv4.tcp_fin_timeout=30

#net.ipv4.tcp_keepalive_time=120

net.ipv4.ip_local_port_range=1024 65535

```

最新回复 (0)
返回