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

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

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

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

Спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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.

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