为什么"File.write"有时会变慢?

  • 本文关键字:quot File write ruby io
  • 更新时间 :
  • 英文 :


这是我的代码:

start = Time.now
File.write('/tmp/a.txt', 'Hello, world!')
puts "Saved in #{Time.now - start}"

在某些情况下,我在日志中看到了这一点:

Saved in 0.001
Saved in 0.002
Saved in 0.245
Saved in 0.002

为什么偶尔会有这样的峰值?那会是什么?我没有在任何地方使用flock。我怀疑某些库已经覆盖了该方法File.write()并在那里添加了一些锁定/同步。可能吗?

更新:似乎Dir.new(),定期访问目录,阻止访问它。

似乎应用程序的另一个位置的Dir.new()完全锁定了整个目录,不允许File.write()快速工作。这是重现问题的测试(使用线程 gem(:

require 'tmpdir'
require 'threads'
Dir.mktmpdir do |dir|
file = File.join(dir, 'hey.txt')
Thread.start do
loop do
Dir.new(dir)
end
end
Threads.new(100).assert do
start = Time.now
File.open(file, 'w+') do |f|
f.write('test')
end
puts("Saved in #{Time.now - start}")
sleep 1
end
end

这个会很慢。但是,如果将Dir.new替换为以下内容,则一切将再次快速进行:

`ls #{dir}`.split(' ')

红宝石虫?我不知道。

顺便说一句,Dir.glob()也是如此——它也非常慢。

我不确定,但我会非常惊讶那些所说的时间不是来自Ruby,而是来自你的底层操作系统(我猜是Linux(。

我在 Python 中编写了与您类似的脚本,我可以观看与您相同的差异。

我看到它是使用以下的系统调用:

sudo strace -T -e trace=open,close,write -p <my_process_pid>

至少对于open系统呼叫,我还可以看到一些呼叫比其他呼叫占用 100 次。

最新更新