Bonjour,

Je tente d'exploiter un serveur Web Apache pour des besoins de fort traffic.
Mon but est d'uploader une image via un client pour qu'elle se retrouve rangée dans un répertoire sur un serveur.

J'utilise pour cela une page php côté serveur qui récupère l'image sous forme de données PUT pour ne pas créer un fichier temporaire.

La difficulté est de pouvoir uploader 10 images par seconde (donc faire 10 requêtes à la seconde) et que le temps d’exécution du PHP soit à peu
près stable.

Ce que je ne comprends pas, c'est que parfois, le temps d'execution du PHP part à près de 800 millisecondes quand les autres requêtes se font en moins de 10 millisecondes.

Les images uploadées font toutes 100ko.

Voici les conditions/informations de mon environnement côté client et côté serveur.

Côté client :

La machine a un processeur BiPro, 12Go de RAM avec Linux Debian.

- Pour envoyer une requête au serveur, j'utilise curl avec l'options "-X PUT nom_du_fichier".
- J'ai mis la commande curl dans un shell pour cadencer le nombre de requête à 10 requêtes par secondes (en faisant un sleep entre chaque requête). Les requêtes sont donc éxecutées en série.
- L'image uploadée a été copiée 1000 fois pour que chaque paquet de 1000 requêtes n'utilise pas la même ressource.
- J'ai mis l'option net.ipv4.tcp_tw_reuse = 0.
- La requête curl va pointer sur un fichier PHP sur mon serveur qui va stocker le fichier envoyé par PUT et retourner le temps d'execution de PHP ainsi que l'heure d'appel de la page sous forme HH:MM:SS.mmm. La sortie est redirigée vers un fichier en utilisant " >> fichier_sortie.json"

Entre le client et le serveur :

- C'est un réseau Gigabit

Côté client :

- La machine a aussi un processeur BiPro, 12Go de RAM avec Linux Debian.
- J'ai installé un serveur Apache 2.2.22, avec le mod_fastcgi pour utiliser PHP-FPM.
- Je fais travailler le serveur Apache avec des workers définis dans le apache2.conf.

Voici quelques informations dans ce fichier qui me paraissent importantes :

Fichier /etc/apache2/apache2.conf :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Timeout 300

KeepAlive On

MaxKeepAliveRequests 100

KeepAliveTimeout 2

<IfModule mpm_worker_module>
 StartServers        8
 MaxClients          256
 MinSpareThreads     96
 MaxSpareThreads     96
 ThreadsPerChild     32
 MaxRequestsPerChild  4000
</IfModule>
Et les informations pour PHP-FPM

Fichier /etc/php5/fpm/php-fpm.conf :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
events.mechanism = epoll

Fichier /etc/php5/fpm/pool.d/www.conf :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
pm = static
pm.max_children = 96
pm.min_spare_servers = 32
pm.max_spare_servers = 32
J'ai retiré le maximum d'écriture de log et sinon j'ai mis le niveau de log à "crit"

Informations supplémentaires :
J'utilise un rewrite pour accéder à ma page PHP.

J'ai réalisé un test sur 12h et voici le genre de fichier que j'obtiens (c'est un petit morceau)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{Time:19:34:45.012,Date:0.005},
{Time:19:34:45.134,Date:0.004},
{Time:19:34:45.257,Date:0.005},
{Time:19:34:45.381,Date:0.005},
{Time:19:34:45.504,Date:0.004},
{Time:19:34:45.627,Date:0.005},
{Time:19:34:45.749,Date:0.005},
{Time:19:34:46.670,Date:0.802},
{Time:19:34:46.797,Date:0.006},
{Time:19:34:46.920,Date:0.005},
{Time:19:34:47.044,Date:0.005},
{Time:19:34:47.168,Date:0.005},
{Time:19:34:47.293,Date:0.005},
{Time:19:34:47.417,Date:0.005},
En ratio, j'ai une image "qui dévie" sur 200.

J'ai essayé sur un test de 2000 images, le ratio est le même bien que le temps maximal d’exécution soit d'environ 400 ms.
Mes différentes hypothèses sont :

- Les workers de mon Apache sont mal dimensionnés.
- La configuration de mon PHP-FPM est inadaptée.
- L'écriture du fichier de sortie plombe le mécanisme (ouverture et fermeture de la même ressource en permanence)
- L'écriture des fichiers côté serveur n'arrive pas à suivre (saturation sur le réseau Gigabit ou dans le Linux serveur)

Est-ce que quelqu'un a déjà été confronté à cette situation?
Merci d'avance de m'avoir lu et pour l'aide que vous pourrez me fournir.

Cordialement