Выделение наибольшего буфера без использования свопа - PullRequest
12 голосов
/ 14 июля 2010

В C / C ++ под Linux мне нужно выделить большой (несколько гигабайт) блок памяти для хранения данных в реальном времени от датчика, подключенного к порту Ethernet, и потоковой передачи данных со скоростью около 110 МБ / с.Я хотел бы выделить максимально возможный объем памяти, чтобы максимизировать длину последовательности данных, которую я могу хранить.Однако мне также необходимо убедиться, что не произойдет перестановка дисков, поскольку результирующая задержка и ограниченная пропускная способность доступа к диску приводят к переполнению буфера (очень ограниченного) датчика.определить, сколько памяти выделить?Я ограничен только выделением немного меньшего блока, чем указанная свободная память, или я могу более напрямую взаимодействовать с менеджером виртуальной памяти linux?

Ответы [ 5 ]

9 голосов
/ 14 июля 2010

Что ж, в Linux вы можете использовать mlock () / mlockall (), чтобы сохранить диапазон адресов в физической памяти и предотвратить его замену. Для процесса, использующего mlock, для этого требуется пара привилегий, у «man mlock» есть детали. Я не уверен насчет максимального блока mlock'able (он может отличаться от того, что кажется «свободным»), поэтому, вероятно, может помочь бинарный поиск (блокировка диапазона, в случае неудачи уменьшите размер области и т. Д.)

С другой стороны, 110 МБ / с на самом деле не проблема для твердотельного накопителя. Твердотельный накопитель на 60 ГБ со скоростью записи 280 МБ / с стоит около 200 долларов на углу. Просто скопируйте данные датчика в небольшой буфер записи и передайте их на SSD.

3 голосов
/ 14 июля 2010

Если компьютерная система предназначена для получения данных от вашего датчика, вы можете просто отключить обмен. Затем выделите как можно больший буфер, оставив в системе достаточно памяти только для необходимых инструментов.

0 голосов
/ 14 июля 2010

Каков наилучший способ определить, сколько памяти выделить?

Из-за того, как используется виртуальная память, не заменяемая память ядра, почти невозможно определить, сколькодоступ к установленной памяти может быть получен из приложения.

Лучшее, что я могу придумать, - это позволить пользователю настроить объем памяти, используемый для буферизации.

Я ограничен тольковыделяя немного меньший блок, чем указанная свободная память,

Сообщаемая свободная память на самом деле не является «свободной физической памятью».К сожалению.

или я могу более напрямую взаимодействовать с менеджером виртуальной памяти linux?

Это можно сделать с помощью пользовательского драйвера устройства, выделяющего память непосредственно в пространстве ядра.и предоставление доступа к нему через mmap().Как правило, не рекомендуется, но будет работать в специализированных случаях, например, у вас.

Однако мне также необходимо убедиться, что не произойдет подкачка диска

В темпеЧто касается разработки ядра Linux, знания устаревают довольно быстро, так что возьмите с толку соли то, что я здесь говорю.Вы можете попробовать поиграть со следующим:

  1. SysV shared memory.Это вообще не поменяно местами.См. man shmget.

  2. tmpfs - файловая система в памяти.Память была прикреплена к ОЗУ, по крайней мере, в ранних ядрах версии 2.6 и поэтому не могла быть заменена.Чтобы использовать его в качестве памяти, создайте файл в tmpfs, write() что-то в файл (для принудительного выделения памяти) и затем mmap () файл.

0 голосов
/ 14 июля 2010

После того, как вы выделите свою память, вы можете

echo 0 > /proc/sys/vm/swappiness

Попросить ядро ​​отдать предпочтение возврату памяти из кеша вместо замены.

Просто мои $ 0.2

0 голосов
/ 14 июля 2010

Если вы malloc наберете необходимый объем памяти и запишете в него с такой скоростью, вы все равно получите снижение производительности из-за всех сбоев страниц (т. Е. Сопоставление каждой страницы виртуальной памяти с физической памятью, что также можетвключить обмен памяти других процессов).

Чтобы избежать этого, вы могли бы memset весь выделенный буфер до 0, прежде чем начинать чтение с датчика, чтобы вся необходимая виртуальная память отображалась на физическую память.

Если вы используете только доступную физическую память, вам вообще не придется менять местами.Использование more приведет к тому, что память других процессов будет перенесена на диск - если эти процессы простаивают, это не должно создавать никаких проблем.Если они активны (то есть время от времени используют свою память), произойдет некоторый обмен - вероятно, с гораздо меньшей скоростью, чем пропускная способность жесткого диска.Чем больше памяти вы используете, тем больше активных процессов будет выгружаться, и будет происходить больше активности HD - в этот момент максимальный объем памяти, который вы могли бы использовать с приличной производительностью, в значительной степени является результатом проб и ошибок.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...