写入重定向到慢速磁盘的 STDOUT 时进程变慢 [重复]

问题描述 投票:0回答:1

Process (Haproxy) 通过 subprocess.Popen:-

启动
 proc = subprocess.Popen(
    cmd,
    stdout=open(output_file, 'w'),
    stderr=subprocess.STDOUT,
    preexec_fn=os.setpgrp,
    env=self.env_variables,
)

进程通过

writev
系统调用写入标准输出。

[pid 17619] writev(1, [{iov_base="{"date_time": “01/Apr/2023:01:42”..., iov_len=628}, {iov_base=" ", iov_len=1}], 2

有一个场景是另一个进程使磁盘饱和(logrotate)。我的观察:-

  • 页面缓存大小突然增加导致内存压力
  • 进程 (Haproxy) 变慢,SSL 握手在 5 秒后开始超时。

如果有人能从操作系统的角度解释情况就太好了。 是不是内存压力大

writev
开始阻塞了?

  • 有没有更好的方法
    write
    所以进程不会阻塞?

正常

减速

  • 磁盘IO饱和度
  • 分页:磁盘缓存导致内存压力?

linux pipe paging stdio buffering
1个回答
0
投票

https://unix.stackexchange.com/questions/196432/does-tee-slow-down-pipelines 说:

磁盘写入速度变慢是内核拒绝让缓存无限增长

https://unix.stackexchange.com/questions/11946/how-big-is-the-pipe-buffer 说:

一个 Linux pipe(7) 手册页说自 Linux 2.6.11 以来管道容量为 65536 字节,在此之前的一个系统页面(例如,(32 位)x86 系统上为 4096 字节)。代码(include/linux/pipe_fs_i.h 和 fs/pipe.c)似乎使用 16 个系统页面(即如果系统页面为 4 KiB,则为 64 KiB),但每个管道的缓冲区可以通过 fcntl 进行调整管道(最大容量默认为 1048576 字节,但可以通过 /proc/sys/fs/pipe-max-size 更改)。

© www.soinside.com 2019 - 2024. All rights reserved.