je veux bien qu il garde des choses en mémoire, mais là garder le resultat d une requete sql qui fait 50MB, où est la limite ?
je crois vraiment qu il s agit d un bug
ou alors ce sont des buffers de communication entre postgresql et php ou entre php et apache qui ne sont pas libérés
Ok j'ai essayé MaxRequestsPerChild à 1 et ça fonctionne,
Une fois la requête finie, le processus apache qui a géré la requête se ferme et donc la mémoire est libérée.
Je trouve ça étonnant que apache même si apache garde ses processus fils ouverts pour être plus réactif, ceux-ci ne libèrent pas leur mémoire automatiquement.
J'ai simplifié au maximul mon script pour localiser l'erreur :
/* HEADER TEXT */
header('Content-Type: text/plain; charset: UTF-8');
header('Content-Disposition: attachment; filename=test.csv');
error_log('MEM USAGE 1 : '.memory_get_usage());
(qui donne 149952 bytes)
for ($i=0; $i<200000; $i++)
{
for ($j=0; $j<15; $j++)
{
echo rand();
echo ";";
}
echo "\n";
}
flush();
error_log('MEM USAGE 2 : '.memory_get_usage());
(qui donne 150072 bytes)
Donc là pas de requête PostgreSQL, pas d'allocation en RAM, juste du "echo".
Le fichier téléchargé fait 30MB
A chaque fois que je lance la page sur un navigateur WEB et télécharge le fichier généré j'ai un nouveau processus apache2 qui utilise de la mémoire et qui ne termine jamais :
top -d ,2 -U www-data :
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3388 www-data 20 0 23384 5880 1728 S 0,0 1,2 0:57.44 apache2
3389 www-data 20 0 23392 5884 1728 S 0,0 1,2 0:57.03 apache2
3390 www-data 20 0 23392 5880 1732 S 0,0 1,2 0:29.83 apache2
3392 www-data 20 0 23352 5840 1732 S 0,0 1,2 0:29.83 apache2
3393 www-data 20 0 23384 5876 1728 S 0,0 1,2 1:43.94 apache2
3396 www-data 20 0 23384 5872 1728 S 0,0 1,2 0:53.93 apache2
…
Pourquoi ces processus ne se terminent pas ou ne libèrent pas leur mémoire ?
D'après moi c'est une erreur du serveur apache
Je testerai demain sur une Debian Squeeze au lieu de Wheezy
Posté par ilip .
En réponse au message Règles UDEV.
Évalué à 1.
Bonjour,
Je n'ai pas trop le choix sur la version du noyau.
Mon problême n'est au niveau driver USB-RS232, ça fonctionne bien en utilisant /dev/ttyUSB0, le problème est que je n'arrive pas à configurer les règles udev pour ajouter un lien symbolique /dev/ttyCOMIOX vers ce périphérique dont le chemin USB est 1-1.5.2 (il y'a 2 hubs USB en cascade avec 7 convertisseurs USB-RS232 connectés, il faut pouvoir les différencier).
Je suppose que udev utilise les fichiers noyau de /sys pour identifier les périphériques (à confirmer), et c'est peut être là qu'il y'a eu une modification venant du noyau 2.6.37
C'est assez spécial les rêgles udev et dur de trouver de la documentation détaillée.
Lorsque l'on ajoute un 'S' au critères recherchés (KERNELS, SUBSYSTEMS …) c'est qu'on indique une propriété d'un parent du périphérique (dans mon cas un port USB).
Mais il est précisé qu'on ne peut pas définir des propriétés de plusieurs parents différents.
Donc d'après le udevadm info, la rêgle simple SUBSYSTEM=="tty", KERNELS=="1-1.5.2", SYMLINK+="ttyCOMIO1" devrait fonctionner, ce n'est pas le cas.
Mon programme doit être lancé avec d'avantages de droits que le user www-data
Les sockets sont une solution mais c'est plus lourd à implémenter
Il faut trouver comment autoriser le serveur PHP à envoyer des signaux à des programmes qui ne sont pas dans son groupe, ou créer un groupe supplémentaire, mais ça n'a pas l'air de marcher
par contre une question technique
pour les architectures ARM, pourquoi est il necessaire de tout recompiler (Qt ou GStreamer par exemple) pour profiter de l'acceleration graphique d une puce, alors que c pas le cas pour des cartes graphiques normales (Radeon, Geforce …) ?
Mais si par exemple Qt est compilé avec le support openGL ES de la puce graphique, sachant que c'est Qt qui dessine tout ses Widget / animations, alors Xorg n'a pas besoin d'accélération graphique ?
Pareil par exemple pour GStreamer ?
Xorg ne fait que fournir des framebuffers intermédiaires qu'il va ensuite superposer (role du compositeur) ?
En passant par Xorg c'est facile, car les appli n'écrivent pas directement dans le framebuffer, et c'est Xorg qui s'occupe de placer la video par dessus le programme Qt.
Quel est l'intérêt d'utiliser Qt en mode framebuffer ?
[^] # Re: Script simplifié
Posté par ilip . En réponse au message fuite mémoire PHP. Évalué à -1.
je veux bien qu il garde des choses en mémoire, mais là garder le resultat d une requete sql qui fait 50MB, où est la limite ?
je crois vraiment qu il s agit d un bug
ou alors ce sont des buffers de communication entre postgresql et php ou entre php et apache qui ne sont pas libérés
[^] # Re: Script simplifié
Posté par ilip . En réponse au message fuite mémoire PHP. Évalué à 1.
Bonjour,
C'est lorsque je rajoute la requête SQL que la mémoire utilisée passe à ~50MB.
Pourtant il n'y a pas de fuite mémoire dans mon script PHP, j'apelle bien "pg_free_result" sur le résultat, le problème est ailleur.
J'ai l'impression que PHP ne libère pas réellement les variables liées a postgresql.
Peut être un problème au niveau du garbage collector.
[^] # Re: Script simplifié
Posté par ilip . En réponse au message fuite mémoire PHP. Évalué à 1.
Ok j'ai essayé MaxRequestsPerChild à 1 et ça fonctionne,
Une fois la requête finie, le processus apache qui a géré la requête se ferme et donc la mémoire est libérée.
Je trouve ça étonnant que apache même si apache garde ses processus fils ouverts pour être plus réactif, ceux-ci ne libèrent pas leur mémoire automatiquement.
Cela m'entrainait des erreurs de type OOM :
Merci pour ton aide
[^] # Re: Script simplifié
Posté par ilip . En réponse au message fuite mémoire PHP. Évalué à 0.
Le problème c'est que en une seule requête PHP le processus apache2 utilise 54MB de mémoire,
Donc en 10 requête, j'arrive à 100% de mémoire utilisée, ma plateforme ARM en a 512MB.
Le paramètre MaxMemFree (http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxmemfree) semble plus adapté, je l'ai reglé à 10000 (en KB), mais ça n'a pas résolu le problème.
Exemple de consommation mémoire après 5 requêtes PHP :
[^] # Re: Script simplifié
Posté par ilip . En réponse au message fuite mémoire PHP. Évalué à 1.
J'ai testé le même site WEB sur le serveur Nginx, qui semble assez répandu et performant pour des fortes charges avec une consommation mémoire faible.
Contrairement a apache2, la mémoire est bien libèrée après que le fichier ai été transmis au navigateur WEB :
Avant execution script PHP :
Pendant execution script PHP :
Après execution script PHP :
# Script simplifié
Posté par ilip . En réponse au message fuite mémoire PHP. Évalué à 1.
J'ai simplifié au maximul mon script pour localiser l'erreur :
Donc là pas de requête PostgreSQL, pas d'allocation en RAM, juste du "echo".
Le fichier téléchargé fait 30MB
A chaque fois que je lance la page sur un navigateur WEB et télécharge le fichier généré j'ai un nouveau processus apache2 qui utilise de la mémoire et qui ne termine jamais :
top -d ,2 -U www-data :
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3388 www-data 20 0 23384 5880 1728 S 0,0 1,2 0:57.44 apache2
3389 www-data 20 0 23392 5884 1728 S 0,0 1,2 0:57.03 apache2
3390 www-data 20 0 23392 5880 1732 S 0,0 1,2 0:29.83 apache2
3392 www-data 20 0 23352 5840 1732 S 0,0 1,2 0:29.83 apache2
3393 www-data 20 0 23384 5876 1728 S 0,0 1,2 1:43.94 apache2
3396 www-data 20 0 23384 5872 1728 S 0,0 1,2 0:53.93 apache2
…
Pourquoi ces processus ne se terminent pas ou ne libèrent pas leur mémoire ?
D'après moi c'est une erreur du serveur apache
Je testerai demain sur une Debian Squeeze au lieu de Wheezy
[^] # Re: marrant
Posté par ilip . En réponse au message fuite mémoire PHP. Évalué à 1.
Le code n'est pas complet, je n'ai mis que le code qui peut être utile à comprendre le problème.
Dans le vrai code, le pg_free_result n'est pas dans la boucle while.
J'ai fais un test en utilisant la fonction memory_get_usage en début et fin du script PHP, qui mesure la mémoire allouée par le script (http://php.net/manual/en/function.memory-get-usage.php).
J'obtiens 161984 bytes au début et 165152 bytes à la fin.
Donc apparement la mémoire RAM consommée par le processus apache ne vient pas de la mémoire allouée par le script PHP..
# script bash
Posté par ilip . En réponse au message Cohérence de l'évolution des données. Évalué à 2.
bonjour
un script shell lancé periodiquement par cron avec des commandes SQL (psql) ferait l affaire ?
[^] # Re: /dev/ttyUSB0
Posté par ilip . En réponse au message Règles UDEV. Évalué à 1.
Ca ne marche pas non plus
[^] # Re: /dev/ttyUSB0
Posté par ilip . En réponse au message Règles UDEV. Évalué à 1.
Bonjour,
Ca je l'ai déjà fait :
D'où la règle SUBSYSTEM=="tty", KERNELS=="1-1.5.2", SYMLINK+="ttyCOMIO1" qui aurait due marcher
[^] # Re: pas vraiment une solution mais
Posté par ilip . En réponse au message Règles UDEV. Évalué à 1.
Bonjour,
Je n'ai pas trop le choix sur la version du noyau.
Mon problême n'est au niveau driver USB-RS232, ça fonctionne bien en utilisant /dev/ttyUSB0, le problème est que je n'arrive pas à configurer les règles udev pour ajouter un lien symbolique /dev/ttyCOMIOX vers ce périphérique dont le chemin USB est 1-1.5.2 (il y'a 2 hubs USB en cascade avec 7 convertisseurs USB-RS232 connectés, il faut pouvoir les différencier).
Je suppose que udev utilise les fichiers noyau de /sys pour identifier les périphériques (à confirmer), et c'est peut être là qu'il y'a eu une modification venant du noyau 2.6.37
C'est assez spécial les rêgles udev et dur de trouver de la documentation détaillée.
Lorsque l'on ajoute un 'S' au critères recherchés (KERNELS, SUBSYSTEMS …) c'est qu'on indique une propriété d'un parent du périphérique (dans mon cas un port USB).
Mais il est précisé qu'on ne peut pas définir des propriétés de plusieurs parents différents.
Donc d'après le udevadm info, la rêgle simple SUBSYSTEM=="tty", KERNELS=="1-1.5.2", SYMLINK+="ttyCOMIO1" devrait fonctionner, ce n'est pas le cas.
[^] # Re: GROUP BY
Posté par ilip . En réponse au message Requêtes SQL. Évalué à 1.
Bonjour,
C'est bien ce que je cherchai a faire.
Pour la première requête ça donne :
La requête sur 229398 lignes me renvoit bien les cumuls :
0;218584
1;527
2;577
3;557
4;528
5;552
6;544
7;549
8;549
9;566
10;548
11;528
12;578
13;506
14;530
15;540
16;499
17;540
18;528
19;532
20;536
La requête prend 6812 msec ce qui est assez performant.
Avant j'obtenai le même résultat en faisant une requête COUNT pour chaque valeur de status :
Ce qui me prenait 51802 msec
Pour la deuxième requête par contre c'est moins bon au niveau performances et je ne comprend pas pourquoi :
Je veux répartir la colonne "valeur" dans 15 intervalles différents :
-∞ à -120
-120 à -100
-100 à -80
-80 à -60
-60 à -40
-40 à -20
-20 à 0
0 à 20
20 à 40
40 à 60
60 à 80
80 à 100
100 à 120
120 à +∞
Ma requête est:
Comme la précédente requête, il y'a 229398 lignes, cela me renvoit :
-∞;1090
-120;2325
-100;1169
-80;3521
-60;3437
-40;17349
-20;17269
0;137523
20;17308
40;16870
60;3466
80;3397
100;1166
120;2311
+∞;1197
Mais j'ai ce résultat en 43875 msec.
Alors que si je fais des requêtes COUNT pour chaque intervalles séparément, j'ai le résultat 37738 msec, ce qui est meilleur que la requête groupée.
[^] # Re: GROUP BY
Posté par ilip . En réponse au message Requêtes SQL. Évalué à 1.
L'équivalent de la requête avec la fonction generate_series est :
[^] # Re: GROUP BY
Posté par ilip . En réponse au message Requêtes SQL. Évalué à 1.
Bonjour,
Pour la première requête, ça ne marche pas.
Création des tables avec les valeurs :
La requête :
me renvoi :
0;4
1;1
2;1
3;1
4;1
5;1
6;1
7;1
8;1
9;1
[^] # Re: GROUP BY
Posté par ilip . En réponse au message Requêtes SQL. Évalué à 0.
Bonjour
Cette requête fonctionne, j'obtiens :
0;421
3;4
5;2
6;2
7;3
8;1
Mais il me faut une ligne pour chaque status :
0;421
1;0
2;0
3;4
4;0
5;2
6;2
7;3
8;1
9;0
Et je pense qu'il y'a une solution avec generate_series(0, 10, 1)
[^] # Re: select count distinct
Posté par ilip . En réponse au message Requêtes SQL. Évalué à -1.
Bonjour,
Ca ne correspond pas à ce que je veux.
Lorsque j'exécute ces requêtes, le résultat est '10'
Ca me compte combien de status différents j'ai dans ma table.
Or ce que je veux c'est le nombre d'occurence pour chaque status différent dans la table.
# Re: Des autres approches
Posté par ilip . En réponse au message Droits serveur PHP. Évalué à 0.
Ok merci pour vos solutions, ça répond bien au problème
La solution setuid(0) fonctionne, la solution sudo avec un script aussi,
On peut aussi autoriser l'utilisateur www-data d'utiliser la commande kill avec sudo :
apt-get install sudo
vim /etc/sudoers.d/test :
www-data ALL= NOPASSWD: /bin/kill
code PHP :
exec sudo kill -SIGTERM $pid
Mais c'est peut être plus sécurisé de passer par un script intermédiare
[^] # Re: Des autres approches
Posté par ilip . En réponse au message Droits serveur PHP. Évalué à 1.
Bonjour,
Mon programme doit être lancé avec d'avantages de droits que le user www-data
Les sockets sont une solution mais c'est plus lourd à implémenter
Il faut trouver comment autoriser le serveur PHP à envoyer des signaux à des programmes qui ne sont pas dans son groupe, ou créer un groupe supplémentaire, mais ça n'a pas l'air de marcher
# Essai avec un utilisateur à la place de root
Posté par ilip . En réponse au message Droits serveur PHP. Évalué à -1.
J'ai essayé quelque chose qui n'a pas marché :
Création d'un utilisateur test :
adduser test
Ajout de "test" dans le groupe "www-data"
et ajout de l'utilisateur "www-data" dans le groupe "test"
/etc/group :
www-data:x:33:test
test:x:1000:www-data
Je lance mon programme avec l'utilisateur "test"
Mais ça me fait toujours "Operation not permitted"
[^] # Re: X11
Posté par ilip . En réponse au message Lire une vidéo sur ARM avec Qt. Évalué à 0.
par contre une question technique
pour les architectures ARM, pourquoi est il necessaire de tout recompiler (Qt ou GStreamer par exemple) pour profiter de l'acceleration graphique d une puce, alors que c pas le cas pour des cartes graphiques normales (Radeon, Geforce …) ?
[^] # Re: X11
Posté par ilip . En réponse au message Lire une vidéo sur ARM avec Qt. Évalué à 0.
justement, dans ce cas X regle le probleme d'acces concurrent au framebuffer, en placant la video par dessus la fenetre Qt
[^] # Re: X11
Posté par ilip . En réponse au message Lire une vidéo sur ARM avec Qt. Évalué à 1.
Mais si par exemple Qt est compilé avec le support openGL ES de la puce graphique, sachant que c'est Qt qui dessine tout ses Widget / animations, alors Xorg n'a pas besoin d'accélération graphique ?
Pareil par exemple pour GStreamer ?
Xorg ne fait que fournir des framebuffers intermédiaires qu'il va ensuite superposer (role du compositeur) ?
[^] # Re: X11
Posté par ilip . En réponse au message Lire une vidéo sur ARM avec Qt. Évalué à 1.
C'est pas énorme non plus
apt-get install -o APT::Install-Recommends=false" xserver-xorg-core xserver-xorg-video-fbdev xserver-xorg-input-evdev :
…
Après cette opération, 12,8 Mo d'espace disque supplémentaires seront utilisés.
apt-get install -o APT::Install-Recommends=false" libqtcore4 libqtgui4 :
…
Après cette opération, 27,2 Mo d'espace disque supplémentaires seront utilisés.
Après au niveau performances CPU et quantité RAM pour Xorg je sais pas trop
[^] # Re: Lire une vidéo sur ARM avec Qt
Posté par ilip . En réponse au message Lire une vidéo sur ARM avec Qt. Évalué à 1.
Ok,
Moi je fais du développement sur des processeurs ARM Omap Cortex-A8 fréquence 1GHz, donc c'est suffisament performant pour faire tourner Xorg.
Par contre pour économiser de la place je n'installe que les parties de Xorg qui me sont nécessaires.
Sur Debian ça donne :
/etc/apt/apt.conf :
APT::Install-Recommends "false";
apt-get install xserver-xorg-core xserver-xorg-video-fbdev xserver-xorg-input-evdev
Ca évite d'installer tout les packages inutiles pour ma plateforme :
xserver-xorg-input-synaptics xserver-xorg-input-wacom xserver-xorg-video-all xserver-xorg-video-apm xserver-xorg-video-ark xserver-xorg-video-ati xserver-xorg-video-chips xserver-xorg-video-cirrus xserver-xorg-video-i128 xserver-xorg-video-i740 xserver-xorg-video-mach64 xserver-xorg-video-mga xserver-xorg-video-neomagic xserver-xorg-video-nv xserver-xorg-video-r128 xserver-xorg-video-radeon xserver-xorg-video-rendition xserver-xorg-video-s3 xserver-xorg-video-s3virge xserver-xorg-video-savage xserver-xorg-video-siliconmotion xserver-xorg-video-sis xserver-xorg-video-sisusb xserver-xorg-video-tdfx xserver-xorg-video-trident xserver-xorg-video-tseng xserver-xorg-video-vesa xserver-xorg-video-voodoo
(et leurs dépendances)
Sinon j'avais testé à l'époque une version allégée du serveur Xorg pour démarrer plus rapidement : Xfbdev
Mais je n'avais pas réussi a faire fonctionner une dalle tactile avec…
# X11
Posté par ilip . En réponse au message Lire une vidéo sur ARM avec Qt. Évalué à 1.
En passant par Xorg c'est facile, car les appli n'écrivent pas directement dans le framebuffer, et c'est Xorg qui s'occupe de placer la video par dessus le programme Qt.
Quel est l'intérêt d'utiliser Qt en mode framebuffer ?