100% CPU ב-IIS
English: how to find what can make your IIS server 100% crazy, and fix it. debugging high CPU usage by w3wp.exe with Microsoft's IIS debugging tools.
לעיתים נתקלים בשרת ש"נחנק" ומגיע ל-100% ניצולת מעבד. כמה רעיונות בסיסיים להתחלת פיתרון בבעיה.
במקרה כזה דפים מגיבים באיטיות, ומדי פעם נתקעים עם שגיאות כגון Service Unavailable או Server too busy.
1. מה חונק את השרת?
Ctrl + Alt + Esc יפעיל את מנהל המשימות. נמיין את "תהליכים" ונחפש מי מתעלל בשרת. בדרך כלל זה יהיה w3wp.exe, (ב-IIS5 זה היה אאל"ט dllhost.exe), אבל ממש לא תמיד.
זה יכול להיות גם מסד נתונים (mysqlnt.exe או sqlsrvr.exe ב-MySQL או SQL Server בהתאמה), אבל לא נדון בבעיה הזו הפעם (בעבר כתבתי על זה בקצרה, ובהמשך אדון בזה).
2. זיהוי האתר הגורם לבעיה
אחרי שווידאנו שהבעיה היא אכן w3wp.exe, נתחיל לבדוק מה קורה.
ראשית - יש להפריד כל אתר במערכת ל-Application Pool נפרד, ועכשיו נחכה לתקיעה הבאה. כשזו תקרה - "נרצח" את התהליך ונראה איזה אתר בדיוק זרק Service Unavailable. זה האתר הבעייתי.
3. איתור הדף הגורם לבעיה, שאת זה עושים עם IIS DebugDiag שאותו מורידים מכאן.
יש שם אשף קטן וקל להבנה שבו מחפשים את התקיעה ונותנים לו לזהות לבד, או לארוב ולבקש "DUMP" עכשיו.
את השלב הבא עדיף לעשות על המחשב הפרטי שלכם: העתיקו את תוצאות ה-DUMP מהתיקיה
C:\Program Files\DebugDiag\Logs
למחשב אחר, התקינו גם שם את הכלי והשתמשו באחד הסקריפטים המגיעים איתו, אלו שמיועדים לטפל בבעיות נפוצות.
בטאב Advanced Analysis תוכלו לבחור קבצי נתונים (תבחרו את ה-DUMPים מקודם) ולבחור תוכנית חיפוש.
העבודה תיקח הרבה מאוד זמן, זה בסדר.
צריך קצת ידע כדי לנתח את התוצאות, אבל זו בהחלט התחלה יעילה לאיתור הרכיב הבעייתי, ולמחשבה מה ניתן אחר כך לעשות איתו.
ועוד טיפ אחד קטן: הקפידו להגדיר Timeout נמוך (לא יותר מ-9-10 שניות) ברמת ASP/ASP.net, על מנת שהדף שתוקע אותכם יפול על Timeout לפני שהכל יפול על ניצולת CPU חריגה.
אם יש צורך, ניתן להחריג מהכלל הזה תיקיה או קובץ בודד.
עוד מומלץ (לאחר מחשבה על רכיבי האפליקציה ולא בצורה "עיוורת") להגדיר תחת Application Pools, מגבלה של 5-6 שניות על 100% ניצולת CPU, שלאחריה יבוצע Recycle, ויש עוד כלים רבים נוספים שיוסיפו לבריאות השרת שלכם.
נושא הביצועים בתחום ה-Web מורכב הרבה יותר משניתן לתאר, והכרות עמוקה עם התחום הזה, היא חובה של כל ראש צוות ומתכנת. מי שלא מכיר את התחום - חזקה עליו שיכיר אותו בדלית ברירה ועדיף שלא בשעות הלילה המאוחרות כשהוא חולם על הכרית והמיטה.
מבחר הפיתרונות שקיים היום רחב למדיי, והיכולת להתמודד ולהכיר את הפיתרון הטוב ביותר (מה שמנוגד לא אחת לקלות הפיתוח שמבטחיחים רכיבי ASP.NET שונים) היא מורכבת.
בהצלחה !
עוד לקריאה:
Timeout בסביבת ייצור (עיינו גם בתגובות!)
בעיות ופתרונות בשימוש ב-OutputCache