Réponse lente PostgreSQL sur VPN

J'ai un problème avec un programme d'loggings médicaux qui utilise un Postgre SQL comme backend.

Plusieurs bureaux se connectent à un site d'entreprise via Cisco VPN. Il existe un ASA5055 chez les entresockets et la plupart des sites utilisent un PIX. J'ai déterminé que la vitesse n'est pas un problème car je peux envoyer / recevoir des files sur un réseau par le VPN à environ 500KB / s symésortingquement.

Je lance un rapport dans le logiciel sur un count de test qui montre un simple rapport de 1 page, s'il s'agissait d'un file PDF, il serait d'environ 50KB au total. Si le rapport est exécuté sur le réseau local, il apparaît immédiatement. Lorsqu'il se déroule à distance, même à un moment où tous les autres bureaux sont fermés et que rien d'autre ne traverse le tunnel, il faut 40 à 50 secondes. À l'aide de cette information, je constate que le rapport ne dépasse pas 200 Ko environ. Les pings sont inférieurs à 100 ms.

Pendant ce time, je peux regarder l'interface réseau via le Gestionnaire des tâches et il semble que le rapport soit diffusé vers le client à 5-10KB / s.

Le server est 2008R2 Enterprise, 2 x 4 core Xeon, RAM 56 Go. Le système semble fonctionner comme prévu sans erreur d'E / S.

Quelles pourraient être certaines des causes ou des solutions à ce mystère? Y a-t-il quelque chose spécifiquement que je devrais envisager de dépanner davantage cela?

Vous rencontrez probablement des problèmes de latence. J'ai vu la performance de la database sur les liens crappy get complètement mal. Ma prochaine étape consisterait à prendre une trace de packages de connections locales et distantes (peut être fait sur le server db, probablement) et jeter un oeil sur le time relatif entre les packages. Tout en claquant un seul file dans un stream peut être rapide dans les deux cas, si la transaction requirejs un va-et-vient entre le client et la latence du server peut tuer le débit perçu.

Comme Erik a commenté, la question pourrait être la latence.

Vous pouvez essayer cette expérience. Dans psql sur le server, activez \timing et exécutez la requête SQL associée. Ensuite, exécutez-le à nouveau sur le server, sauf le time plein pour exécuter psql:

 time psql -c "SELECT ..." 

Je comprends que le premier teste le time de la requête à l'intérieur du server, tandis que celui-ci comprendra également les frais généraux de connection, et un time de communication entre le client. Maintenant, répétez le test, mais exécutez psql à l'autre extrémité du VPN.

Les résultats du \timing varient-ils beaucoup? Que diriez-vous des résultats de psql ? Ces réponses devraient aider à confirmer si le problème dans PostgreSQL, et que cela est dû à la latence WAN.

Outre d'autres façons d'accorder votre connection réseau, vous pouvez envisager une solution de réplication PostgreSQL ou envisager de mettre en cache des solutions de rechange côté client si la gravité de la situation nécessite d'autres améliorations de performances.

La latence ne peut être la cause du problème que si le rapport est obtenu avec beaucoup de petites requêtes SQL . Chaque requête implique au less un aller-return sur le server et ne peut pas s'exécuter en parallèle, au less pas sur la même connection.

D'autre part, si cela se fait avec quelques grandes requêtes SQL , la latence n'est pas pertinente, car il y a peu de voyages aller-return sur le server. Dans ce cas, la vitesse ne diffère pas beaucoup lors du téléchargement d'un file, la bande passante étant le facteur de conduite.

Pour vérifier le nombre de requêtes exécutées lors du lancement du rapport, vous pouvez définir temporairement log_statement="all" dans PostgreSQL pendant le rapport. Voir le document sur log_statement .

Ou regardez-le en time réel en interrogeant à plusieurs resockets la vue du système pg_stat_activity .