Задать вопрос
@allebin

Почему fastcgi скрипт не востанавливает работу после большой нагрузки на сервер?

После перкращения большой нагрузки на сервер (100% нагрузки на cpu в течении 1-2 часов) fastcgi скрипт почти перестает выполнять свою работу. Это выражается в том, что порядка 90% запросов к нему не дожидаются ответа от сервера.
upstream timed out (110: Connection timed out) while connecting to upstream

Проблема в том, что скрипт не "оживает" даже после 20 часов такой "работы" при этом не потребляя лишней памяти и ресурсов cpu (в сравнении со стабильной работой)

в настройках nginx есть такие строки
fastcgi_read_timeout 10s;
fastcgi_send_timeout 10s;
fastcgi_connect_timeout 10s;


а в самом скрипте
int main(void) {
	streambuf * cin_streambuf  = cin.rdbuf();
	streambuf * cout_streambuf = cout.rdbuf();
	streambuf * cerr_streambuf = cerr.rdbuf();

	FCGX_Request request;
	FCGX_Init();
	FCGX_InitRequest(&request, 0, 0);

	srand (time(NULL));

	while (FCGX_Accept_r(&request) == 0) {
		fcgi_streambuf cin_fcgi_streambuf(request.in);
		fcgi_streambuf cout_fcgi_streambuf(request.out);
		fcgi_streambuf cerr_fcgi_streambuf(request.err);

		cin.rdbuf(&cin_fcgi_streambuf);
		cout.rdbuf(&cout_fcgi_streambuf);
		cerr.rdbuf(&cerr_fcgi_streambuf);

		requestNumber++;

		cout << "Pragma: no-cache\r\n";
		cout << "Cache-Control: post-check=0, pre-check=0\r\n";
		cout << "Cache-Control: no-store, no-cache, must-revalidate, max-age=0\r\n";
		cout << "Content-type: text/html\r\n\r\n";
		
		float dl = time(NULL) - atof(FCGX_GetParam("REQUEST_TIME", request.envp));
		if(dl > REQUEST_TIMEOUT) continue; //не обрабатываем запросы ждущие слишком долго


нагрузка
n0anm.png
память
IuPOb.png
Использование NGINX
kNSgH.png

P.S. Не силен в c++ особенно в ситуациях когда программа работает в экстремальных условиях, возможно я упускаю ту или иную проверку при создании объекта (пример: а выделилась память?)
P.P.S. ubuntu/nginx/php/mysql
  • Вопрос задан
  • 135 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы