приложение работает медленно после использования большого объема памяти - PullRequest
1 голос
/ 30 марта 2011

Я занимаюсь кроссплатформенной разработкой программного обеспечения в среде встроенного Linux. Я вижу, что мое приложение работает очень медленно, когда оно начинает использовать более 30 МБ памяти.

Я придерживался двух разных подходов, но оба в результате получили одинаковые результаты.

Подход 1

Распределение с использованием valloc (требуется выровненная память), я сохранил количество памяти, выделенной после достижения 30 МБ, приложение работает медленно.

Подход 2

Выделите большой объем памяти 40 МБ при инициализации. Дальнейшее распределение выполняется из этого раздела (никогда не освобождается при выполнении программы). Приложение снова работает медленно, если используется более 30 МБ. Однако все, что меньше 30 МБ, работает хорошо.

PS: я мог бы использовать этот подход, так как были выделены единые блоки памяти. Общий объем доступной памяти составляет 128 МБ.

Мне интересно, почему мое приложение замедляет доступ к памяти, даже если распределение прошло успешно.

# more /proc/meminfo
MemTotal:        92468 kB
MemFree:         50812 kB
Buffers:             0 kB
Cached:          22684 kB
SwapCached:          0 kB
Active:           4716 kB
Inactive:        18540 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:        92468 kB
LowFree:         50812 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:               0 kB
Writeback:           0 kB
AnonPages:         600 kB
Mapped:            952 kB
Slab:             7256 kB
PageTables:        108 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:     46232 kB
Committed_AS:     1736 kB
VmallocTotal:   262136 kB
VmallocUsed:     10928 kB
VmallocChunk:   246812 kB

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Общий объем доступной памяти составляет 128 МБ

Насколько ты уверен в этом числе? Если это общая системная память, некоторое количество будет использовано ядром, драйверами и другими процессами. Может быть, после выделения 30 МБ памяти вы начнете перезаписываться на диск. Это, безусловно, объясняет внезапную медлительность.

0 голосов
/ 31 марта 2011

Мне интересно, почему мое приложение замедляет доступ к памяти, даже если распределение прошло успешно.

Возможно, потому что Linux фактически не будет поддерживать виртуальное распределение с физическими страницами, пока вынапиши им.Таким образом, хотя ваш malloc () завершается успешно, он действительно обновляет таблицы страниц только до тех пор, пока вы фактически не используете эту память.

Если посмотреть на ваш дамп meminfo выше, я думаю, что в системе свободно около 50 МБ:

MemFree: 50812 КБ

Кроме того, в качестве кэша используется около 22 МБ:

Кэшировано: 22684 КБ

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

Я отмечаю, что у вас не включен swap (SwapTotal равен 0 КБ).Если бы вы это сделали, ваше приложение могло вызывать перебои в работе виртуальной машины.

Если бы вы пытались отлаживать это, я бы попытался запустить "top", когда мое приложение достигло точки использования памяти 30 МБ и проверил, есть ли какое-либо ядро.темы внезапно становятся более занятыми.Я также использовал бы «vmstat» для отслеживания системного ввода-вывода и распределения кеша / буфера памяти.Наконец, я попробую немного покопаться в файловой системе / proc, чтобы посмотреть, сможете ли вы там что-нибудь почерпнуть (например, стоит посмотреть / proc / sys / vm).

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