2011-01-24 10 views
8
  1. Czy można bezpiecznie korzystać lseek(fd,0) a następnie read(fd,buf) dla /proc/stat plik zamiast wznowienie go dostać aktualizowane zawartość tego pliku następnym razem?
  2. Co naprawdę robi wywołanie mmap() po otwarciu tego pliku (patrz poniżej)?

Problem, który napotykam, polega na tym, że najlepsze raporty to zbyt niskie użycie procesora (10% w porównaniu do 100% w przypadku przerwania oprogramowania). Strace wskazuje, że top nie otwiera ponownie tego pliku, ale zamiast tego lseksuje na początek i czyta go jeszcze raz. I w jakiś sposób zawartość, która zostanie odczytana z tego pliku następnym razem, nie pasuje do tego, co otrzymam, gdy uruchomię program cat tylko dla pliku /proc/stat.jest to bezpieczne w użyciu lseek() podczas odczytu z Proc-FS Pliki raz drugi

Również, jeśli uruchomię top i cat /proc/stat w pętli w tym samym czasie, wówczas top zacznie raportować poprawne użycie procesora.

Jeszcze jedna różnica, którą dostrzegam, to to, że najlepsze połączenie używa mmap() zaraz po otwarciu pliku /proc/stat, podczas gdy cat nie robi tego. Nie jestem pewien, czy to może być również związane z moim problemem (bo filesdes=-1 tutaj):

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

Używam wydanie Ubuntu 10.04.1 pulpitu z 2.6.32-27-serwer obrazu. Procesor to Intel Q6600.

Odpowiedz

4

Bardzo interesujące jest to, o co prosisz ... Rozpoczynam sprawdzanie w mojej maszynie, ale nie widzę różnic między kotem/proc/stat i wykonaniem góry. Tak czy inaczej, jestem w pracy i nie jestem całkowicie "wolny", aby robić testy.

Sposób, w jaki opisujesz "odświeżanie" otwartego pliku w celu odczytania nowych danych, jest poprawny ... w przypadku wywołania [f | l] seek() do końca, a następnie do początku pliku zostanie zaktualizowany EOF i nowe dane zostaną odczytane.

Nie sądzę, że wywołanie mmap() spowoduje problem, o którym wspomniałeś, może sprawić, że odczyt będzie szybszy, ale nic więcej (nie jestem w 100% pewny).

Proponuję Ci zrobić małą aplikację w C, która otworzy/proc/stat, przeczytaj ją, poszukaj i przeczytaj ponownie, aby zobaczyć, jak jest zaktualizowana, również jeśli masz do wykonania jakiś test warunków skrajnych.

Teraz, odpowiadając na realne pytania:

  1. Tak, AFAIK to z pewnością dlatego, że będzie „czeka” na nowych danych na plik i powinno być lepiej niż otwarty i zamknij plik cały czas .

  2. To odwzorowuje plik do przestrzeni adresowej procesu, oto kilka przykładów i informacji:

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

+0

Tak jest w przypadku lseek. Wydaje się, że htop jest zaimplementowany do ponownego otwierania pliku/proc/stat za każdym razem przed jego odczytaniem, ale w międzyczasie htop zgłasza również nieprawidłowe użycie procesora. Możemy więc prawdopodobnie wykluczyć lseek(). –

Powiązane problemy