我正在管理一台服务器,该服务器用作大量文件的远程日志存储库。目前单个logrotate
实例无法跟上这个数量的日志。加速日志轮转(可能并行运行多个实例)的最佳方法是什么?
以下是澄清的附录:
- 磁盘 I/O 不是问题;另外,我不会丢失任何日志或条目。
- 与这项工作相比,系统是一个野兽(它是具有足够功率的四核至强),瓶颈在于压缩。一个核心已达到 1.00 负载,但无法完成其压缩队列。
- 不复制日志文件。仅将每日备份保存到另一个磁盘,但这也不是瓶颈。
- 我可以按模式对日志文件进行分组。文件并不大,只是很多。我只是不知道如何并行化日志旋转,尽管我有想法但无法找到任何资源。实际上,问题的核心是 logrotate 是否为配置文件或配置文件中的每个存根生成一个子进程?
答案1
您可以运行 logrotate 的多个实例。他们需要处理不同的文件集并使用不同的状态文件。
您应该使用 gzip(标准压缩)而不是 bzip。据我所知,您可以向 gzip 传递一些额外的选项 - 这样您就可以告诉它使用更快的压缩。
答案2
请告诉我们更多有关您的要求的信息 - 很难猜测是什么限制了您的服务器:
- 磁盘输入/输出?您可能希望将这些日志文件分布在磁盘/文件系统上
- cpu - 是否在旋转这些日志时压缩这些日志?您可能想要使用具有内部压缩甚至硬件加速的文件系统。
- 目录缓存?请参阅 Chris Card 的答案 - 将文件分布在目录中,并且同样重要的是,使这些文件的文件名的早期字符有所不同,否则您将看不到应用于它们的目录缓存的好处,这会减慢查找速度显著地。
- 如果您的服务器达到了其限制 - 日志轮换是否如此,或者是否已经丢失了日志条目?
- 您是在复制这些日志文件,还是在移动它们(在同一文件系统内)?
- ...
如果您为日志文件设计一个结构,那么没有什么可以阻止您并行旋转它们。
编辑以回复添加的要求
据我所知,logrotate 本身并不并行化。一旦你建立了一个清晰的结构,你可以探索一些方法来手动并行化它(或者至少是那些让你陷入困境的部分):
- 压缩命令本身:您可以使用包装脚本来进行压缩。当您的脚本立即返回时,生成的 gzip 可以在后台运行 - 从而使压缩作业保持运行,而 logrotate 愉快地继续处理下一个日志文件。两个注意事项:
- 我宁愿安全并打开
delaycompress
以避免在进程被 SIGHUP 或任何启动新日志(取决于进程)时仍然摆弄日志文件。 - 我还希望压缩作业“良好”,以避免许多并行压缩作业竞争 CPU 时间。
- 我宁愿安全并打开
- 如果您感觉很复杂(或者最终遇到大量并行 gzip 作业限制日志主机),您可以稍后过渡到编写一组工作进程,从“压缩命令”脚本生成的列表中获取要压缩的文件在你的 logrotate 配置中说明。
- 您可以通过一些规划来运行 logrotate 的独立实例:
- 每个实例都需要自己的配置文件。
- 每个实例都需要自己的一组目录来监视日志文件。您可以(并且可能应该)为它们设置单独的 crontab 条目。
- 每个实例都需要自己的
statefile
(可配置)
答案3
可能有帮助的一件事是不要将所有日志放在同一目录中 - 在同一目录中放置大量文件会严重降低性能。
答案4
如果您的主机有许多 cpu 核心,但默认压缩实用程序是单线程的,并且在单个核心上遇到瓶颈,您可以利用其他核心的更多压缩吞吐量来更快地完成压缩任务。例如,pigz 代替 gzip,pbzip2 代替 bzip2。