2010-01-31 5 views
1

J'ai quelques PC embarqués lentement fonctionnant sous Windows 2000 et j'ai du mal à démarrer un service de manière fiable. Il y a un délai TRÈS perceptible entre l'émission de la commande 'net start xxx' et le message 'the xxx service is starting'. Cela provoque le démarrage de mon service.commande de démarrage net retardée?

Mon service ne parvient pas régulièrement à recevoir une commande 'Démarrer' (je suis en train de m'enregistrer et je peux voir que cela ne se produit jamais).

J'ai essayé de répéter ceci sur une boîte XP beaucoup plus rapide, mais le délai est bien sûr BEAUCOUP plus court. J'ai cependant ajouté délibérément un sleep (60000) dans mon handler Onstart - pour simuler un démarrage lent.

Sur cette boîte (XP) - même si la commande net start renvoie 'le service xxx n'a pas pu être démarré (après environ 20+ secondes), le service semble continuer et commence effectivement. Pendant ce temps, le responsable du service signale le «démarrage» - jusqu'à ce que mon sommeil (60000) se termine et que les rapports du gestionnaire de service aient commencé.

J'ai ÉGALEMENT essayé de mettre l'entrée de registre 'ServicesPipeTimeout' à 65000 - et cela semble n'avoir fait aucune différence: -O- oui j'ai fait un redémarrage ;-).

Quelqu'un at-il une idée de pourquoi cela se produit s'il vous plaît? Même si j'ai défini mon entrée de registre 'ServicesPipeTimeout' sur 65000 - le démarrage net échoue au bout de 20 secondes: -O.

Il semblerait que si je parviens à obtenir une commande de démarrage émise avant que cette commande 'net start' expire - mon service démarrera en effet. C'est pourquoi j'ai essayé de définir l'entrée de registre 'ServicesPipeTimeout' sur 65000 - mais cela ne semble pas faire de différence du tout. NB Mon application de service est écrite en C# en utilisant VS2008 ciblé sur .Net Framework V2 - comme c'est tout ce que les anciennes boîtes 2000 peuvent supporter.

Un grand merci - jamais je l'espère ....

Cordialement

Graham

Répondre

1

Eh bien, il est vraiment ServicePipeTimeout qui contrôle le délai d'attente. Ce qui n'est pas clair, c'est quand ce minuteur commence à cocher. Le fait que votre OnStart() ne soit pas appelé indique qu'il démarre lorsque le SCM crée le processus. Le prochain saut mental qui peut être fait est que le délai de 30 secondes s'applique toujours à l'heure de début du processus, indépendamment de la valeur du registre.

La boîte est vraiment en mauvais état si le temps de démarrage à froid .NET est supérieur à 30 secondes. Le temps de démarrage à froid est dominé par les performances du disque dur, environ 85% du temps est consacré à la localisation et au chargement des DLL. Normalement. C'est presque possible si le disque dur n'a jamais été défragmenté et que vous avez récemment installé .NET dessus. Cela entraînerait la dispersion des clusters des fichiers .NET sur tout le disque, ce qui nécessiterait de nombreux mouvements de la tête de lecture. Cela peut réduire considérablement le débit de données, aussi bas qu'un kilo-octet par seconde si chaque cluster est sur une piste différente.

Cela pourrait être aussi simple que de défragmenter le disque. Posez des questions à ce sujet à superuser.com

0

Hmmmm,

Je l'ai fait un peu plus de travail à ce sujet et ce ne est pas en réalité .Net qui prend son temps, son interface ServiceController: -O. Pour contourner ce problème a écrit une application 'Controller' (utilisant .Net 2), et le holdup est dans l'appel à 'sc.start '- Ceci a été appelé immédiatement après la première entrée du journal, mais j'ai reçu une exception ~ 30 secondes plus tard

02 Feb 2010 07: 15: 26: 752, CarwashClient est arrêté 02 Fév 2010 07:15:57: 556, StartService(): Exception: Impossible de démarrer le service CarwashClient sur l'ordinateur '.'. 02 Feb 2010 07: 15: 57: 586, StartService(): Exception: Le service n'a pas répondu à la demande de démarrage ou de contrôle en temps opportun

Maintenant - comme l'application du contrôleur utilise .Net, puis la plupart des les bibliothèques requises auraient déjà été chargées.

Mon service n'a jamais vu l'événement OnStart - car il enregistre également et rien n'apparaît dans le journal.

Mon service n'a également aucune dépendance définie - il n'obtient pas l'événement OnStart: -O.

J'ai maintenant réécrit mon contrôleur pour réessayer 3 fois dans le cas où il obtient une exception de délai. J'essaierai plus tard quand je pourrai revenir sur la boîte ....

Il y a évidemment un certain retard important de chargement qui se passe avec la bibliothèque de servicecontroller je suppose: -O.

Pour répondre aux autres points soulevés, c'est seulement un processeur 300MHz dans un PC embarqué :-). Même ainsi - il ne devrait pas être aussi lent. Bon point sur le défragment mais si c'est arrivé jusqu'à présent sur deux cases sur deux: -O.

Merci

Graham

Questions connexes