2009-05-30 12 views
1

J'ai un script PHP CLI, qui traite un fichier csv, en insérant son contenu dans une table de la base de données Postgresql. C'est sur un serveur Ubuntu. J'utilise schedtool pour contrôler l'affinité de l'ensemble du script. Schedtool est utilisé pour lancer le script lui-même avec l'option -e. Malheureusement, avec htop, je vois que le thread de base de données est engendré comme un thread complètement différent et n'est pas affecté par les options d'affinité.Le processus Postgresql généré peut-il être contrôlé par le script PHP spawner?

Est-il possible de faire en sorte que le processus de base de données hérite de toutes les options d'affinité du script PHP spawner?


Je viens de trouver la réponse - comme je lisais des fichiers d'exemples Postgresql pour Ruby :).

Mon meilleur choix serait d'obtenir le PID très exact du thread Postgresql qui exécute le script en cours, avec NOTIFY - LISTEN. Comme [depesz] dit à Postgres utilise seulement 1 core. Avec schedtool je peux encore contrôler sur quel noyau il fonctionne et avec cpulimit je peux contrôler plus loin.

Répondre

0

Postgres n'utilise pas de threads. Chaque connexion est gérée par un seul processus fileté. Ainsi, une seule connexion ne peut utiliser qu'un seul cœur. Bien que le système d'exploitation puisse le déplacer vers différents cœurs, il n'en utilisera qu'un seul à la fois. Si vous insistez sur la mise au point de postgres, "SELECT pg_backend_pid()" vous donnera le PID du processus postgres sans aucun message NOTIFY/LISTEN. Bien que, en général, vous ne voulez pas essayer de bien un processus postgres. Vous pouvez bloquer d'autres processus de priorité plus élevée. Ce que vous pensiez être un processus peu prioritaire n'est plus si peu prioritaire.

Si vous faites juste un tas d'insertions d'un csv, nicing votre script ne vous aidera probablement pas beaucoup. Postgres est probablement en train de faire plus de travail, et c'est probablement un IO, donc encore une fois, nicing peut ne pas vous apporter beaucoup. Vous pourriez, cependant, dormir de temps en temps. Insérez pendant 50 millisecondes, dormez pendant un moment, ...

+0

Merci beaucoup! J'ai encore beaucoup appris :) Maintenant, je restructure mon script et j'adapte les nouvelles pensées. – Ikon

0

n °

Postgres est toujours donné naissance à de processus de maître de poste, donc il n'y a pas moyen de passer d'affinité (ce qui ce serait) des options de script php pour back-end postgres. D'autre part - si vous décrivez quelle est l'affinité, et quel type d'options vous voulez configurer/passer, peut-être y a-t-il une solution - le fait qu'il n'y a pas de solution générale, ne signifie pas que il n'y a pas de solution spécialisée pour certaines choses.

+0

Certainement. Schedtool définit les paramètres de planification du processeur pour un processus donné. Par exemple, dans mon cas, j'ai mis le processus à utiliser seulement 1 noyau de 2 sur mon processeur. C'est ce qu'on appelle l'affinité. Je peux aussi régler le niveau NICE. Pour plus de lecture: http://linux.die.net/man/8/schedtool – Ikon

+0

L'application client ne peut pas définir un bon niveau sur le serveur - dans votre situation, l'application php ne peut pas définir un bon niveau sur backend postgresql. Pour définir si une application peut utiliser 1 ou 2 cœurs, cela ne sert à rien, car 1 backend PostgreSQL utilisera toujours 1 seul cœurs. –

+0

Donc, je ne devrais pas déranger avec le fil postgres séparé car il utilisera seulement 1 core tout le temps? Ce serait bien, car mon objectif est de minimiser la charge globale. Pourriez-vous éventuellement recommander une documentation, un tutoriel sur ce sujet (équilibrage de charge Postgres), s'il vous plaît? – Ikon

Questions connexes