Измерение использования стека для многопоточного приложения Linux

Я разрабатываю многопоточное приложение для встроенной платформы Linux.

На данный момент я устанавливаю размер стека для каждого потока (через pthread_set_attr) на довольно большое значение по умолчанию. Я хотел бы точно настроить это значение для каждого потока на что-то меньшее, чтобы уменьшить использование памяти моим приложением. Я мог бы пройти путь проб и ошибок, устанавливая размер стека каждого потока на все меньшие значения, пока программа не выйдет из строя, но приложение использует ~ 15 потоков, каждый с совершенно разными функциями / атрибутами, поэтому такой подход будет чрезвычайно трудоемким.

Я бы предпочел иметь возможность напрямую измерять использование стека каждого потока. Могут ли какие-нибудь утилиты порекомендовать это сделать? (Например, я нахожусь в фоновом режиме vxWorks и использую команду 'ti' из оболочки vxWorks напрямую, выдает статистику использования стека, а также другую полезную информацию о статусе задачи.)

Спасибо

Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Пройдите собеседование по Angular: Общие вопросы и ответы экспертов
Пройдите собеседование по Angular: Общие вопросы и ответы экспертов
Можете ли вы объяснить разницу между ngOnInit и конструктором в Angular?
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
4
0
9 279
3

Ответы 3

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

__thread void* stack_start;
__thread long stack_max_size = 0L;

void check_stack_size() {
  // address of 'nowhere' approximates end of stack
  char nowhere;
  void* stack_end = (void*)&nowhere;
  // may want to double check stack grows downward on your platform
  long stack_size = (long)stack_start - (long)stack_end;
  // update max_stack_size for this thread
  if (stack_size > stack_max_size)
    stack_max_size = stack_size;
}

Функция check_stack_size () должна быть вызвана в некоторых из наиболее глубоко вложенных функций.

Затем в качестве последнего оператора в потоке вы можете куда-то вывести stack_max_size.

Переменная stack_start должна быть инициализирована в начале вашего потока:

void thread_proc() {
  char nowhere;
  stack_start = (void*)&nowhere;
  // do stuff including calls to check_stack_size()
  // in deeply nested functions
  // output stack_max_size here
}

Ссылаясь на ответ Тоби: вы можете использовать pthread_attr_getstackaddr для получения базы стека в любое время, если сложно установить переменную при инициализации потока. Затем вы можете получить адрес автоматической переменной в своей собственной функции, чтобы определить, насколько глубок стек в данный момент.

Вот два инструмента, которые измеряют использование стека (собственных потоков pthreads) в приложениях Linux:

Валгринд

Использование:

valgrind --tool=drd --show-stack-usage=yes PROG

Valgrind - стабильный и мощный инструмент, полезный не только для измерения использования стека. Однако он может поддерживать не все модели встроенных процессоров.

Stackusage

Использование:

stackusage PROG

Stackusage - это легкий инструмент, специально разработанный для измерения использования стека потоков, который должен быть портативным для большинства встраиваемых платформ Linux, оснащенных glibc. Вероятно, на данный момент он не так хорошо протестирован или зрел, как Valgrind / drd.

Полное раскрытие: я автор Stackusage.

Другие вопросы по теме