2013-02-09 9 views
9

Tło:Charakterystyka działania pamięci mapowane pliku

Mam aplikacji Java, która robi intensywne IO na dość dużą pamięci mapowane plików (> 500 MB). Program czyta dane, zapisuje dane, , a czasami robi jedno i drugie.

Wszystkie funkcje odczytu/zapisu mają podobną złożoność obliczeniową.

I porównywana warstwę IO programu i zauważyłem dziwne charakterystyk pamięci mapowane plików:

  • Wykonuje 90k odsłon na sekundę (czytaj 1kB każdej iteracji w dowolnej pozycji)
  • Wykonuje 38k pisze na sekundę (zapis 1KB każda iteracja kolejno)
  • wykonuje 43K pisze na sekundę (napisać 4 bajty każdej iteracji w dowolnej pozycji)
  • wykonuje tylko 9k odczytu/zapisu połączona operacja za drugi (odczyt 12 bajtów, a następnie 1KB w każdej iteracji, w losowej pozycji)

Programy na 64-bitowym JDK 1.7, Linux 3.4.

Urządzenie to zwykły komputer z procesorem Intel z 8 wątkami i 4 GB pamięci fizycznej. Tylko 1 GB zostało przydzielone sterty JVM podczas wykonywania testu porównawczego.

Jeśli potrzebne są dalsze szczegóły, oto kod odniesienia: https://github.com/HouzuoGuo/Aurinko2/blob/master/src/test/scala/storage/Benchmark.scala

I tu jest realizacja powyższego odczytu, zapisu, odczytu/funkcje zapisu: https://github.com/HouzuoGuo/Aurinko2/blob/master/src/main/scala/aurinko2/storage/Collection.scala

Więc moje pytania to:

  • Biorąc pod uwagę ustalony rozmiar pliku i rozmiar pamięci, jakie czynniki wpływają na wydajność odczytu losowego pliku odwzorowanego w pamięci?
  • Biorąc pod uwagę stały rozmiar pliku i rozmiar pamięci, jakie czynniki wpływają na wydajność zapisu losowego w pamięci?
  • Jak wyjaśnić wynik testu porównawczego operacji odczytu i zapisu? (Spodziewałem się, że będzie wykonywać powtórzenia 20K na sekundę).

Dziękuję.

+0

1. Pokaż kod sposobu mapowania pliku. 2. Czy sprawdziłeś obciążenie systemu, iostat, tak jak zwykle? – bmargulies

+0

dzięki bmargulies. zobacz najnowszą edycję. –

Odpowiedz

0

Wydajność pliku odwzorowanego w pamięci zależy od wydajności dysku, typu systemu plików, wolnej pamięci dostępnej dla pamięci podręcznej systemu plików i rozmiaru bloku odczytu/zapisu. Rozmiar strony na linuksie to 4K. Więc powinieneś oczekiwać największej wydajności z odczytem/zapisaniem 4k. Dostęp w przypadkowej pozycji powoduje błąd strony, jeśli strona nie jest mapowana i spowoduje pobranie nowej strony. Zwykle plik mapowany jest w pamięci, jeśli chcesz zobaczyć pliki jako jedną tablicę pamięci (lub ByteBuffer w Javie).

Powiązane problemy