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)。我的观察:-
如果有人能从操作系统的角度解释情况就太好了。 是不是内存压力大
writev
开始阻塞了?
write
所以进程不会阻塞?减速
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 更改)。