Nginx和sysctl配置-性能设置

5

Nginx充当广告服务器的反向代理,每分钟接收20k个请求。从广告服务器到nginx的响应时间在100ms内。

运行在虚拟机上,配置为 128GB RAM 4 vCPU 100GB HDD

考虑以上因素,Nginx和sysctl.conf的良好设置是什么?

1个回答

12
请注意,内核调整很复杂,需要进行大量评估,直到获得正确的结果。如果有人发现错误,请告诉我,以便我可以调整自己的配置 :-)
此外,如果这个服务器只运行Nginx,那么您的内存使用率非常高,您可以在高峰时段检查使用情况并相应地进行调整。
检查文件描述符的数量是一件重要的事情,在您的情况下,我会将其设置为65,000,以应对每秒20,000多次请求。原因是在正常情况下,您只需要大约4,000个文件描述符,因为您有4,000个同时打开的连接(20,000 * 2 * 0.1)。然而,在出现与后端相关的问题的情况下,加载广告可能需要1秒或更长时间。在这种情况下,同时打开的连接数会更高:
20.000 * 2 * 1.5 = 60.000. 

我认为将其设置为65K是一个安全的值。

您可以通过以下方式检查文件描述符的数量:

cat /proc/sys/fs/file-max

如果这个值低于65000,你需要在/etc/sysctl.conf中进行设置:
fs.file-max = 65000

对于Nginx,您还需要在以下文件中添加以下内容:/etc/systemd/system/nginx.service.d/override.conf

[Service]
LimitNOFILE=65000

在nginx.conf文件中:
worker_rlimit_nofile 65000;

添加后,您需要应用更改:

sudo sysctl -p
sudo systemctl daemon-reload
sudo systemctl restart nginx

在进行这些设置之后,以下设置将帮助您入门:
vm.swappiness = 0   # The kernel will swap only to avoid an out of memory condition
vm.min_free_kbytes = 327680 # The kernel will start swapping when memory is below this limit (300MB)

vm.vfs_cache_pressure = 125 # reclaim memory which is used for caching of VFS caches quickly
vm.dirty_ratio = 15 # Write pages to disk when 15% of memory is dirty
vm.dirty_background_ratio = 10 # System can start writing pages to disk when 15% of memory is dirty

此外,我在我的sysctl配置中结合上述可调整参数使用以下安全设置。请随意使用它们,感谢
# Avoid a smurf attack
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Turn on protection for bad icmp error messages
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Turn on syncookies for SYN flood attack protection
net.ipv4.tcp_syncookies = 1
# Turn on and log spoofed, source routed, and redirect packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# No source routed packets here
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Turn on reverse path filtering
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Make sure no one can alter the routing tables
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
# Don't act as a router
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Turn on execshild
kernel.exec-shield = 1
kernel.randomize_va_space = 1

由于您正在代理请求,我建议您将以下内容添加到sysctl.conf文件中,以确保不会耗尽端口。这是可选的,但如果遇到问题,则需要考虑此事:

net.ipv4.ip_local_port_range=1024 65000

由于我通常会评估默认设置并相应地进行调整,因此我没有提供IPv4和ipv4.tcp_选项。下面是一个示例,但请不要复制和粘贴,您需要在开始调整这些变量之前进行一些阅读。

# Increase TCP max buffer size setable using setsockopt()
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
# Increase Linux auto tuning TCP buffer limits
# min, default, and max number of bytes to use
# set max to at least 4MB, or higher if you use very high BDP paths
# Tcp Windows etc
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1

上述参数并不是你应该考虑的全部,还有许多其他参数可以调整,例如:
  • 将工作进程数量设置为4(每个CPU核心一个)。
  • 调整后备队列。
  • 如果您不需要访问日志,我建议将其关闭以删除磁盘I/O。
  • 可选:如果您的CPU使用率过高,请降低或禁用gzip压缩。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接