Безопасно ли использовать lseek () при чтении из файлов Proc-FS во второй раз? - PullRequest
8 голосов
/ 25 января 2011
  1. Безопасно ли использовать lseek(fd,0), а затем read(fd,buf) для /proc/stat файла вместо его повторного открытия для получения обновленного содержимого этого файла в следующий раз?
  2. А что на самом деле вызывает mmap() после открытия этого файла (см. Ниже)?

Проблема, с которой я сталкиваюсь, заключается в том, что в верхних отчетах слишком низкая загрузка ЦП (10% против 100% для программных прерываний). Strace указывает, что top не открывает этот файл заново, а вместо этого ищет начало и читает его еще раз. И каким-то образом содержимое, которое читается из этого файла в следующий раз, не совпадает с тем, что я получаю, когда запускаю cat только для файла /proc/stat.

Кроме того, если я одновременно запускаю top и cat /proc/stat в цикле, top начинает сообщать о правильном использовании CPU.

Еще одно отличие, которое я замечаю, состоит в том, что top использует вызов mmap() сразу после открытия файла /proc/stat, тогда как cat этого не делает. Я не уверен, может ли это также быть связано с моей проблемой (потому что filesdes=-1 здесь):

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7b37649000

Я использую Ubuntu 10.04.1 Desktop edition с 2.6.32-27-образом сервера. Процессор Intel Q6600.

1 Ответ

4 голосов
/ 25 января 2011

Это очень интересно, что вы спрашиваете ... Я начинаю проверять свою машину, но я не вижу различий между cat / proc / stat и execute top. В любом случае, я на работе и я не совсем «свободен» в проведении тестов.

Способ, которым вы описываете «обновить» открытый файл для чтения новых данных, верен ... в случае вызова [f | l] seek () до конца, а затем до начала файла обновит EOF и новые данные будут прочитаны.

Я не думаю, что вызов mmap () вызовет проблему, о которой вы говорили, это может сделать чтение быстрее, но ничего более (я не уверен на 100%).

Я бы посоветовал вам сделать небольшое приложение на C, которое будет открывать / proc / stat, читать его, искать его и читать снова, чтобы увидеть, как оно обновляется, также, если у вас есть стресс-тест, который может быть полезен.

Теперь, отвечая на ваши реальные вопросы:

  1. Да, AFAIK уверен, потому что вы будете «ждать» новых данных в файле, и это должно быть лучше, чем открывать и закрывать файл все время.

  2. Он отображает файл в адресное пространство процесса, вот некоторая информация и примеры:

http://www.gnu.org/s/libc/manual/html_node/Memory_002dmapped-I_002fO.html http://www.linuxquestions.org/questions/programming-9/mmap-tutorial-c-c-511265/

...