AWS EC2 avec Nginx et PHP-FPM – Impossible de pousser le processeur à plus de 50%

J’essaie de tester AWS Auto Scaling et pour cela, j’ai besoin de pousser une instance EC2 à un point où un déclencheur (disons CPU supérieur à 80% pendant quelques minutes) induira une autre instance à démarrer.

Le piège que je trouve est que le processeur ne peut pas dépasser 50%.

J’utilise Nginx et j’ai ajusté le nombre de worker_connections de 1024 à des nombres beaucoup plus importants. J’ai process_processes défini sur auto. Aussi fastcgi_params est défini comme suit:

fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 256 16k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_max_temp_file_size 0; fastcgi_intercept_errors off; 

J’ai la configuration php-fpm en utilisant la dynamic et ce qui suit, mais j’ai également ajusté ces chiffres beaucoup plus sans aucune différence réelle:

 pm.max_children = 50 pm.start_servers = 3 pm.min_spare_servers = 3 pm.max_spare_servers = 50 

Je cours un siège et je peux systématiquement obtenir 1000 connexions simultanées sur 30 secondes avec environ 3500 réponses et 100% (pas de pertes) et aucune erreur ne s’affiche. J’ai également lancé 3 instances de siege ec2 avec 1000 connexions simultanées et constaté que je rencontre parfois des erreurs de socket mais que le cpu ne dépasse jamais les 50%. Souvent, je trouve que le résultat est toujours de l’ordre de 3 500 réponses réparties sur les 3 serveurs (donc moins de réponses chacun).

J’ai le php lent à se connecter pendant 10 secondes et il y a quelques requêtes, donc je mets sur une firebase database plus grande (instance AWS RDS – la plus grande possible avec IOPS juste pour tester) et cela n’a fait aucune différence. J’ai également mis en place une instance EC2 plus grande pour voir ce qui se passerait et le processeur dépasserait 50%.

Enfin ceci mon /etc/sysctl.conf

 # Kernel sysctl configuration file for Red Hat Linux # # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and # sysctl.conf(5) for more details. # Controls IP packet forwarding net.ipv4.ip_forward = 0 # Controls source route verification net.ipv4.conf.default.rp_filter = 1 # Do not accept source routing net.ipv4.conf.default.accept_source_route = 0 # Controls the System Request debugging functionality of the kernel kernel.sysrq = 0 # Controls whether core dumps will append the PID to the core filename. # Useful for debugging multi-threaded applications. kernel.core_uses_pid = 1 # Controls the use of TCP syncookies net.ipv4.tcp_syncookies = 1 # Disable netfilter on bridges. # net.bridge.bridge-nf-call-ip6tables = 0 # net.bridge.bridge-nf-call-iptables = 0 # net.bridge.bridge-nf-call-arptables = 0 # Controls the default maxmimum size of a mesage queue kernel.msgmnb = 65536 # Controls the maximum size of a message, in bytes kernel.msgmax = 65536 # Controls the maximum shared segment size, in bytes kernel.shmmax = 68719476736 # Controls the maximum number of shared memory segments, in pages kernel.shmall = 4294967296 # Adam Added Below kernel.pid_max = 262144 net.ipv4.tcp_window_scaling = 1 vm.max_map_count = 262144 # Do less swapping fs.file-max = 2097152 vm.swappiness = 10 vm.dirty_ratio = 60 vm.dirty_background_ratio = 2 ### GENERAL NETWORK SECURITY OPTIONS ### # Number of times SYNACKs for passive TCP connection. net.ipv4.tcp_synack_resortinges = 2 # Allowed local port range #net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.ip_local_port_range = 2000 65535 # Protect Against TCP Time-Wait net.ipv4.tcp_rfc1337 = 1 # Decrease the time default value for tcp_fin_timeout connection net.ipv4.tcp_fin_timeout = 15 # Decrease the time default value for connections to keep alive net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_keepalive_intvl = 15 ### TUNING NETWORK PERFORMANCE ### # Default Socket Receive Buffer net.core.rmem_default = 31457280 # Maximum Socket Receive Buffer net.core.rmem_max = 12582912 # Default Socket Send Buffer net.core.wmem_default = 31457280 # Maximum Socket Send Buffer net.core.wmem_max = 12582912 # Maximum Number of Packets net.core.netdev_max_backlog = 30000 # Increase the maximum total buffer-space allocatable # This is measured in units of pages (4096 bytes) net.ipv4.tcp_mem = 65536 131072 262144 net.ipv4.udp_mem = 65536 131072 262144 # Increase the read-buffer space allocatable net.ipv4.tcp_rmem = 8192 87380 16777216 net.ipv4.udp_rmem_min = 16384 net.core.rmem_default = 131072 net.core.rmem_max = 16777216 # Increase the write-buffer-space allocatable net.ipv4.tcp_wmem = 8192 65536 16777216 net.ipv4.udp_wmem_min = 16384 net.core.wmem_default = 131072 net.core.wmem_max = 16777216 # Increase number of incoming connections net.core.somaxconn = 32768 # Increase number of incoming connections backlog net.core.netdev_max_backlog = 65536 # Increase the maximum amount of option memory buffers net.core.optmem_max = 25165824 # Increase the tcp-time-wait buckets pool size to prevent simple DOS attacks net.ipv4.tcp_max_tw_buckets = 1440000 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 

* Y a-t-il quelque chose qui pourrait limiter le serveur à environ 50% d’utilisation du processeur? (la mémoire est seulement environ 25% d’utilisation). Je n’ai jamais eu le CPU à 55%.

Je voudrais pouvoir pousser le serveur à 90% + et ensuite démarrer une autre instance EC2. De cette façon, je gagne vraiment de l’argent avec le serveur.

Tout conseil sur pourquoi j’aurais cette limitation et ce que je pourrais essayer.

Je vous remercie

Si vous voulez simplement augmenter la charge du serveur pour déclencher l’autoscale, exécutez la commande suivante:

 loadGen() { dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null & }; loadGen; read; killall dd 

Et pour générer encore plus de charge (sur les machines multi-core), ajoutez simplement plus d’expressions entre les tubes:

 loadGen() { dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null & }; loadGen; read; killall dd 

Cela fera le travail.

[] s

Auro

Utiliser la commande de stress

 Stress -c 1 

-c flag est pour les nombres cpu