`nice` 对 Linux 没有太大帮助

`nice` 对 Linux 没有太大帮助

我是远程 Debian 安装的普通用户(不是管理员)。我在那里运行一个用途非常广泛的专用网络服务器。服务器每天生成的日志非常大,有时我需要将它们打包到每月的 tar 包中,并在一段时间后压缩它们。首先我尝试了这个:

tar rf 2014-12.tar 2014-12-*.log

10分钟后,一位顾客打来电话,告知服务器已停止响应。事实上,服务器进程被“搁置”,所有注意力都集中在 tar 进程上,尽管根据 的说法,总 CPU 负载top仅为 5%。然后我尝试:

nice -n19 tar rf 2014-12.tar 2014-12-*.log &

我将命令发送到后台以便能够监视服务器进程。我观察到服务器进程变慢了,但不是太多,所以这是可以接受的。一切都正常运行了大约 5 分钟,然后突然服务器再次停止运行。我杀死了 tar 进程,看到服务器立即开始工作。

服务器正在侦听许多客户端正在连接的 TCP 套接字。当 tar 运行时,服务器继续工作,但一段时间后 select 调用似乎停止更新可读套接字。

这一切都令人困惑。当其他东西正在运行时,服务器似乎会在几分钟后被切断,但除此之外,它运行几个月都没有问题。根据top,我的进程似乎从未获得超过 CPU 总量的 5% 左右,这是为什么呢?如何在不干扰服务器进程的情况下打包日志?

答案1

正如 muru 所说,nice仅控制 CPU 调度。您自己指出,当时 CPU 使用率仅为 5% 左右。这意味着系统严重受 IO 限制,这意味着读/写磁盘是瓶颈。

您可以通过命令控制赋予进程的 IO 优先级ionice。您可以将进程放入三个调度类之一:

  • 空闲 - 仅当没有其他程序需要磁盘时才会获取磁盘时间
  • 尽力而为 - 基本上是默认值
  • 实时 - 此类首先访问磁盘,无论发生什么情况

您可以使用选项指定类-c,1 = 实时,2 = 尽力而为,3 = 空闲。

在尽力而为和实时的情况下,还有 8 个不同的优先级,可以在同一级别的进程之间进行微调。

我通常执行诸如tarrsyncwith 之类的命令ionice -c3,即最低级别的“空闲”。这样其他进程就不会缺乏磁盘访问。

请注意,恕我直言,ionice与 CFQ I/O 调度程序(内核参数)配合使用效果最佳。

答案2

您观察到的行为可能是文件系统的实现细节 - 它可能会在内存中收集大量数据并将其批量写入。解决此问题的最简单方法是减少要写入的数据量 =)。我强烈建议,为了避免这个问题,请立即获取您的文件。如果磁盘速度很慢,那么存储未归档的 tar 就没有意义。要创建存档,只需将 -z 选项添加到 tar 命令行tar rzf 2014-12.tar.gz 2014-12-*.log:在大多数情况下最好使用 gzip,因为它在压缩和解压缩时只使用很少的 CPU。这种方法可以将 tar 创建时间减少 10 或 20 倍,并且还可以将文件系统写入的数据量减少相同的倍数。

我还要指出的是,每天手动涂焦油是一种奇怪的想法。我建议您设置正常的 logrorate 和 cron/anacron 作业,以便系统会自动为您完成所有这些工作。

顺便问一下,你有什么样的文件系统? (使用mount|grep $(stat --printf "%m" .)

相关内容