使用 php7.3-fpm 和 lighttpd 1.4.53 通过 UNIX 套接字(而不是 TCP)连接时,503 服务在高负载下不可用

使用 php7.3-fpm 和 lighttpd 1.4.53 通过 UNIX 套接字(而不是 TCP)连接时,503 服务在高负载下不可用

我最近将 php7.3-fpm 配置切换为使用 UNIX 套接字,而不是监听 localhost:9000。这解决了延迟问题(我时不时会收到无缘无故花费一秒钟以上的请求)。但是,现在使用 unix 套接字时,我会在高负载下遇到“503 服务不可用”问题 - 但仅限于 PHP 脚本。静态文件仍可无错误地传送。因此,这与 PHP 有关。

我已经对该网站进行了峰值测试使用k6。在 ~400 req/s 下测试一个简单的脚本时,90% 的请求都是 503 错误,而使用 TCP 时,速度会减慢到无穷大,即使在 800 req/s 下也能正常工作,只有 ~0.5% 的请求失败。我猜这是 UNIX 套接字上的连接限制。我不得不增加积压大小以/etc/php/7.3/fpm/pool.d/www.conf使 TCP 在这些高负载下工作(增加到 10240,这是默认值的 10 倍)。但是,我在配置中没有找到任何与 UNIX 套接字类似的内容……我还尝试增加 lighttpd 可以使用的文件描述符数量(server.max-fds),但没有成功。

由于 UNIX 套接字效率更高,我愿意使用它们。尤其是,它们解决了这个延迟问题……而且它们不必通过防火墙,出于某种原因,防火墙自某些较新的内核版本以来就对本地主机连接进行了防火墙。UNIX 套接字上可能有连接限制……但我不知道如何设置它。

问题

您是否知道为什么会这样...或者您是否有解决方案?

版本 / 操作系统 / 配置

lighttpd:1.4.53(无法更新到较新的版本!)php-fpm:7.3 操作系统:debian/9.13 内核版本:“Linux worldtalk.de 4.9.0-15-amd64 #1 SMP Debian 4.9.258-1 (2021-03-08) x86_64 GNU/Linux”。

/etc/lighttpd/lighttpd.conf

.
.
.
server.port                 = 80
server.stream-request-body  = 2
server.stream-response-body = 2
server.listen-backlog = 2000
server.max-keep-alive-idle = 2
server.max-keep-alive-requests = 4
server.max-read-idle = 25
server.max-write-idle = 25
server.max-fds = 10240
.
.
.

/etc/lighttpd/conf-enabled/10-fastcgi.conf

对于 UNIX 套接字:

server.modules += ( "mod_fastcgi" )

index-file.names += ( "index.php" )

fastcgi.server = (
    ".php" => (
      "localhost" => (
        "socket"                => "/run/php/php7.3-fpm.sock",
        "broken-scriptfilename" => "enable"
      ))
)

对于 TCP:

server.modules += ( "mod_fastcgi" )

index-file.names += ( "index.php" )

fastcgi.server = ( ".php" => ((
                        "host" => "127.0.0.1",
                        "port" => "9000",
                        "broken-scriptfilename" => "enable"
                )))

/etc/php/7.3/fpm/pool.d/www.conf

user = www-data
group = www-data

listen = 127.0.0.1:9000
;listen = /run/php/php7.3-fpm.sock  <--- THIS IS USED FOR UNIX SOCKETS
listen.backlog = 10240
listen.owner = www-data
listen.group = www-data
process.priority = -18

pm = dynamic
pm.max_children = 2000
pm.start_servers = 15
pm.min_spare_servers = 10
pm.max_spare_servers = 15
pm.max_requests = 0

.
.
.

--

答案1

经过进一步研究后,我在这里找到了解决方案: 如何使用 systemd 设置 unix 套接字积压?

这本质上说的是...

来自 listen(2):

如果 backlog 参数大于 /proc/sys/net/core/somaxconn 中的值,则会将其默默截断为该值;此文件中的默认值为 128。在 2.4.25 之前的内核中,此限制是一个硬编码值 SOMAXCONN,其值为 128。

因此,我将“SOMAXCONN”设置为 10240,以不限制 unix 套接字的积压,这确实增加了 UNIX 套接字的积压大小并解决了该问题:

回显“ 10240”> /proc/sys/net/core/somaxconn

进行快速修复和测试...为了使其永久生效,请将以下行添加到/etc/sysctl.conf

net.core.somaxconn = 10240

相关内容