FastCGI форк в с
Я в настоящее время разрабатываю проект с высокой нагрузкой, мне нужно использовать комбинацию C/FastCGI/nginx.
Проблема в том, что мне нужно, чтобы мое приложение FastCGI работало в потоках / процессах.
Я знаю два способа сделать это:
1) Скомпилируйте программу и затем используйте spawn-fcgi для ветвления процессов. (Я не могу использовать это)
2) Беги FCGX_Init()
, чем предварительно форк до 10 обработок ДО while (FCGX_Accept_r(&request) >= 0)
3) Запустите pthreads ПОСЛЕ while (FCGX_Accept_r(&request) >= 0)
Итак, мой вопрос: что это самый быстрый способ запустить приложение fastcgi. Могу ли я предварительно форкнуть приложение fastcgi после этого:
int sock = FCGX_OpenSocket(":9000", 10);
FCGX_InitRequest(&request, sock, 0);
Могут ли 10 процессов прослушивать один сокет? Должен ли я использовать потоки, если у меня запущено N процессов? Этого будет достаточно?
1 ответ
Я не знаю, какой именно API FastCGI вы используете, но в целом вы не можете передать файловый дескриптор (то есть сокет) другому процессу, если он не был открыт до того, как вы разветвились. Процессы имеют независимые таблицы дескрипторов файлов. Все потоки будут использовать одну и ту же таблицу дескрипторов файлов, поскольку они находятся в одном и том же процессе.
Насколько мне известно, вы можете иметь только один процесс, прослушивающий порт одновременно. Обычно делается один поток, единственной задачей которого является прослушивание соединений. Когда он получает его, соединение принимается и передается следующему рабочему потоку в пуле, когда поток принимает принятый сокет (не прослушивающий сокет), пока сокет не закроется. Поток слушателя немедленно возвращается к прослушиванию соединения.
Это должно дать вам минимальные накладные расходы.