Αυτήν τη στιγμή είστε εκτός σύνδεσης, σε αναμονή για επανασύνδεση στο Internet

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

ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο έχει μεταφραστεί χρησιμοποιώντας λογισμικό μηχανικής μετάφρασης της Microsoft και μπορείτε να το διορθώσετε χρησιμοποιώντας την τεχνολογία Community Translation Framework (CTF) (Πλαίσιο μετάφρασης κοινότητας). Η Microsoft παρέχει μηχανική μετάφραση, επεξεργασία μετά τη μηχανική μετάφραση από την κοινότητα και άρθρα μεταφρασμένα από επαγγελματίες προκειμένου να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής βάσης σε πολλές γλώσσες. Τα άρθρα μηχανικής μετάφρασης και αυτά που επεξεργάζονται ύστερα από μηχανική μετάφραση ενδέχεται να περιέχουν σφάλματα στο λεξιλόγιο, στη σύνταξη ή/και στη γραμματική. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες μας. Για περισσότερες πληροφορίες σχετικά με το CTF, μεταβείτε στην τοποθεσία http://support.microsoft.com/gp/machine-translation-corrections/el.

Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη: 821268
Συμπτώματα
Όταν πραγματοποιείτε κλήσεις σε υπηρεσίες Web από μια εφαρμογή Microsoft ASP.NET, ενδέχεται να αντιμετωπίσετε ασυμφωνίας, κακή απόδοση και προβλήματα. Οι υπολογιστές-πελάτες ενδέχεται να αναφέρει αιτήσεις να σταματήσει να ανταποκρίνεται (ή "κολλάει") ή να διαρκέσει πολύ χρόνο για την εκτέλεση. Εάν υπάρχουν υπόνοιες αδιέξοδη κατάσταση, η διαδικασία εργασίας μπορεί να είναι ανακύκλωση. Ενδέχεται να λάβετε τα ακόλουθα μηνύματα στο αρχείο καταγραφής συμβάντων της εφαρμογής.
  • Εάν χρησιμοποιείτε 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): έληξε το χρονικό όριο της αίτησης."
Σημείωση Αυτό το άρθρο ισχύει επίσης για εφαρμογές που κάνουν HttpWebRequest αιτήσεις απευθείας.
Αιτία
Αυτό το ζήτημα μπορεί να προκύψει επειδή ASP.NET περιορίζει τον αριθμό των νημάτων εργασίας και νήματα θύρας ολοκλήρωσης που μπορεί να χρησιμοποιούν μια κλήση για την εκτέλεση αιτήσεων.

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

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

Μια άλλη πιθανή προέλευση του ανταγωνισμού είναι η παράμετρος του μέγιστου αριθμού συνδέσεων που χρησιμοποιεί τον χώρο ονομάτων System.Net για να περιορίσετε τον αριθμό των συνδέσεων. Γενικά, το όριο αυτό λειτουργεί όπως αναμένεται. Ωστόσο, εάν πολλές εφαρμογές προσπαθεί να κάνει πολλές αιτήσεις σε μία μόνο διεύθυνση IP, την ίδια στιγμή, νήματα ενδέχεται να πρέπει να περιμένετε για μια διαθέσιμη σύνδεση.
Προτεινόμενη αντιμετώπιση
Για να επιλύσετε αυτά τα προβλήματα, μπορείτε να συντονιστείτε τις ακόλουθες παραμέτρους στο αρχείο Machine.config ταιριάζει καλύτερα στην περίπτωσή σας:
  • maxWorkerThreads
  • minWorkerThreads
  • maxIoThreads
  • minFreeThreads
  • minLocalRequestFreeThreads
  • μέγιστου αριθμού συνδέσεων
  • παράμετρο executionTimeout
Για να επιλύσετε με επιτυχία αυτά τα ζητήματα, εκτελέστε τις εξής ενέργειες:
  • Περιορισμός του αριθμού των αιτήσεων ASP.NET που μπορούν να εκτελεστούν ταυτόχρονα σε περίπου 12 ανά CPU.
  • Επιτρέπει τις επιστροφές κλήσης υπηρεσίας Web να χρησιμοποιούν ελεύθερα νήματα με το νήμα.
  • Επιλέξτε την κατάλληλη τιμή για το μέγιστο αριθμό παραμέτρων. Βασίσετε την επιλογή σας για τον αριθμό των andAppDomains διευθύνσεις IP που χρησιμοποιούνται.
Σημείωση Η σύσταση για να περιορίσετε τον αριθμό των αιτήσεων 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.

μέγιστου αριθμού συνδέσεων

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

παράμετρο executionTimeout

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

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

Συστάσεις

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

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

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

Για παράδειγμα, έχετε ένα διακομιστή με τέσσερις επεξεργαστές και υπερνηματική ενεργοποιημένη. Με βάση αυτούς τους τύπους, που θα χρησιμοποιούσατε τις ακόλουθες τιμές για τις ρυθμίσεις παραμέτρων που αναφέρονται σε αυτό το άρθρο.
<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).
  • Αιτήσεις απαιτούν έλεγχο ταυτότητας.
  • Αιτήματα από πολλούς AppDomains.
Σε αυτά τα σενάρια, είναι καλή ιδέα να χρησιμοποιήσετε χαμηλότερη τιμή για την παράμετρο του μέγιστου αριθμού συνδέσεων και υψηλότερες τιμές για την παράμετρο minFreeThreads και την παράμετρο minLocalRequestFreeThreads .
Κατάσταση
Αυτή η συμπεριφορά οφείλεται στη σχεδίαση.
Περισσότερες πληροφορίες
Εάν παρουσιάζονται χαμηλές επιδόσεις και διένεξης στο IIS 7.0, μαζί με το ASP.NET, μεταβείτε στα ακόλουθα ιστολόγια της Microsoft:
Αναφορές
Για περισσότερες πληροφορίες, μεταβείτε στην ακόλουθη τοποθεσία Web Microsoft Developer Network (MSDN):

Προειδοποίηση: Αυτό το άρθρο έχει μεταφραστεί με μηχανική μετάφραση

Ιδιότητες

Αναγνωριστικό άρθρου: 821268 - Τελευταία αναθεώρηση: 03/15/2015 04:27:00 - Αναθεώρηση: 5.0

Microsoft .NET Framework 2.0, Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbprb kbmt KB821268 KbMtel
Σχόλια
xt/javascript" src="https://c.microsoft.com/ms.js">
España - Español
Paraguay - Español
Venezuela - Español
>/c1.microsoft.com/c.gif?DI=4050&did=1&t=">cript" async=""> var varAutoFirePV = 1; var varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write(" >>ow.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");