2010-04-20 6 views
0

Je suis en train de refactoriser un écouteur UDP de Java vers C. Il doit gérer entre 1000 et 10000 messages UDP par seconde, avec une longueur de données moyenne d'environ 60 octets. Il n'y a pas de réponse nécessaire. Les données ne peuvent pas être perdues (ne demandez pas pourquoi UDP a été décidé).Benchmarking d'un serveur UDP

Je sors d'un processus pour traiter les données entrantes afin que je puisse recvfrom aussi rapidement que possible - sans remplir mes tampons de noyau. L'enfant traite ensuite les données reçues.

En bref, mon algo est:

Reçoit les données.
Lorsque des données sont reçues, vérifiez les erreurs.
Enfourchez un enfant.
Si je suis un enfant, faites ce que je avec les données et quittez.
Si je suis un parent, récolter des enfants zombie waitpid(-1, NULL, WNOHANG).
Répéter.

Tout d'abord, des commentaires à propos de ce qui précède? Je crée le socket avec socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), liaison avec AF_INET et INADDR_ANY et recvfrom sans indicateurs. Deuxièmement, quelqu'un peut-il suggérer quelque chose que je peux utiliser pour tester que cette application (ou au moins l'auditeur) peut gérer plus de messages que ce que j'attends? Ou, aurais-je besoin de pirater quelque chose ensemble pour le faire.

Je suppose que ce dernier serait meilleur, de sorte que je puisse comparer les données qui sont générées par rapport aux données reçues. Mais, les commentaires seraient appréciés.

Répondre

2

Les données ne peuvent être perdu

Vous va perdre des données, à moins que vous avez mis en place fiable deliviry vous sur le dessus de udp.

Écoutez les données. Lorsque les données sont reçues, vérifiez les erreurs. Fork sur un enfant.

Il me semble que vous sortez un enfant pour chaque paquet? Si c'est le cas, cela va être plutôt inefficace - vous allez créer 1000-10000 processus/sec si vous avez besoin de gérer 1000-10000 messages/sec. Plutôt garder une piscine autour de vos employés, et leur communiquer via une forme de IPC. Pour tester cela, je vous suggère de lancer un client qui fonctionne avec la journalisation/traçage sur le serveur. Vous aurez un contrôle total sur le taux d'envoi, vous pouvez envoyer les messages que vous voulez (par exemple, inclure vos propres numéros de séquence pour vérifier la livraison).