производительность munmap в Linux - PullRequest
1 голос
/ 22 марта 2012

У меня есть многопоточное приложение на RHEL 5.8, которое читает большие файлы (около 500 МБ каждый) через mmap и выполняет их обработку;один поток выполняет mmap, а другие - обработку.Когда файл больше не находится в файловой системе, выполняется munmap для освобождения памяти.Моя проблема в том, что munmap (и иногда закрытие файла) замедляет работу других потоков, выполняя операции с другой памятью, поэтому мне интересно, есть ли лучший способ реализовать это.У меня есть 2 идеи: разделить память на более мелкие куски, чтобы munmap меньшие блоки (это вообще возможно?), Или вообще не использовать munmap и распределять / освобождать память самостоятельно, при желании кэшировать блоки памяти, если файл больше не находится в файловой системе,и повторно использовать его для следующего файла.Спасибо за любые идеи.

Ответы [ 4 ]

1 голос
/ 01 июня 2014

Фактическая причина замедления заключается в том, что munmap() принимает блокировку mm-> mmap_sem на весь период системного вызова. Некоторые другие операции могут быть заблокированы этим, например (но не ограничиваясь) fork() / mmap(). Это особенно важно отметить для архитектур, которые не реализуют операцию без блокировки get_user_pages_fast() для страниц, уже находящихся в памяти, потому что группа операций futex (которые лежат в основе примитивов pthread) будет вызывать get_user_pages_fast(), и реализация по умолчанию попытается принять блокировка чтения на mmap_sem.

0 голосов
/ 22 марта 2012

Когда файл больше не находится в файловой системе, выполняется munmap

Итак, вы вызываете munmap, когда файл не связан с файловой системой. Тогда, вероятно, что замедляет систему, так это фактическое удаление inode, которое выполняется, когда все записи каталога, файловые дескрипторы и карты памяти освобождены.

Известны проблемы с производительностью удалений в некоторых файловых системах в linux (ext3). Если это так, вы можете попробовать перейти на ext4 (с экстентами), если это возможно в вашем сценарии.

Другой вариант - жестко связать файлы в другом каталоге, чтобы они не были действительно удалены, когда вы munmmap их. Затем вы можете вызвать ionice -c 3 rm <last-link> или аналогичный, чтобы фактически удалить их в фоновом режиме ...

0 голосов
/ 16 мая 2012

То, что я в итоге сделал (и этого оказалось достаточно), это munmap большой блок памяти по частям, например, у меня был блок 500 МБ, и я выполнил munmap в кусках 100 МБ.

0 голосов
/ 22 марта 2012

Если вы читаете память последовательно, попробуйте регулярно использовать posix_madvise() с MADV_DONTNEED на прочитанных страницах памяти. Смотрите posix_madvise () .

Он также доступен как madvise() под Linux. См. madvise ()

...