Apache cesse de communiquer avec memcache après avoir créé trop de vhosts

J'ai remarqué un problème très particulier avec Apache. J'ai un très grand nombre d'hôtes virtuels mis en place – c'est autour de 501.

Des problèmes ont commencé à apparaître après le numéro 49. Les premiers 493 vhosts fonctionnent comme prévu, mais dès que j'ajoute le numéro 49, le PHP cesse de communiquer avec memcache, et il s'arrête sur tous les access en lecture / écriture.

En fait, j'utilise memcache comme magasin de sessions de backend, donc, php function:

session_start(); 

Tout simplement après 30 secondes.

Si je supprime l'random des 494 vhosts et redémarre Apache, il recommence à fonctionner.

J'ai défini ulimit vraiment élevé (65k), mais ça n'aide pas. J'ai essayé de désactiver complètement les ulimits, mais pas de chance.

Avez-vous des idées sur ce que j'aimerais d'autre essayer?

J'ai essayé de contraindre le process httpd auquel je suis connecté, après avoir frappé la input dans le browser et après 30 secondes, l'attente commence.

C'est la sortie strace:

 select(1170, [1024 1169], [], NULL, {1, 0}) = 2 (in [1024 1169], left {0, 999998}) select(1170, [1024 1169], [], NULL, {1, 0}) = 2 (in [1024 1169], left {0, 999998}) select(1170, [1024 1169], [], NULL, {1, 0}) = 2 (in [1024 1169], left {0, 999998}) select(1170, [1024 1169], [], NULL, {1, 0}) = 2 (in [1024 1169], left {0, 999998}) select(1170, [1024 1169], [], NULL, {1, 0}) = 2 (in [1024 1169], left {0, 999998}) 

Donc, essentiellement, apache est coincé sur select (), et c'est tout, il répète indéfiniment l'appel système select ().

La prochaine chose que j'ai trouvé est tcpdump, pour voir si le packageage passe réellement à partir d'apache, et il fait vraiment:

 22:11:28.366677 IP6 ::1.51404 > ::1.11914: Flags [S], seq 2899674987, win 32752, options [mss 16376,sackOK,TS val 1384759049 ecr 0,nop,wscale 9], length 0 22:11:28.366697 IP6 ::1.11914 > ::1.51404: Flags [S.], seq 2034630080, ack 2899674988, win 32728, options [mss 16376,sackOK,TS val 1384759049 ecr 1384759049,nop,wscale 9], length 0 22:11:28.366709 IP6 ::1.51404 > ::1.11914: Flags [.], ack 1, win 64, options [nop,nop,TS val 1384759049 ecr 1384759049], length 0 22:11:28.366752 IP6 ::1.51404 > ::1.11914: Flags [P.], seq 1:41, ack 1, win 64, options [nop,nop,TS val 1384759049 ecr 1384759049], length 40 22:11:28.366758 IP6 ::1.11914 > ::1.51404: Flags [.], ack 41, win 64, options [nop,nop,TS val 1384759049 ecr 1384759049], length 0 22:11:28.366768 IP6 ::1.51404 > ::1.11914: Flags [P.], seq 41:90, ack 1, win 64, options [nop,nop,TS val 1384759050 ecr 1384759049], length 49 22:11:28.366772 IP6 ::1.11914 > ::1.51404: Flags [.], ack 90, win 64, options [nop,nop,TS val 1384759050 ecr 1384759050], length 0 22:11:28.366779 IP6 ::1.51404 > ::1.11914: Flags [P.], seq 90:122, ack 1, win 64, options [nop,nop,TS val 1384759050 ecr 1384759050], length 32 22:11:28.366783 IP6 ::1.11914 > ::1.51404: Flags [.], ack 122, win 64, options [nop,nop,TS val 1384759050 ecr 1384759050], length 0 22:11:28.367063 IP6 ::1.11914 > ::1.51404: Flags [P.], seq 1:12, ack 122, win 64, options [nop,nop,TS val 1384759050 ecr 1384759050], length 11 22:11:28.367070 IP6 ::1.51404 > ::1.11914: Flags [.], ack 12, win 64, options [nop,nop,TS val 1384759050 ecr 1384759050], length 0 22:11:28.367266 IP6 ::1.11914 > ::1.51404: Flags [P.], seq 12:20, ack 122, win 64, options [nop,nop,TS val 1384759050 ecr 1384759050], length 8 22:11:28.367275 IP6 ::1.51404 > ::1.11914: Flags [.], ack 20, win 64, options [nop,nop,TS val 1384759050 ecr 1384759050], length 0 22:11:28.367477 IP6 ::1.11914 > ::1.51404: Flags [P.], seq 20:25, ack 122, win 64, options [nop,nop,TS val 1384759050 ecr 1384759050], length 5 22:11:28.367489 IP6 ::1.51404 > ::1.11914: Flags [.], ack 25, win 64, options [nop,nop,TS val 1384759050 ecr 1384759050], length 0 22:11:28.367629 IP6 ::1.51404 > ::1.11914: Flags [P.], seq 122:181, ack 25, win 64, options [nop,nop,TS val 1384759050 ecr 1384759050], length 59 22:11:28.367859 IP6 ::1.11914 > ::1.51404: Flags [P.], seq 25:33, ack 181, win 64, options [nop,nop,TS val 1384759051 ecr 1384759050], length 8 22:11:28.367869 IP6 ::1.51404 > ::1.11914: Flags [P.], seq 181:230, ack 33, win 64, options [nop,nop,TS val 1384759051 ecr 1384759051], length 49 22:11:28.368102 IP6 ::1.11914 > ::1.51404: Flags [P.], seq 33:41, ack 230, win 64, options [nop,nop,TS val 1384759051 ecr 1384759051], length 8 22:11:28.368138 IP6 ::1.51404 > ::1.11914: Flags [F.], seq 230, ack 41, win 64, options [nop,nop,TS val 1384759051 ecr 1384759051], length 0 22:11:28.368195 IP6 ::1.11914 > ::1.51404: Flags [F.], seq 41, ack 231, win 64, options [nop,nop,TS val 1384759051 ecr 1384759051], length 0 22:11:28.368206 IP6 ::1.51404 > ::1.11914: Flags [.], ack 42, win 64, options [nop,nop,TS val 1384759051 ecr 1384759051], length 0 

La prochaine chose que j'ai fait est le process GDB de Apache lorsque je lance un appel curl vers une page contenant session_start (), et c'est la sortie:

 232 *(*new)->local_addr = *sock->local_addr; 241 if (sock->local_addr->sa.sin.sin_family == AF_INET) { 238 (*new)->local_addr->pool = connection_context; 241 if (sock->local_addr->sa.sin.sin_family == AF_INET) { 238 (*new)->local_addr->pool = connection_context; 241 if (sock->local_addr->sa.sin.sin_family == AF_INET) { 245 else if (sock->local_addr->sa.sin.sin_family == AF_INET6) { 246 (*new)->local_addr->ipaddr_ptr = &(*new)->local_addr->sa.sin6.sin6_addr; 249 (*new)->remote_addr->port = ntohs((*new)->remote_addr->sa.sin.sin_port); 250 if (sock->local_port_unknown) { 256 if (apr_is_option_set(sock, APR_TCP_NODELAY) == 1) { 257 apr_set_option(*new, APR_TCP_NODELAY, 1); 266 if (sock->local_interface_unknown || 267 !memcmp(sock->local_addr->ipaddr_ptr, 266 if (sock->local_interface_unknown || 276 (*new)->local_interface_unknown = 1; 293 apr_pool_cleanup_register((*new)->pool, (void *)(*new), socket_cleanup, 292 (*new)->inherit = 0; 293 apr_pool_cleanup_register((*new)->pool, (void *)(*new), socket_cleanup, 296 } unixd_accept (accepted=0x7fff14ecddf0, lr=0x7fe93a905aa8, ptrans=<value optimized out>) at /usr/src/debug/httpd-2.2.15/os/unix/unixd.c:507 507 if (status == APR_SUCCESS) { 508 *accepted = csd; 649 } child_main (child_num_arg=<value optimized out>) at /usr/src/debug/httpd-2.2.15/server/mpm/prefork/prefork.c:650 650 SAFE_ACCEPT(accept_mutex_off()); /* unlock after "accept" */ 652 if (status == APR_EGENERAL) { 656 else if (status != APR_SUCCESS) { 665 current_conn = ap_run_create_connection(ptrans, ap_server_conf, csd, my_child_num, sbh, bucket_alloc); 666 if (current_conn) { 667 ap_process_connection(current_conn, csd); 

À cet endroit, il y a une grande pause (~ 30 sec), jusqu'à ce que php dépasse. Ensuite, j'ai compris ceci:

 668 ap_lingering_close(current_conn); 676 if (ap_mpm_pod_check(pod) == APR_SUCCESS) { /* selected as idle? */ 680 ap_scoreboard_image->global->running_generation) { /* restart? */ 679 else if (ap_my_generation != 680 ap_scoreboard_image->global->running_generation) { /* restart? */ 679 else if (ap_my_generation != 551 while (!die_now && !shutdown_pending) { 559 apr_pool_clear(ptrans); 562 && requests_this_child++ >= ap_max_requests_per_child)) { 561 if ((ap_max_requests_per_child > 0 562 && requests_this_child++ >= ap_max_requests_per_child)) { 561 if ((ap_max_requests_per_child > 0 562 && requests_this_child++ >= ap_max_requests_per_child)) { 561 if ((ap_max_requests_per_child > 0 566 (void) ap_update_child_status(sbh, SERVER_READY, (request_rec *) NULL); 573 SAFE_ACCEPT(accept_mutex_on()); 575 if (num_listnsocks == 1) { 

La chose la plus étrange est que je ne peux pas reproduire cela sur une autre machine. Même operating system, les mêmes packages, même configuration (marionnette) même kernel, différents HW.

One Solution collect form web for “Apache cesse de communiquer avec memcache après avoir créé trop de vhosts”

Après plus de semaines de debugging et de surveillance pour les problèmes, je me suis finalement tombé sur un message:

 You MUST recomstack PHP with a larger value of FD_SETSIZE. It is set to 1024, but you have descriptors numbered at least as high as 1073. --enable-fd-setsize=2048 is recommended, but you may want to set it to equal the maximum number of open files supported by your system, in order to avoid seeing this error again at a later date. 

Je vais essayer cette solution, mais boy oh boy, pourquoi les gars PHP font-ils cela? Ceci est tellement laid, la limite nofile de code dur est une design totalement cassée. Sans oublier que, si c'est la solution, me forcer à recomstackr chaque version mineure de PHP et un correctif de security et à maintenir mes propres packages est un grand hâte.

EDIT: après un debugging plus étendu, il semble que ce n'est pas seulement PHP qui est «brisé par la design», mais il y a aussi un tas de problèmes avec l'extension memcache elle-même.

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=629896

https://bugs.php.net/bug.php?id=59876

Les insectes sont ouverts pendant un bon moment maintenant, et rien ne se passe. Je suppose qu'il suffit de jeter l'extension memcache et de find une solution indépendante de celle-ci: – /

  • Comment configurer nginx pour servir un hôte virtuel unique, en dehors d'apache
  • Comment puis-je exécuter des hôtes virtuels Apache comme un certain user?
  • Répondre à l'hôte virtuel très lent sur Mac OS X Lion
  • "Le serveur doit être compatible SSL, mais aucun certificat n'a été configuré [Indication: erreur SSLCertificate]"
  • plusieurs instances de Tomcat versus hôte virtuel
  • Accéder à Apache VirtualHost depuis localhost
  • Redirection de ServerAlias ​​vers un sous-directory avec Apache
  • Apache montre qu'il fonctionne, qu'est-ce qui ne va pas avec ma définition d'hôte virtuel?
  • Utilisation de différentes versions de PHP avec des domaines / hôtes virtuels
  • Nginx: Comment puis-je reproduire le file other_vhosts_access.log d'Apache pour get le vhost au début de la ligne de journalisation?
  • Configuration de nginx 1.10.1 sur Debian 8.6 Emission de machine virtuelle - bloc server (vhost)
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.