什么内核参数或其他设置控制可以在 Linux 服务器上打开的最大 TCP 套接字数?允许更多连接的权衡是什么?
我注意到在使用ab对 Apache 服务器进行负载测试时,很容易最大化服务器上的开放连接。如果你不使用 ab 的 -k 选项,它允许连接重用,并让它发送超过 10,000 个请求,那么 Apache 会处理前 11,000 个左右的请求,然后停止 60 秒。查看 netstat 输出显示 11,000 个连接处于 TIME_WAIT 状态。显然,这是正常的。出于TCP 可靠性的原因,即使在客户端完成连接后,连接也会保持打开的默认值 60 秒。
这似乎是对服务器进行 DoS 的一种简单方法,我想知道它的常用调整和预防措施是什么。
这是我的测试输出:
# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The …Run Code Online (Sandbox Code Playgroud) 我运行一个相当繁忙的站点,在偷看时间,当运行 netstat 命令时,我在我的网络服务器上看到超过 10.000 个到我的数据库服务器的打开连接。99% 的连接都在TIME_WAIT状态中。
我今天了解了这个 mysql 变量:wait_timeout http : //dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout。我的仍然设置为默认的 28.800 秒。
降低这个值安全吗?
我的查询通常不会超过一秒钟。因此,将连接保持打开 480 分钟似乎很愚蠢。
我也听说过使用mysql_pconnect而不是mysql_connect,但我一直在读关于它的恐怖故事,所以我想我会远离它。
您如何确定 Linux 服务器的性能受 I/O 限制,也许更重要的是,哪个或哪些进程导致了问题?
我正在运行一个 nginx 服务器,它充当上游 unix 套接字的代理,如下所示:
upstream app_server {
server unix:/tmp/app.sock fail_timeout=0;
}
server {
listen ###.###.###.###;
server_name whatever.server;
root /web/root;
try_files $uri @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
}
Run Code Online (Sandbox Code Playgroud)
一些应用服务器进程反过来在请求/tmp/app.sock可用时将其拉出。此处使用的特定应用服务器是 Unicorn,但我认为这与此问题无关。
问题是,似乎超过一定量的负载后,nginx 无法以足够快的速度通过套接字获取请求。我设置了多少个应用服务器进程并不重要。
我在 nginx 错误日志中收到了大量这些消息:
connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Run Code Online (Sandbox Code Playgroud)
许多请求会导致状态代码 502,以及那些不需要很长时间才能完成的请求。nginx 写入队列统计数据徘徊在 1000 左右。
无论如何,我觉得我在这里遗漏了一些明显的东西,因为 nginx 和应用程序服务器的这种特殊配置非常普遍,尤其是对于 Unicorn(实际上这是推荐的方法)。是否有任何需要设置的 linux 内核选项,或者 nginx 中的某些内容?关于如何增加上游套接字的吞吐量的任何想法?我显然做错了什么?
关于环境的其他信息:
$ uname -a
Linux …Run Code Online (Sandbox Code Playgroud) 我正在将 Asp.Net 与 MySQL 一起使用。在 .Net 连接字符串中,我将 Max Pool Size 设置为 150。
如果我运行以下命令,我会得到这些值:
SHOW GLOBAL STATUS LIKE 'max_used_connections'; gives 66
SHOW GLOBAL STATUS LIKE 'Threads_created'; gives 66
SHOW GLOBAL STATUS LIKE 'connections'; gives 474
Run Code Online (Sandbox Code Playgroud)
这给出了 Threads_created / Connections = 0,1392。
所以从那看来我需要增加thread_cache_size.
但是,如果我运行,SHOW PROCESSLIST我总是会看到由于 .Net 创建的池,我有很多连接打开(其中大部分在休眠)。我是否仍然需要设置,thread_cache_size因为我仍然会重用连接池中的连接?如果池大小为 150,您认为将其设置thread_cache_size为 150+ 是否合适?这会大大影响 CPU 和内存吗?
为什么磁盘密集型应用程序在 SAN 上比在物理磁盘上运行得更快?我原以为物理磁盘会稍微快一点,但实际上,当它的工作驱动器设置为 SAN 上的分区时,该过程的运行速度会快 100 倍。
我们的猜测是 SAN 开箱即用优化为快速,而物理磁盘调整设置与操作系统 (Solaris) 相关并且尚未触及或操作系统修补。
在最高活动期间,磁盘 I/O 以 100% 运行,完成写入的时间超过 2 秒,因为多个进程同时写入磁盘。
(仅供参考,所涉及的应用程序是 Informatica PowerCenter)
我想弄清楚为什么kjournald我的机器会发疯。这是一个带有大量内存的 8 核盒子。它有大约 50% 的 CPU 负载。
iotop 似乎没有指向任何特定的进程——这里和那里的一些突发写入(主要是 cron 启动,生成的一些监控统计信息等)当我过去sys/vm/block_dump收集写入统计信息时,我得到了这样的列表:
kjournald(1352): 1909
sendmail(28934): 13
cron(28910): 12
cron(28912): 11
munin-node(29015): 3
cron(28913): 3
check_asterisk_(28917): 3
sh(28917): 2
munin-node(29022): 2
munin-node(29021): 2
Run Code Online (Sandbox Code Playgroud)
当kjournald行动只是写道。
为什么会这样?我还应该注意什么来限制 kjournald 活动?这似乎与实际编写的内容不成比例。
为了开发目的,如何最好地调整 Windows PC?
MySQL 不是我的菜,但我需要微调我们的一台服务器。
以下是要求/规格:
由于它现在的配置,我们的 MySQL 服务器慢慢开始吃掉所有可用的内存(我们使用 collectd,这是一个图表)。在某些时候(几天/几周后),它停止执行查询(它在今晚停止了 2 个小时,我不得不重新启动 MySQL 服务器:见第二张图片):
(抱歉,新用户不能发布图片,而且只有 1 个超链接 :/)
今天:i31.tinypic.com/ir53yg.png
这是我们目前的 my.cnf
#
# The MySQL database server configuration file.
#
# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" …Run Code Online (Sandbox Code Playgroud) 我正在使用 Linux 网络设备,并且有一些 TCP/IP 设置似乎没有 IPv6 等效项。IP 转发是一种常见设置,可在两个堆栈中使用
net.ipv4.ip_forward
net.ipv6.conf.all.forwarding
Run Code Online (Sandbox Code Playgroud)
但这些是我需要支持 IPv6 的一些设置的例子
net.ipv4.ip_nonlocal_bind
net.ipv4.ip_local_port_range
net.ipv4.tcp_tw_reuse
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
Run Code Online (Sandbox Code Playgroud)
ip_nonlocal_bind 非常关键,并且似乎缺少 TCP TIME_WAIT 套接字的设置。
我可能错过的内核/iproute 文档的指针也很棒。
tuning ×10
linux ×5
performance ×4
mysql ×3
.net ×1
apache-2.2 ×1
connections ×1
development ×1
filesystems ×1
hard-drive ×1
innodb ×1
io ×1
ipv6 ×1
kjournald ×1
networking ×1
nginx ×1
scaling ×1
socket ×1
unicorn ×1
windows ×1
xen ×1