2009-11-08 5 views
2

J'ai écrit un serveur de diffusion audio avec Python/Twisted. Cela fonctionne bien, mais l'utilisation de la mémoire se développe trop vite! Je pense que c'est parce que le réseau de certains utilisateurs n'est peut-être pas assez bon pour télécharger l'audio à temps. Mon serveur audio diffuse des données audio vers le client de l'autre auditeur, si certains d'entre eux ne peuvent pas télécharger l'audio à temps, ce qui signifie que mon serveur conserve les données audio jusqu'à ce que les écouteurs soient reçus. Et de plus, mon serveur audio est un serveur de diffusion, il reçoit des données audio, et les envoie à différents clients, alors que Twisted copie ces données dans des tampons différents, même s'ils sont de la même pièce audio. Je veux réduire l'utilisation de l'utilisation de la mémoire, donc j'ai besoin de savoir quand est l'audio reçu par le client, afin que je puisse décider quand jeter certains clients lents. Mais je ne sais pas comment y parvenir avec Twisted. Quelqu'un a-t-il une idée?Comment puis-je réduire l'utilisation de la mémoire d'un serveur Twisted?

Et que puis-je faire d'autre pour réduire l'utilisation de la mémoire?

Merci. Victor Lin.

+0

Voici un autre post que j'ai fait, et enfin je trouve la raison http://stackoverflow.com/questions/2100192/how-to-find-the-source-of-increasing-memory-usage-of-a- serveur torsadé/2229010 # 2229010 –

Répondre

2

Vous n'avez pas dit, mais je vais supposer que vous utilisez TCP. Il serait difficile d'écrire un système basé sur UDP qui aurait de plus en plus de mémoire à cause des clients qui ne peuvent pas recevoir des données aussi vite que vous essayez de l'envoyer.

TCP dispose de capacités de contrôle de flux intégrées. Si un récepteur ne peut pas lire les données aussi rapidement que vous le souhaitez, ces informations seront mises à votre disposition et vous pourrez envoyer plus lentement. La façon dont cela fonctionne avec l'API socket BSD est qu'un appel send (2) bloquera ou retournera 0 pour indiquer qu'il ne peut pas ajouter d'octets au tampon d'envoi. La façon dont cela fonctionne dans Twisted est par un système appelé "producteurs et consommateurs". L'essentiel de ce système est que vous enregistrez un producteur auprès d'un consommateur. Le producteur appelle l'écriture sur le consommateur à plusieurs reprises. Lorsque le consommateur ne peut pas suivre, il appelle pauseProducing sur le producteur. Lorsque le consommateur est à nouveau prêt pour plus de données, il appelle resumeProducing sur le producteur.

Vous pouvez lire plus au sujet de ce système dans le producer/consumer howto, partie de la documentation de Twisted.

-5

Assurez-vous que vous utilisez garbage collector de Python, puis passez en revue et supprimez les variables que vous n'utilisez pas.