Pureftpd-当 LimitRecursion 超过 30000 时出现错误 421 内存不足

Pureftpd-当 LimitRecursion 超过 30000 时出现错误 421 内存不足


我们目前正在运行 Ubuntu 16.04.3 服务器

  • 中央处理器:英特尔至强 E3-1270v6 - 4c/8t - 3.8GHz /4.2GHz
  • 内存:64G DDR4 ECC 2400MHz
  • 硬盘:2 x 1.2To SoftRaid nvme

这是一个专用服务器,我们可以通过 SSH 等进行完全访问。

我们有一些目录包含大量文件(超过 50000 个)。我们希望它们可以通过 FTP 访问。当我们尝试将 LimitRecursion(默认值为“2000 8”)更新为“50000 8”时,通过 FTP 客户端(Filezilla 或 WinSCP,同样的问题)浏览这些目录时出现错误:

  • 421 - 内存不足

我不明白 pure-FTPd 如何管理内存,在 readme 文件中我没有看到任何可以调整的选项,这样我就可以显示所有文件。
显示这些文件夹的所有文件不是可选的。

如能得到任何帮助或建议我将非常感激。

答案1

我在 pure-ftpd 安装中遇到了同样的问题,经过一些调试后,我发现了问题所在。Linux 有一个限制(进程数据段的最大大小),默认情况下为 16k。您可以更改此限制/etc/security/limits.conf并设置更高的值,或者ulimit -d unlimited在运行pure-ftpd守护程序脚本之前运行。

不幸的是,这并不能解决问题。

pure-ftpd作为守护进程运行,主进程可能具有不受限制的进程数据段最大大小。但是,pure-ftpd会创建具有为每个 ftp 用户指定的 uid 的子进程。此子进程不会从其父进程继承最大大小限制。子进程运行时限制为 16kb,并 pure-ftpd返回错误 421 内存不足。

我尝试更改/etc/security/limits.conf文件以添加配置的用户pure-ftpd,但仍然不起作用。我还尝试为所有用户 (*) 添加一行,但同样不起作用。

我找到了一种忽略这些限制的解决方法,尽管这不是最好的解决方案。

有一个内核参数 ( ignore_rlimit_data) 可以禁用这些限制。您可以通过修改将其设置为启动选项grub.cfg(取决于 Linux 版本)。此解决方案需要重新启动系统。您还可以通过运行以下命令在正在运行的 Linux 上更改此选项:

#echo "Y" > /sys/module/kernel/parameters/ignore_rlimit_data

这解决了这个问题,但我想知道如何让纯子进程继承 ulimit 值。

相关内容