【发布时间】:2011-08-16 10:22:26
【问题描述】:
在我的服务器进程中,它看起来像这样:
主要后端进程:
处理大量文件,并将它们记录在 MySQL 中。
每完成 500 个文件,它就会将“进度报告”写入一个单独的文件
/var/run/progress.log,就像这样“完成 200/5000 个文件”它由 4 个子进程进行多进程处理,每个子进程都确保在单独的文件上运行。
Web服务器进程:
- 通过 Ajax 每 10 秒读取一次
/var/run/progress.log的输出并报告到进度条。
在处理非常大的文件列表(例如超过 3 GB 的存档)时,进程会在处理大约 2 小时后锁定。
我找不到发生了什么。这是否意味着/var/run/progress.log 导致了 I/O 死锁?
【问题讨论】:
-
你自己填写'/var/run/progress.log'文件还是使用一些标准的日志模块?
-
我自己,但写入总是立即关闭。它们就像每 3-5 秒写入一次,具体取决于文件的大小。
-
除非你使用文件锁,否则没有 I/O 死锁之类的东西——它是你程序某处的错误。在进程上运行
strace -p以查看它正在尝试做什么。 -
让我们说,当一个进程打开一个文件并将数据写入其中,然后另一个文件尝试读取(打开的文件未关闭)不会导致 IO 减速/锁定?
-
不,它不会死锁。但是,您的阅读应用程序可以读取部分更新。如果您的解析代码未编写为预期无效数据,则您可能会遇到来自意外地方的异常。根据您的代码结构,这很容易导致出现“死锁”
标签: python linux performance io deadlock