Почему этот поток в моей программе будет голодать?

#linux #multithreading #pthreads #starvation

#linux #многопоточность #pthreads #голодание

Вопрос:

У меня есть программа, которая имеет около 80 потоков. Он работает на компьютере с ~ 50-дюймовым ядром в Linux 3.36. Одновременно запущено не более 2 таких программ, и они идентичны. На компьютере больше ничего не запущено.

Сами потоки представляют собой Linux pthreads реального времени с политикой SCHED_RR (циклический перебор).

  • 10 имеют наивысший приоритет (да, я установил ulimit равным 99), а для cpu установлено значение привязки к 10 ядрам. Другими словами, каждый из них привязан к своему собственному ядру.
  • около 60 имеют средний приоритет.
  • около 10 имеют низкий приоритет.

10 потоков с наивысшим приоритетом постоянно используют процессор.

Остальные выполняют сетевой ввод-вывод, а также выполняют некоторую работу с процессором. Вот проблема: я вижу, что один из потоков с низким приоритетом голодает, иногда более 15 секунд за раз. Этот конкретный поток ожидает в сокете TCP некоторых данных. Я знаю, что данные были полностью отправлены, потому что я вижу, что сервер на другом конце соединения отправил данные (т. Е. Он регистрирует временную метку после отправки данных). Обычно потоку требуются миллисекунды, чтобы получить и обработать его, но время от времени это займет 15 секунд после того, как другой сервер успешно отправит данные. Обратите внимание, что увеличение приоритета потока и привязка его к процессору устранили эту проблему, но это не долгосрочное решение. Я бы не ожидал такого поведения в первую очередь — 15 секунд — это очень долгое время.

Кто-нибудь знает, почему это происходит? Мы исключили, что это какая-либо логика в программе / потоках. Также обратите внимание, что программа написана на C.

Комментарии:

1. Вы могли бы (также) спросить на unix.stackexchange.com . Знаете, если вы действительно уверены, что речь идет не о «вашей программе», то ваш вопрос был бы на самом деле не по теме здесь!

Ответ №1:

Я бы не ожидал такого поведения в первую очередь — 15 секунд — это очень долгое время.

Если все ваши 60 потоков со средним приоритетом были работоспособны, то это именно то, что вы ожидаете: с потоками реального времени потоки с более низким приоритетом не будут работать вообще, в то время как потоки с более высоким приоритетом все еще могут выполняться.

Вы могли бы использовать perf timechart для точного анализа того, что происходит.

Комментарии:

1. Политика циклическая. Я неправильно понимаю, как приоритет имеет значение для политики RR sched?

2. @rvishy1: Похоже на то — смотрите sched(7) справочную страницу. Потоки с более высоким статическим приоритетом всегда выполняются предпочтительнее потоков с более низким статическим приоритетом — «Политика планирования определяет порядок только в списке выполняемых потоков с равным статическим приоритетом». ( SCHED_RR являющийся политикой в данном случае).