2010-06-22 5 views
2

Здравствуйте, я разработал многопоточное TCP-серверное приложение, которое позволяет 10 параллельным соединениям получать от них непрерывные запросы после того, как некоторые запросы на обработку откликаются на них. Я запускаю его на плате процессора TI OMAP l137, на котором работает Monta Vista Linux. На каждый клиент создаются потоки, т. Е. 10 потоков, и он предварительно заправлен. это физическое использование памяти составляет около 1,5%, а загрузка процессора составляет около% 2 в соответствии с ps, top и meminfo. Использование vm возрастает до 80M, где у меня есть 48M (я уменьшил его из u-boot, чтобы зарезервировать некоторый mem для DSP). Любая помощь приветствуется, как я могу ее уменьшить ?? (/ proc/sys/vm/.. трюки не помогают :)Потребление виртуальной памяти pthreads

Спасибо.

ответ

1

Вы можете попробовать использовать drop in garbage collecting replacement for malloc(), и посмотреть, если это решает твоя проблема. Если это так, найдите утечки и исправьте их, а затем избавьтесь от сборщика мусора.

Его «интересно» преследовать такие проблемы на платформах, которые большинство анализаторов и профилей кучи (например, valgrind) не полностью поддерживают (если вообще).

С другой стороны, учитывая ограничения .. Предполагаю, что вы уменьшили размер стека по умолчанию? Я думаю, что по умолчанию 8M, вам, вероятно, это не нужно. См. pthread_attr_setstacksize(), если вы не настроили его.

Edit:

Вы можете проверить размер стека по умолчанию с pthread_attr_getstacksize(). Если он находится в 8 м, вы уже взорвали свой потолок во время создания потока (10 потоков, как вы упомянули).

+0

ulimit не помогает, я попробую pthread_attr_setstacksize(), я думаю, что это значение по умолчанию, если оно не задано конфигурацией ядра. – yet

+0

@yet, то каждый поток, вероятно, имеет либо стек 4 или 8 МБ. Вы можете проверить с помощью pthread_attr_getstacksize(), чтобы увидеть значение по умолчанию. –

+0

спасибо! использование виртуальной памяти в настоящее время прекрасное, это сработало спасибо. – yet

0

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

+0

Он остается там и работает хорошо для дневного времени, но через 48 часов он был убит магической силой, о которой я не мог найти. dmesg, а другие журналы чисты, процесс только что закончился. – yet

+0

Я бы сказал, что «магическая сила» - это утечка памяти, из-за которой ваше приложение выхлопает кучу. –

+0

спасибо btw, если он убит OOM-Killer, где я могу найти журналы? как я сказал, это как волшебная рука, которая останавливает его. (я дважды проверил логины :) – yet

1

Большинство виртуальных машин, вероятно, предназначены только для стеков. Конечно, он виртуальный, поэтому он не получает, если вы его не используете.

(мне интересно, если размер стека по умолчанию потока не имеет ничего общего с -s) все ограничения

Видимо да, по this other SO question

+0

yes ulitit verboses, что он неограничен, я пробовал это сегодня утром, это не помогло, я постараюсь установить ограничение на конкретное количество потоков. – yet

Смежные вопросы