Почему `File.write` иногда тормозит? - PullRequest
0 голосов
/ 25 октября 2018

Это мой код:

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(), который регулярно получает доступ к каталогу, блокирует доступ к нему.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Кажется, что Dir.new() в другом месте приложения полностью блокирует весь каталог и не позволяет File.write() работать быстро.Это тест для воспроизведения проблемы (с использованием threads 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(' ')

Ошибка Ruby?Я не знаю.

Кстати, то же самое относится и к Dir.glob() - это тоже очень медленно.

0 голосов
/ 25 октября 2018

Я не уверен, но я был бы очень удивлен, если бы кто-то говорил о том, что время исходит не от Ruby, а от вашей базовой операционной системы (Linux, я думаю).

Я написал сценарий, аналогичный вашему, в PythonЯ мог бы наблюдать ту же разницу, что и вы.

Я смотрю, как это системный вызов, используя:

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

И, по крайней мере, для системного вызова open я мог бы также наблюдатьнекоторые звонки занимают в 100 раз больше времени, чем другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...