Управление памятью в Linux отличается от других систем. Ключевой принцип заключается в том, что память, которая не используется, является потраченной впустую. Во многих отношениях Linux пытается максимизировать использование памяти, что приводит (в большинстве случаев) к повышению производительности.
Дело не в том, что «ничего не работает» в Linux, а в том, что его поведение немного отличается от того, что вы ожидаете.
Когда страницы памяти извлекаются из mmapped-файла, операционная система должна решить, какие страницы физической памяти она освободит (или выгрузит) для использования. Он будет искать страницы, которые легче заменить (не требуют немедленной записи на диск) и которые с меньшей вероятностью будут использоваться снова.
POSIX-вызов madvice() служит для того, чтобы сообщить системе, как ваше приложение будет использовать страницы. Но, как следует из названия, это рекомендация, чтобы операционная система лучше ориентировалась в принятии решений о пейджинге и свопинге. Это не политика и не приказ.
Чтобы продемонстрировать влияние madvice() на Linux, я модифицировал одно из упражнений, которое даю своим студентам. См. полный исходный код здесь. Моя система 64-битная и имеет 2 ГБ ОЗУ, из которых сейчас используется около 50%. С помощью программы mmap файл размером 2 Гб, прочитать его последовательно и все выкинуть. Он сообщает об использовании RSS каждые 200 МБ чтения. Результаты без madvice():
<juliano@home> ~% ./madvtest file.dat n
0 : 3 MB
200 : 202 MB
400 : 402 MB
600 : 602 MB
800 : 802 MB
1000 : 1002 MB
1200 : 1066 MB
1400 : 1068 MB
1600 : 1078 MB
1800 : 1113 MB
2000 : 1113 MB
Linux продолжал выталкивать данные из памяти, пока не было прочитано около 1 ГБ. После этого начал давить на сам процесс (поскольку остальные 50% памяти были активны другими процессами) и стабилизировался до конца файла.
Теперь с madvice():
<juliano@home> ~% ./madvtest file.dat y
0 : 3 MB
200 : 202 MB
400 : 402 MB
600 : 494 MB
800 : 501 MB
1000 : 518 MB
1200 : 530 MB
1400 : 530 MB
1600 : 530 MB
1800 : 595 MB
2000 : 788 MB
Обратите внимание, что Linux решил выделять страницы процессу только до тех пор, пока он не достигал примерно 500 МБ, гораздо раньше, чем без madvice(). Это связано с тем, что после этого страницы, находящиеся в настоящее время в памяти, казались гораздо более ценными, чем страницы, которые были помечены как последовательный доступ этим процессом. В VMM есть порог, определяющий, когда начинать удалять старые страницы из процесса.
Вы можете спросить, почему Linux продолжал выделять страницы размером до 500 МБ и не остановился намного раньше, поскольку они были помечены как последовательный доступ. Дело в том, что либо в системе было достаточно свободных страниц памяти, либо другие резидентные страницы были слишком стары, чтобы их можно было сохранить. Между сохранением в памяти старых страниц, которые больше не кажутся полезными, и увеличением количества страниц для обслуживания программы, которая работает сейчас, Linux выбирает второй вариант.
Даже если они были отмечены как последовательный доступ, это был просто совет. Приложение может по-прежнему хотеть вернуться к этим страницам и прочитать их снова. Или другое приложение в системе. Вызов madvice() говорит только о том, что делает само приложение, Linux принимает во внимание более широкую картину.
person
Juliano
schedule
24.09.2010