#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
являющийся политикой в данном случае).