оптимизировать мой сервер Linux для обработки 10000 потоков на процесс
Как объяснили другие, это вообще неправильно. Нить является дорогостоящим ресурсом , в частности , потому , что он имеет свой собственный стек вызовов ( как правило, мегабайт) , а потому , что это планируемая задача ядра. Потоки стоят даже дороже, чем дескрипторы открытых файлов .
Читайте Операционные системы: Три Легких Части (свободно загружаемый учебник).
Как правило, вам не нужно иметь много потоков и, конечно, не много исполняемых потоков. Количество выполняемых потоков обычно должно составлять самое большее количество ядер (или небольшое кратное количество), то есть самое большее дюжина. Количество потоков в процессе может быть немного больше. Поэтому, если у вас нет очень обширного сервера (с множеством процессорных сокетов и ядер), вы не хотите иметь более десятка выполняемых потоков и сотню потоков (большинство из которых простаивают) в вашем процессе (на рабочем столе) ,
В Linux потоки и процессы очень похожи (поскольку оба могут быть созданы с помощью clone (2) ), и оба являются задачами, запланированными ядром. На самом деле планировщик ядра - это планирование задач, которые могут быть потоками внутри какого-либо многопоточного процесса или одного основного потока однопоточного процесса (в этом случае вы будете называть «процесс» этим единственным потоком) или потоков ядра. Вы, вероятно, не хотите иметь более тысячи планируемых задач в общей сложности на вашей настольной системе.
В Linux процесс - это просто группа потоков, совместно использующих одно и то же виртуальное адресное пространство (и разделяющих некоторые другие вещи, такие как таблица дескрипторов файлов и т. Д.). Некоторые процессы имеют только один поток.
Виртуальное адресное пространство будет определенно Википедией , как
«набор диапазонов виртуальных адресов, которые операционная система делает доступными для процесса»
(но см. также этот ответ, объясняющий, что терминология не является универсальной, и в некоторой документации Microsoft используется другое и несовместимое определение).
В Linux proc (5) полезна для понимания виртуального адресного пространства некоторых процессов. Попробуйте оба
cat /proc/self/maps
и cat /proc/$$/maps
в терминале. Смотрите также это и pmap (1) & ps (1) & top (1) .
Все программы пользовательского пространства выполняются в каком-либо процессе и используют виртуальную память, поэтому каждый процесс имеет свое собственное виртуальное адресное пространство. Физическая ОЗУ - это ресурс, управляемый ядром Linux, и приложения не имеют прямого доступа к ОЗУ (кроме как с помощью mmap (2) -ing /dev/mem
, см. Mem (4) ).
Таким образом, процесс не использует непосредственно RAM. Он использует виртуальную память и имеет собственное виртуальное адресное пространство. Ядро использует пейджинг для управления физической памяти страниц и обеспечивает виртуальное адресное пространство и процесс абстракции . В любое время (даже когда ваш процесс простаивает или когда он работает) ядро может вывести на экран некоторые страницы (например, поменять их местами на диске). Ядро конфигурирует MMU (и обрабатывает исключения аппаратных исключений страницы в некотором обработчике прерываний , либо путем извлечения страницы с диска, либо путем передачи ошибки сегментации в процесс, см. Signal (7) )
Вы можете иметь зеленые потоки над системными потоками (но библиотеки зеленых потоков сложно реализовать и отладить). Посмотрите на goroutines, используемые в Go для причудливого примера. Смотрите также setcontext (3) .
Иногда ваша система может экспериментировать с поражением . Это происходит, когда общая виртуальная память (необходимая всем процессам) превышает - по большому коэффициенту - доступную физическую память. Тогда ваш компьютер перестает отвечать на запросы. Прочитайте о размере резидентного набора , пейджинге по требованию , рабочем наборе , превышении памяти , ASLR .
Смотрите также -для Linux- fork (2) , clone (2) , mmap (2) , madvise (2) , posix_fadvise (2) , mlock (2) , execve (2) , учетные данные (7) , pthreads (7) , futex (7) , возможности (7) .