У меня сбитая с толку проблема. У меня есть библиотека, которая использует sg для выполнения настраиваемых CDB. Есть несколько систем, которые обычно имеют проблемы с распределением памяти в sg . Обычно драйвер sg имеет жесткое ограничение около 4 МБ, но мы видим его на этих нескольких системах с ~ 2,3 МБ запросов. То есть CDB готовятся выделить для передачи 2,3 Мб. Здесь не должно быть никаких проблем: 2.3 <4.0.
Теперь о профиле машины. Это 64-битный процессор, но работает с 32-битным CentOS 6.0 (я их не собирал и не имею никакого отношения к этому решению). Версия ядра для этого дистрибутива CentOS - 2.6.32. У них 16 ГБ оперативной памяти.
Вот как выглядит использование памяти в системе (хотя, поскольку эта ошибка возникает во время автоматического тестирования, я еще не проверил, отражает ли это состояние, когда это errno возвращается из sg ).
top - 00:54:46 up 5 days, 22:05, 1 user, load average: 0.00, 0.01, 0.21
Tasks: 297 total, 1 running, 296 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 15888480k total, 9460408k used, 6428072k free, 258280k buffers
Swap: 4194296k total, 0k used, 4194296k free, 8497424k cached
Я нашел эту статью из Linux Journal, которая посвящена распределению памяти в ядре. Статья датирована, но, похоже, относится к 2.6 (некоторые комментарии об авторе во главе). В статье упоминается, что ядро ограничено примерно 1 ГБ памяти (хотя из текста не совсем ясно, если этот 1 ГБ каждый для физического и виртуального или общего объема). Мне интересно, если это точное утверждение для 2.6.32. В конечном счете, мне интересно, достигают ли эти системы этого предела.
Хотя это не совсем ответ на мою проблему, я задаюсь вопросом о правдивости претензии к 2.6.32. Итак, каков фактический предел памяти для ядра? Это может потребоваться для устранения неполадок. Любые другие предложения приветствуются. То, что делает это настолько озадачивающим, - то, что эти системы идентичны многим другим, которые не показывают ту же самую проблему.
источник
Я хочу добавить немного к отличному ответу Уоррена Янга , потому что на самом деле все хуже, чем он пишет.
Адресное пространство ядра в 1 ГБ дополнительно разделено на две части. 128 МБ для
vmalloc
и 896 МБ дляlowmem
. Не берите в голову то, что это фактически означает. При распределении памяти код ядра должен выбрать, какой из них он хочет. Вы не можете просто получить память из того пула, где есть свободное место.Если вы выберете
vmalloc
, вы ограничены 128 МБ. Теперь 1ГБ выглядит не так уж плохо ...Если вы выбираете
lowmem
, вы ограничены до 896 МБ. Не так далеко от 1 ГБ, но в этом случае все выделения округляются до следующей степени 2. Таким образом, распределение 2,3 МБ фактически потребляет 4 МБ. Кроме того, вы не можете выделить более 4 МБ за один вызов при использованииlowmem
.64-битный действительно правильный ответ.
источник