2010-08-10 5 views
1

Je travaille sur une application web Java pour tomcat6 qui propose des fonctionnalités de suggestion. Cela signifie qu'un utilisateur tape un texte libre et obtient des suggestions pour compléter sa contribution. Il est essentiel que l'application web doit réagir très rapidement pour avoir un sens.Comment hiérarchiser des threads spécifiques dans tomcat

Cette application Web propose des suggestions de données pouvant être modifiées à tout moment. Si de nouvelles données sont disponibles, l'index de suggestion sera créé entièrement en arrière-plan à l'aide d'un fil de démon. Si le processus de préparation des données est terminé, l'ancien index est supprimé et le nouvel index entre en jeu. Cela offre l'avantage de ne pas manquer de service.

Le processus d'arrière-plan pour la préparation des données coûte beaucoup d'énergie CPU. Cela provoque le blocage du service parfois pendant plus d'une seconde, ce qui rend le service moins utilisable et cause une mauvaise expérience utilisateur. Ma première tentative pour résoudre le problème consistait à mettre en pause tous les threads de préparation des données d'arrière-plan, lorsqu'une requête devait être traitée. Cette tentative réduit un peu le problème, mais le service n'est toujours pas fluide. Il n'est pas que le morceau de code pour générer les suggestions elle-même devient plus lent, mais il semble que Tomcat ne démarre pas le fil de la demande immédiatement tout le temps en raison de la charge élevée dans d'autres discussions (je suppose)

Je n'ai aucune idée de comment faire face à ce problème. Puis-je interagir avec le planificateur de thread de tomcat et lui dire de forcer l'exécution des demandes? Comme prévu, l'ajustement de la priorité du fil n'a pas aidé non plus. Je n'ai pas trouvé d'options de configuration pour Tomcat qui offrent de l'aide. Ou n'y a-t-il aucun moyen de faire face à cela et je dois modifier le concept de logiciel? Je suis impuissant. Avez-vous des conseils pour ma façon de faire face à ce problème?

JanP

+0

Avez-vous réglé les tâches d'arrière-plan sur une priorité inférieure? – Jes

+0

Oui, j'ai réduit les tâches d'arrière-plan à la priorité la plus basse. Mais cela n'a pas aidé. La priorité des threads est juste un indice pour le planificateur, donc je ne m'attendais pas à une grande aide de cette optimisation. Ce que je veux, c'est suspendre immédiatement tous les threads d'arrière-plan lorsqu'une requête utilisateur arrive. –

+0

Créez-vous vos propres threads pour le traitement en arrière-plan, ou utilisez le thread existant créé par tomcat pour gérer la requête web? – mdma

Répondre

1

Je ne changerait pas la priorité du fil, faisant que vous ralentissez autres threads et ralentirez d'autres utilisateurs. Si vous avez des données synchronisées, vous rencontrerez un problème d'inversion de priorité, où vos threads les plus rapides attendent les threads de priorité inférieure pour libérer les verrous sur les données. Au lieu de cela, je regarderais comment optimiser le processus de génération de données. Que faites vous ici ?

EDIT:

Vous pouvez créer un ExecutorService et envoyer des messages à travers une file d'attente comme dans cet exemple: java thread pool keep running Afin de pouvoir modifier la priorité du fil des tâches au lieu d'appeler la piscine ExecutorService = Huissiers. newFixedThreadPool (3); vous créeriez une ThreadFactory et ensuite l'ThreadFactory réduiriez la priorité des Threads, puis appelez ExecutorService pool = Executors.newSingleThreadExecutor (threadFactory);

+0

Le processus de génération de données est indépendant des requêtes (pas d'objets ou de données partagés). Il a juste besoin de beaucoup de puissance CPU pour construire un nouvel index de suggestion. Tant qu'il fonctionne, l'ancien index est utilisé. Il n'y a pas de problème pour mettre en pause le thread de génération de données. Quand une demande arrive, je suspend le processus de travail en arrière-plan (en utilisant un sémaphore) pour le moment de la demande.Mais c'est trop tard, parce que Tomcat lui-même a besoin de temps pour transmettre la requête à mon application web (je suppose), peut-être parce que le planificateur de thread sous-jacent n'a plus de tranches de temps immédiatement? –

+0

@Jan P Existe-t-il un ensemble de données pour tous les utilisateurs ou les données sont-elles différentes pour chaque utilisateur? –

+0

tous les utilisateurs travaillent sur le même index de suggestion, mais cela ne peut pas être la raison des temps de réponse lents, car le service est lent avec un seul utilisateur (accès séquentiel à l'index de suggestion). –

Questions connexes