Διένεξη, κακή απόδοση και προβλήματα όταν κάνετε αιτήσεων υπηρεσίας Web από ASP.NET εφαρμογές

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 821268 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Συμπτώματα

Όταν πραγματοποιείτε κλήσεις σε υπηρεσίες XML Web από μια ASP.NET εφαρμογή, ενδέχεται να αντιμετωπίσετε ασυμφωνίας, κακή απόδοση και προβλήματα. Οι υπολογιστές-πελάτες ενδέχεται να αναφέρει αιτήσεις να σταματήσει να ανταποκρίνεται (ή "κολλάει") ή να λάβει μια πολύ πολύ χρόνο για να εκτελεστεί. Εάν υπάρχει υπόνοια σε αδιέξοδο, μπορεί να είναι διαδικασία εργασίας ανακύκλωση. Ενδέχεται να λάβετε τα ακόλουθα μηνύματα στο αρχείο καταγραφής συμβάντων εφαρμογής.
  • Εάν χρησιμοποιείτε Microsoft Internet Information Services (IIS) 5.0, λαμβάνετε τα ακόλουθα μηνύματα σε περίπτωση εφαρμογής αρχείο καταγραφής:

       Event Type:     Error
       Event Source:   ASP.NET 1.0.3705.0
       Event Category: None
       Event ID:       1003
       Date:           5/4/2003
       Time:           6:18:23 PM
       User:           N/A
       Computer:       <ComputerName>
       Description:
          aspnet_wp.exe  (PID: <xxx>) was recycled because it was suspected to be in a deadlocked state.
          It did not send any responses for pending requests in the last 180 seconds.

  • Αν χρησιμοποιείτε IIS 6.0, λαμβάνετε το ακόλουθο μηνύματα στο αρχείο καταγραφής συμβάντων εφαρμογής:

       Event Type:     Warning
       Event Source:   W3SVC-WP
       Event Category: None
       Event ID:       2262
       Date:           5/4/2003
       Time:           1:02:33 PM
       User:           N/A
       Computer:       <ComputerName>
       Description:
          ISAPI 'C:\Windows\Microsoft.net\Framework\v.1.1.4322\aspnet_isapi.dll' reported itself as
          unhealthy for the following reason: 'Deadlock detected'.

  • Αν χρησιμοποιείτε IIS 6.0, λαμβάνετε το ακόλουθο μηνύματα στο αρχείο καταγραφής συμβάντων συστήματος:

       Event Type:     Warning
       Event Source:   W3SVC
       Event Category: None
       Event ID:       1013
       Date:           5/4/2003
       Time:           1:03:47 PM
       User:           N/A
       Computer:       <ComputerName>
       Description:
          A process serving application pool 'DefaultAppPool' exceeded time limits during shut down.
          The process id was '<xxxx>'.

Ενδέχεται επίσης να λάβετε το ακόλουθο μήνυμα λάθους εξαίρεσης όταν το μήνυμα Μπορείτε να κάνετε μια κλήση προς το HttpWebRequest.GetResponse μέθοδος:
"System.InvalidOperationException: Δεν υπήρχαν αρκετά ελεύθερων νημάτων στο αντικείμενο έφυγε για την ολοκλήρωση της η λειτουργία."
Ενδέχεται επίσης να λάβετε το ακόλουθο μήνυμα λάθους εξαίρεσης στο πρόγραμμα περιήγησης:
"HttpException (0x80004005): το χρονικό όριο αίτησης Out."
Σημείωση Αυτό το άρθρο ισχύει επίσης για εφαρμογές που κάνουν HttpWebRequest αιτήσεις απευθείας.

Αιτία

Αυτό το ζήτημα μπορεί να προκύψει επειδή ASP.NET περιορίζει τον αριθμό εργαζόμενος νήματα και νήματα θύρας ολοκλήρωσης που μπορούν να χρησιμοποιούν μια κλήση για την εκτέλεση αιτήσεις.

Συνήθως, μια κλήση σε μια υπηρεσία Web χρησιμοποιεί ένα νήμα εργασίας για εκτέλεση κώδικα που αποστέλλει την αίτηση και νήματος θύρα μία ολοκλήρωσης λάβετε την επιστροφή κλήσης από την υπηρεσία Web. Ωστόσο, εάν η αίτηση είναι ανακατεύθυνση ή απαιτεί έλεγχο ταυτότητας, η κλήση μπορεί να χρησιμοποιήσει μέχρι δύο εργαζομένου και δύο νήματα θύρα ολοκλήρωσης. Επομένως, μπορεί να εξαντλήσει το διαχειριζόμενο Έφυγε κατά την ίδια στιγμή πολλαπλές κλήσεις της υπηρεσίας Web.

Για παράδειγμα, ας υποθέσουμε ότι το νήμα είναι περιορισμένη νημάτων εργασίας 10 και όλοι 10 νήματα εργασίας αυτήν τη στιγμή εκτελείτε κώδικα που είναι σε αναμονή για επιστροφή κλήσης Για να εκτελεστεί. Η επιστροφή κλήσης μπορεί να εκτελέσει ποτέ επειδή οποιαδήποτε στοιχεία που είναι εργασίας στην ουρά του έφυγε αποκλείονται, μέχρι να γίνει ένα νήμα είναι διαθέσιμη.

Μια άλλη πιθανή πηγή ασυμφωνίας είναι το MaxConnection που η παράμετρος που το System.NET χώρος ονομάτων χρησιμοποιεί για να περιορίσετε τον αριθμό των συνδέσεων. Γενικά, το όριο αυτό λειτουργεί όπως αναμένεται. Ωστόσο, εάν πολλές εφαρμογές, δοκιμάστε να κάνετε πολλά αιτήσεις σε μία μόνο διεύθυνση IP, την ίδια στιγμή, νήματα ενδέχεται να χρειαστεί να περιμένετε είναι διαθέσιμη μια σύνδεση.

Προτεινόμενη αντιμετώπιση

Για να επιλύσετε αυτά τα προβλήματα, μπορείτε να συντονιστείτε τα εξής Οι παράμετροι του αρχείου Machine.config για τη βέλτιστη προσαρμογή την περίπτωσή σας:
  • maxWorkerThreads
  • minWorkerThreads
  • maxIoThreads
  • minFreeThreads
  • minLocalRequestFreeThreads
  • MaxConnection που
  • executionTimeout
Για να επιλύσετε με επιτυχία αυτά τα ζητήματα, κάντε τα εξής:
  • Περιορίστε τον αριθμό των σελίδων ASP.NET αιτήσεις που μπορεί να εκτελέσει σε την ίδια ώρα περίπου 12 ανά CPU.
  • Επιστροφές κλήσης υπηρεσίας Web να χρησιμοποιούν ελεύθερα νήματα σε επιτρέπουν την Έφυγε.
  • Επιλέξτε μια κατάλληλη τιμή για το MaxConnections η παράμετρος. Βασίσετε την επιλογή σας τον αριθμό των διευθύνσεων IP και Γενικά στα AppDomain που χρησιμοποιούνται.
Σημείωση Σύσταση για να περιορίσετε τον αριθμό των σελίδων ASP.NET αιτήσεις 12 ανά CPU είναι κάπως αυθαίρετη. Ωστόσο, το όριο αυτό έχει αποδειχθεί ότι λειτουργούν καλά για Οι περισσότερες εφαρμογές.

maxWorkerThreads και maxIoThreads

ASP.NET χρησιμοποιεί τις ακόλουθες ρυθμίσεις παραμέτρων δύο Για να περιορίσετε το μέγιστο αριθμό νημάτων εργασίας και ολοκλήρωση νημάτων που είναι χρησιμοποιούνται:
<processModel maxWorkerThreads="20" maxIoThreads="20">
Το maxWorkerThreads η παράμετρος και η maxIoThreads η παράμετρος σιωπηρά πολλαπλασιασμένο με τον αριθμό των CPU. Για παράδειγμα, εάν έχετε δύο επεξεργαστές, ο μέγιστος αριθμός νημάτων εργασίας είναι τα ακόλουθα:
2 * maxWorkerThreads

minFreeThreads και minLocalRequestFreeThreads

ASP.NET περιέχει επίσης την ακόλουθη ρύθμιση παραμέτρων ρυθμίσεις για να καθορίσετε πόσα νήματα εργασίας και ολοκλήρωση θύρας νήματα πρέπει να είναι διαθέσιμη για να ξεκινήσετε μια απομακρυσμένη αίτηση ή μια τοπική αίτηση:
<httpRuntime minFreeThreads="8" minLocalRequestFreeThreads="8">
Εάν δεν υπάρχουν νήματα επαρκή διαθέσιμα, την αίτηση στην ουρά έως ότου επαρκή νήματα είναι ελεύθερα για την αίτηση. Επομένως, ASP.Θα NET δεν εκτελεστεί περισσότερες από τον παρακάτω αριθμό αιτήσεων ταυτόχρονα:
(maxWorkerThreads*αριθμό των CPU)-minFreeThreads
Σημείωση Το minFreeThreads η παράμετρος και η minLocalRequestFreeThreads η παράμετρος δεν σιωπηρά πολλαπλασιάζεται επί τον αριθμό των CPU.

minWorkerThreads

Ως των ASP.NET 1.0 Service Pack 3 και ASP.NET 1.1, ASP.NET περιέχει επίσης την ακόλουθη ρύθμιση παραμέτρων που προσδιορίζει τον τρόπο μπορούν να γίνουν πολλά νήματα εργασίας αμέσως για υπηρεσία απομακρυσμένης η αίτηση.
<processModel minWorkerThreads="1">
Νήματα που ελέγχονται από αυτήν τη ρύθμιση μπορούν να δημιουργηθούν με πολύ ταχύτερο ρυθμό από νήματα εργασίας που δημιουργούνται από το CLR προεπιλογή "νήμα-ρύθμιση" δυνατότητες. Αυτή η ρύθμιση ενεργοποιεί ASP.NET αιτήσεων υπηρεσίας που μπορεί να συμπλήρωση ξαφνικά η ASP.Ουρά αιτήσεων NET για την επιβράδυνση στο πίσω άκρο διακομιστής, αιφνίδιο καταιγισμού των αιτήσεων από το τέλος του προγράμματος-πελάτη ή κάτι παρόμοιο που θα προκαλέσει ξαφνική αύξηση του αριθμού των αιτήσεων στην ουρά. Το προεπιλεγμένη τιμή για το minWorkerThreads η παράμετρος είναι 1. Σας συνιστούμε να ορίσετε την τιμή για το minWorkerThreads η παράμετρος με την ακόλουθη τιμή.
minWorkerThreads = maxWorkerThreads / 2
Από προεπιλογή, το minWorkerThreads η παράμετρος δεν υπάρχει στο αρχείο Web.config ή το αρχείο Machine.config. Αυτή η ρύθμιση σιωπηρά πολλαπλασιασμένο με τον αριθμό των CPU.

MaxConnection που

Το MaxConnection που η παράμετρος καθορίζει πόσες συνδέσεις μπορεί να γίνει σε ένα συγκεκριμένη διεύθυνση IP. Η παράμετρος εμφανίζεται ως εξής:
<connectionManagement>
    <add address="*" maxconnection="2">
    <add address="65.53.32.230" maxconnection="12">
</connectionManagement>
Ρυθμίσεις για τις παραμέτρους που αναφέρθηκαν παραπάνω σε αυτό άρθρο είναι όλα στο επίπεδο διαδικασίας. Ωστόσο, το MaxConnection που ρύθμιση παραμέτρων εφαρμόζει στο επίπεδο του AppDomain. Από προεπιλογή, Επειδή αυτή η ρύθμιση εφαρμόζεται σε επίπεδο AppDomain, μπορείτε να δημιουργήσετε ένα μέγιστο δύο συνδέσεις με μια συγκεκριμένη διεύθυνση IP από κάθε AppDomain σε σας διαδικασία.

executionTimeout

ASP.NET χρησιμοποιεί την ακόλουθη ρύθμιση παραμέτρων για Περιορισμός ο χρόνος εκτέλεσης αίτησης:
<httpRuntime executionTimeout="90"/>
Μπορείτε επίσης να ορίσετε το όριο αυτό χρησιμοποιώντας το Server.ScriptTimeout η ιδιότητα.

Σημείωση Εάν αυξήσετε την τιμή της executionTimeout η παράμετρος, πρέπει επίσης να τροποποιήσετε το processModel responseDeadlockInterval ρύθμιση παραμέτρων.

Συστάσεις

Οι ρυθμίσεις που προτείνονται σε αυτήν την ενότητα ενδέχεται να μην λειτουργούν όλες οι εφαρμογές. Ωστόσο, οι ακόλουθες πρόσθετες πληροφορίες μπορεί να σας βοηθήσει να Κάντε τις κατάλληλες προσαρμογές.

Εάν κάνετε μία κλήση υπηρεσίας Web σε μία μόνο διεύθυνση IP από κάθε σελίδα ASPX Η Microsoft συνιστά να χρησιμοποιήσετε τις ακόλουθες ρυθμίσεις παραμέτρων:
  • Ορίστε τις τιμές του maxWorkerThreads η παράμετρος και η maxIoThreads παράμετρος 100.
  • Ορίστε την τιμή της MaxConnection που παράμετρος 12 *N (όπου N είναι ο αριθμός των CPU που έχετε).
  • Ορίστε τις τιμές του minFreeThreads παράμετρος 88 *N και το minLocalRequestFreeThreads παράμετρος76 *N.
  • Σύνολο η τιμή του minWorkerThreads Για να 50. Να θυμάστε, minWorkerThreads δεν είναι το αρχείο ρύθμισης παραμέτρων από προεπιλογή. Πρέπει να την προσθέσετε.
Ορισμένες Αυτές οι συστάσεις αφορούν απλού τύπου που περιλαμβάνει τον αριθμό της CPU σε ένα διακομιστή. Η μεταβλητή που αντιπροσωπεύει τον αριθμό των CPU στο του Οι τύποι είναι N. Για αυτές τις ρυθμίσεις, εάν έχετε ενεργοποιημένη, hyperthreading πρέπει να χρησιμοποιήσετε τον αριθμό των λογικών CPU αντί για τον αριθμό των CPU φυσική. Για παράδειγμα, εάν έχετε ένα διακομιστή τέσσερις επεξεργαστές με υπερνηματική ενεργοποιημένη, τότε η τιμή του N στους τύπους θα 8 αντί για 4.

Σημείωση Όταν χρησιμοποιείτε αυτήν τη ρύθμιση παραμέτρων, μπορείτε να εκτελέσετε το πολύ 12 ASP.NET αιτήσεις ανά CPU ταυτόχρονα επειδή 100 88 = 12. Επομένως, τουλάχιστον 88 *N εργαζόμενος νήματα και 88 *N νήματα θύρας ολοκλήρωσης διαθέσιμο για άλλες χρήσεις (όπως για τις επιστροφές κλήσης υπηρεσίας Web).

Για παράδειγμα, έχετε ένα διακομιστή με τέσσερις επεξεργαστές και hyperthreading ενεργοποιημένη. Βάσει αυτών των τύπων, θα χρησιμοποιήσετε τις ακόλουθες τιμές για το ρυθμίσεις παραμέτρων που αναφέρονται σε αυτό το άρθρο.
<system.web>
	<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
	<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>

<system.net>
	<connectionManagement>
		<add address="[ProvideIPHere]" maxconnection="96"/>
	</connectionManagement>
</system.net>

Επίσης, όταν χρησιμοποιείτε αυτήν τη ρύθμιση παραμέτρων, 12 συνδέσεις είναι διαθέσιμες ανά CPU ανά διεύθυνση IP για κάθε AppDomain. Επομένως, με την ακόλουθη το σενάριο, πολύ μικρή διένεξη προκύπτει όταν αιτήσεων που αναμένουν για συνδέσεις και το νήμα έχει εξαντληθεί:
  • Το Web φιλοξενεί μία μόνο εφαρμογής (AppDomain).
  • Κάθε αίτηση για ένα ASPX σελίδας κάνει μία υπηρεσία του Web η αίτηση.
  • Όλες οι αιτήσεις είναι η ίδια διεύθυνση IP.
Ωστόσο, όταν χρησιμοποιείτε αυτήν τη ρύθμιση παραμέτρων, σενάρια που περιλαμβάνουν ένα από τα παρακάτω είναι πιθανό να χρησιμοποιήσετε πολλές συνδέσεις:
  • Οι αιτήσεις σε πολλές διευθύνσεις IP.
  • Οι αιτήσεις είναι ανακατεύθυνσης (κωδικός κατάστασης 302).
  • Αιτήσεις απαιτούν έλεγχο ταυτότητας.
  • Γίνονται αιτήσεις από πολλές γενικά στα AppDomain.
Σε αυτά τα σενάρια, είναι καλή ιδέα να χρησιμοποιήσετε μια χαμηλότερη τιμή για το MaxConnection που η παράμετρος και υψηλότερες τιμές για το minFreeThreads η παράμετρος και η minLocalRequestFreeThreads η παράμετρος.

Κατάσταση

Αυτό η συμπεριφορά οφείλεται στη σχεδίαση.

Περισσότερες πληροφορίες

Εάν αντιμετωπίζετε κακή απόδοση και διένεξη στο IIS 7.0 με ASP.NET, ανατρέξτε στο ακόλουθο ιστολόγια Microsoft:

ASP.Χρήση NET νήμα στο IIS 7.0 και 6.0
http://blogs.MSDN.com/tmarq/Archive/2007/07/21/ASP-NET-thread-Usage-on-IIS-7-0-and-6-0.aspx
Κολλάει ASP.NET στις υπηρεσίες IIS 7.0
http://blogs.MSDN.com/webtopics/Archive/2009/02/13/ASP-NET-Hang-in-IIS-7-0.aspx

Αναφορές

Για περισσότερες πληροφορίες, επισκεφθείτε την ακόλουθη Microsoft Τοποθεσία Web Developer Network (MSDN):
http://msdn2.Microsoft.com/en-us/library/ms998549.aspx

Ιδιότητες

Αναγν. άρθρου: 821268 - Τελευταία αναθεώρηση: Κυριακή, 29 Μαΐου 2011 - Αναθεώρηση: 4.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft .NET Framework 2.0
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Λέξεις-κλειδιά: 
kbprb kbmt KB821268 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:821268

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com