AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1036195
Accepted
zwol
zwol
Asked: 2020-10-03 12:28:47 +0800 CST2020-10-03 12:28:47 +0800 CST 2020-10-03 12:28:47 +0800 CST

通过 systemd 套接字激活传递 8192 个套接字 - E2BIG 失败

  • 772

我正在尝试让 systemd 启动一个守护进程并将 8,192 个监听套接字传递给它。我有一个.service和.socket文件可以可靠地使用更多“正常”数量的侦听套接字,如下所示:

# a-daemon.socket
[Unit]
Description=A Daemon (sockets)
After=network.target

[Socket]
Accept=no
ListenStream=8192

# a-daemon.service
[Unit]
Description=A Daemon
After=network.target
Requires=a-daemon.socket

[Install]
WantedBy=multi-user.target

[Service]
Type=notify
ExecStart=/usr/local/sbin/a-daemon

但是如果我换成a-daemon.socket一个有 8,192ListenStream行的版本,每个 TCP 端口从 8192 到 16383(含)一个,那么守护程序将不再启动。套接字单元可以正常启动,但服务单元失败;我得到的唯一错误信息是

systemd[17563]: a-daemon.service: Failed to execute command: Argument list too long
systemd[17563]: a-daemon.service: Failed at step EXEC spawning /usr/local/sbin/a-daemon: Argument list too long

据我了解,这实际上不是参数 list的问题,因为 systemd 不会将套接字 fd 编号放在守护进程的命令行或类似的东西上。我猜这是同时打开文件数量限制的问题,所以我设置DefaultLimitNOFILE=32768了/etc/systemd/system.conf一个等效设置/etc/security/limits.conf并重新启动。没变。然后我把ExecStartPre=/usr/sbin/prlimit -n.service文件放进去,尝试重启,确认增加的限制已经生效:

prlimit[18134]: RESOURCE   DESCRIPTION                             SOFT      HARD UNITS
prlimit[18134]: NOFILE     max number of open files               32768     32768 files

但是服务仍然失败,同样的方式。现在我没有主意了。你能建议我可以尝试做些什么来完成这项工作吗?

(我知道监听 8,192 个连续的 TCP 端口是一件很奇怪的事情。请相信我,我有一个很好的理由,我不能分享。)

socket systemd max-file-descriptors
  • 1 1 个回答
  • 357 Views

1 个回答

  • Voted
  1. Best Answer
    zwol
    2020-10-04T06:27:22+08:002020-10-04T06:27:22+08:00

    再看一下 systemd 联机帮助页后,我意识到systemd 在该区域中放置了一些东西,其argv大小与侦听套接字的数量成正比:

    sd_listen_fds_with_names()类似于sd_listen_fds(),但也可以选择返回一个字符串数组,其中包含传递的文件描述符的标识名称,如果可用且 names 参数为非 NULL 的话。此信息是从$LISTEN_FDNAMES[environment] 变量中读取的,该变量可能包含以冒号分隔的名称列表。对于套接字激活的服务,这些名称可以使用FileDescriptorName= 套接字单元文件中的设置进行配置,详情请参阅systemd.socket(5)。

    (粗体 - 我的重点)这意味着,如果您ListenStream在套接字单元文件中有 8192 个条目,systemd 将尝试将LISTEN_FDNAMES=[name]:[name]:...8192 重复(设置在哪里name)FileDescriptorName放入服务环境中。FileDescriptorName默认为套接字单元文件的完整基本名称。这很容易溢出 Linux 对单个环境变量名称+值(通常为 128k)长度的相当低的固定限制MAX_ARG_STRLEN,从而execve(2)导致E2BIG.

    对于一个不关心名字的守护进程,解决方法是把

    UnsetEnvironment=LISTEN_FDNAMES
    

    在服务文件([Service]部分)中。这消除了问题环境变量并使内核满意。

    如果您确实需要某些 fd 名称并且您达到了此限制,我不知道您会做什么。

    • 1

相关问题

  • 绑定到端口 < 1024 是否仍然只有 Unix 系统上的 root 权限?

  • 通过 WMI 确定 CPU 处理器与套接字

  • 如何在 Mac OS X 上找到 Unix 域套接字的另一点来写入/读取它?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve