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ę.
1. Pokaż kod sposobu mapowania pliku. 2. Czy sprawdziłeś obciążenie systemu, iostat, tak jak zwykle? – bmargulies
dzięki bmargulies. zobacz najnowszą edycję. –