גדי מאיר, האיש וה-BSOD, כתב על כלים של Microsoft שנועד ליצור קשר בין צוותי הפיתוח לבין אנשי התשתיות שתפקידם לדאוג שהאפליקציה אכן תעבוד ולא תתעופף לה.
בתור מי שעיקר עיסוקו הוא איתור בעיות הוא מן הסתם נתקל בבעיה הנפוצה הזו.
בתור מי שנמצא לעיתים משני צידי המתרס (בחלק מהרכיבים מעורב גם בטיפול בתשתית ובאחרים – פשוט מנחה את איש התשתיות מה לעשות), אני חושב שיש נקודה אחת פה שחסרה בהרבה ארגונים:
המפתח חייב לדעת מה קורה בריצה של האתר שלו, ולא רק ב-Visual Studio וב-IIS Express המקומי שלו
מפתח צריך לדעת (גם אם הוא משתמש ב-ORM) מה המשמעות של כל פעולה שהוא מבצע על בסיס הנתונים ומה המחיר שלה.
מפתח צריך לדעת איך לתפוס שגיאות של בסיס נתונים ולשלוח מידע שימושי (לא "SQL קרס" אלא "שרת SQL שכתובתו … קרס", עוזר לתשתיות למצוא שגיאות טיפשיות בקונפיגורציה, או סתם כשיש יותר משרת אחד)
מפתח צריך לדעת כל מיני דברים בסיסיים על איך עובד IIS (בשונה מ-IIS Express! שיותר מדי מפתחים משתמשים בו). ברירת המחדל של VS למשל רצה עם ההרשאות של המשתמש, בעוד ש-IIS רץ עם חשבונות משתמשים מוגבלים משלו ויש עוד כל מיני דברים שטעונים התייחסות.
מפתח צריך לדעת אם הוא למשל עובד מול שיתוף ברשת, מה המגבלות של הפרוטוקול הזה ומה החסרונות שלהם.
מפתח צריך לדעת מה המשמעות של timeout, ולדעת להשתמש בו (ולא להשתמש ב"פיתרון הפלא" של הארכת ה-timeouts כדי להעלים הודעות שגיאה).
מפתח צריך לדעת איך נראה פרוטוקול HTTP, ומה המשמעות של 20 מליון התמונות שהוא השתמש בהן בדף הראשי, וגם לריב עם הגרפיקאי/להתחכם כדי למצוא פיתרון שהעיצוב המפוצץ שלו יעלה במינימום זמן.
אגב פרוטוקול HTTP, גם להכיר את המשמעות של headers של cache לא יזיק להכיר.
מפתח צריך לדעת, ולא לגלגל את האחריות על ראש הצוות או על מישהו אחר.
משה.
רוב האתרים המציגים סטטיסטיקות דפדפנים עוסקים באנשי טכנולוגיה, שמטבע הדברים עובדים בד"כ עם גרסאות עדכניות ו/או כלים פחות נפוצים.
בעולם המשתמשים הפשוטים (ועובדי משרדי ממשלה, וכל מיני גופים גדולים כאלה), בישראל מסתבר, עולם כמנהגו נוהג, ולא נראה שיש משהו שמסוגל להעלים מהסטטיסטיקות גירסאות עתיקות של IE.

בעוד מפתחי Firefox ו-Chrome משתדלים לשדרג כמה שיותר משתמשים לגרסה כמה שיותר עדכנית, Microsoft התחילה לעשות את זה רק בגרסה האחרונה שלה, 10. שיהיה להם בהצלחה.
41% ממשתמשי IE (וכ-18% מכלל הגולשים) משתמשים עדיין ב-IE8 שיצא ב-2009. לבחירה המצערת של Microsoft לא לשדרג דפדפן למשתמשי XP(כ-35% מהמשתמשים) יש כנראה יד ורגל בעניין הזה.

הרבה מאוד מפתחים אוהבים לקטר על IE שהוא דפדפן גרוע. האמת קצת שונה. את העולם הוירטואלי הכרתי למעשה עם IE 5. השדרוג ל-IE5.5 היה בהחלט שיפור. בעוד שמשתמשי Netscape עדיין גררו את העולם אחורה עם עברית ויזואלית משתמשי הדפדפן המיקרוסופטי היו הראשונים שיכלו למשל לקרוא עברית בצורה תקינה והגיונית. את IE6 הכרתי עוד משלבי הבטא שלו (אותו הורדתי באמצעות מודם 56K) והוא היה דפדפן טוב לזמנו. הבעיה העיקרית איתו זה שגם אחרי עשור הוא עדיין איתנו.
IE10 הוא באמת דפדפן מצויין, אבל כשהוא מהווה 2.3% ממשתמשי IE (כלומר כ-1% מהמשתמשים) הוא לא דבר שבאמת אפשר להסתמך עליו.
מצד שני, הסנדלר הולך יחף. למעל חצי מהעובדים פה במערכת יש IE8, והם מתנגדים בתוקף לשדרוג בגלל כמה דברים אזוטריים.
ה"תסריט" הבא חזר על עצמו בכמה מקרים שונים שטיפלתי בהם: שרת שמיועד לאחסון קבצים (ובמיוחד קבצי וידאו), במקרה אחד היה מדובר במערכת אחסון מרכזית (Storage) של יצרן מפורסם. בשעות השיא המערכת פשוט לא מספקת את הוידאו מספיק מהר והגולשים החלו מתלוננים על איטיות.
ספק מערכת האחסון או השרת הציע פשוט לעבור לדגם יקר (הרבה) יותר. מנהל המערכת העדיף להתקשר אליי.
השלב הראשון היה זיהוי הבעיה. "בדיקת מהירות" פשוטה מול שרת מהיר. הן זו המוכרת מאתרי אינטרנט שונים, והן IPerf, שפשוט מעביר כמויות גדולות של תעבורה מצד לצד.
במקרים בהם זו הייתה הבעיה – השלב הבא היה טלפון לחווה להגדלת הפס. הרבה מאוד פעמים – זו לא הייתה הבעיה.
נשארנו עם בעיית חומרה: מערך הדיסקים או ה-Storage פשוט לא מהיר מספיק.
המשותף לכל המקרים היה, קבצי וידאו/התמונות סופקו למערכת משרת קבצים או NAS. במקרה של אלו מבוססי לינוקס, השלב הבא היה להפעיל שם את פרוטוקול SMB2 על ידי התקנה של Samba בגרסה מעודכנת ושינוי קבצי ההגדרות בהתאם – זה הועיל, אבל לא פתר את הבעיה.
אני לא התייאשתי, ונזכרתי של-IIS יש אפשרות ותיקה בשם Kernel Cache, כלומר שמירת קבצים סטטיים בזיכרון.
החלטתי ללכת על פתרון Reverse Proxy ולנצל את האפשרות הזו.
האמור כאן מכוון כלפי IIS, אבל יעבוד על כל שרת Proxy תומך אחר, כולל Apache, Squid, Nginx ואחרים.
השלב הראשון היה התקנת שרת HTTP כלשהו בשרת הקבצים.
השלב השני, הינו שימוש ב-IIS, אבל עם ההגדרות המתאימות.
אם מדובר בשרת שמספק קבצי טקסט - צריך לפתוח את מסך ההגדרות של IIS, אייקון Compression (דחיסה), ולהפעיל דחיסה על תכנים סטטיים.
לוודא שמוגדרת תיקיה שאפשר לכתוב לתוכה, ולוודא שיש מגבלת שטח דיסק הגיונית.
אם מדובר בוידאו, כדאי להפעיל ולהגדיר נכון את BitRate Throttling, כדי לחסוך בתעבורה ו-I/O יקרים.
כעת נעבור למסך Output Caching, גם כן ב-IIS.
תחת האפשרות Edit Feature Settings, נסמן את Enable cache, Enable kernel cache, ונשנה את המספרים שבברירת המחדל, לכמה שיותר – בהתאם להגיון וכמות הזיכרון שיש לנו.
בשלב הבא צריך להתקין את IIS Application Request Routing. לאחר שיותקן ניגש לאייקון Application Request Routing, ונפעיל משם את הפרוקסי (תחת האפשרות Server Proxy Settings).
בהתאם לכמות הזיכרון, נשנה את זמן השהיה בזיכרון (Memory cache duration) למשהו יותר סביר מדקה, ובהתאם לתשתית – לאפשר Disk cache.
חשוב מאוד לאפשר Request Consolidation – חוסך עוד קצת I/O.
Apply.
עכשיו נשאר רק להגדיר Rewrite Rule שישתמש בפרוקסי. לא ארחיב על זה כאן אבל יש מדריכים מתאימים בשפע.
השלב הבא יהיה לבדוק ש-Kernel Cache עובד.
נפעיל שורת פקודה, ונכתוב שם:
C:\Users\Administrator>netsh http show cachestate | more
Snapshot of HTTP response cache:
--------------------------------
URL: http://internallink/filename2
Status code: 200
HTTP verb: GET
Cache policy type: Time to live
Cache entry Time to Live (secs): 31536000
Creation time: 2012.10.31:13.55.52:0
Request queue name: DefaultAppPool
Content type: video/x-ms-wmv
Content encoding: (null)
Headers length: 346
Content length: 690299
Hit count: 310
Force disconnect after serving: FALSE
URL: http://internallink/filename
Status code: 200
HTTP verb: GET
Cache policy type: Time to live
Cache entry Time to Live (secs): 31536000
Creation time: 2012.9.3:6.47.21:0
Request queue name: DefaultAppPool
Content type: video/x-ms-wmv
Content encoding: (null)
Headers length: 347
Content length: 1473071
Hit count: 209
Force disconnect after serving: FALSE
...
אם הכל הוגדר כהלכה, נראה פה קבצים במלוא אורכם, המסופקים מתוך הזיכרון של השרת מספר הפעמים שב-Hit count.
אם חלק משמעותי של הקבצים אצלכם חוזרים על עצמם, תראו פה חיסכון של עד 50%. אם הקבצים מגיעים משרת קבצים או NAS, תראו גם חיסכון בתעבורה ברשת הפנימית וירידה בעומס על ה-NAS.
לעיתים הקבצים נמשכים מאותה מכונה, אבל מדיסקים קשיחים מבוססי SATA בגלל מחירם הזול ונפחם הגדול. אם זה המצב – לעיתים ניתן לוותר על השדרוג לדיסקים יקרים יותר, ופשוט להוסיף למערכת עוד קצת זיכרון, או דיסק מהיר אחד קטן (SSD) שישמש כמטמון לאחסנת קבצים שניגשים אליהם בתדירות גדולה יותר.
עשר הדקות שלי חלפו, הפרוקסי הוגדר בהצלחה, והמתלונן (או הבוס) חזר לשולחנו רגוע ומרוצה.
על MySQL הוותיק והפופולארי מן הסתם כולם שמעו, וחלק אפילו משתמשים או השתמשו בעבר. מי שלא - כדאי תמיד להכיר.
עם עליית הפופולאריות שלו נתקלו המשתמשים בבעיות Scaling ואחרות שהגירסא הרשמית לא תמיד ענתה עליהם, כל מיני משתמשים התחילו לפתח פאצ'ים עם שיפורי ביצועים ויכולת. זה התחיל בעיקר עם Google ועם Facebook Patch והמשיך עם הפצות בינאריות של ממש.
בניגוד לשאר תואמי-MySQL (למשל Percona Server) שמגיעים בגירסאות לינוקס בלבד,
MariaDB מגיע גם עם
MSI להתקנה פשוטה על Windows לסוגיו, וגם עם סדרה ארוכה של תיקונים שמטרתן לעבוד טוב יותר ולנצל את מלוא הכח של מערכת ההפעלה הזו.
בצד האפליקציה אין הבדל: ה-Connector של MySQL לסביבת NET. ולקוחות גרפיים יעבדו עם כל התואמים ללא שינוי בקוד, כשכמובן שאפשר להתחבר גם לשרתי Linux וגם לשרתי Windows.
נקודת המוצא היא פשוט להחליף את MySQL ב-MariaDB. עוצרים את השירות הישן, מגדירים את החדש לאותה תיקיה של הישן ומפעילים אותו.
כשמתקינים את MariaDB מהקופסא הוא מגיע עם קובץ הגדרות (my.ini) מוצלח בהרבה מזה של ההפצה הרשמית, ועם רשימה ארוכה של שיפורים, כשהחלק שמעניין אותנו הוא בעיקר "מתחת למכסה המנוע", שגורם לשאילתות שאנחנו מריצים פשוט לעבוד יותר מהר ועם פחות נעילות. בין השאר הכניסו שם שיפורים ל-Optimizer, שמשפרים סוגים מסויימים של שליפות במאות ואף אלפי אחוזים.
בין השאר הוכנסו השיפורים הבאים בתחום הביצועים:
- שיפורי ביצועים ב-Subqueries שאפשר למדוד בעשרות ומאות אחוזים (במיוחד כשיש אינדקסים נכונים), ו-
devired queries.
- שיפורי ביצועים בתחום של רפליקציה (group commit).
- שיפורים בתחום I/O על Windows.
- ניהול Threadים נכון יותר ושימוש חוזר (בעיקר באפליקציות שניטרלו Connection Pooling בצד האפליקציה).
- שיפורים בטבלאות זיכרון (Heap) - הרחבה בהמשך.
המשמעות על בסיס הנתונים של ערוץ 7 למשל, לאחר התאמות באינדקסים ובשליפות לסביבה החדשה הייתה כ-70% ירידה ממוצעת במדדי ה-CPU וה-I/O של המכונות, וזה בשינוי פשוט יחסית שחטמעתו ארכה פחות משבוע (אם כי כמובן, אחרי כל עדכון גירסא, צריך היה לבדוק מה השתפר ואם יש ירידה בביצועים של שליפות אחרות).
אחת הפונקציות המעניינות של MySQL בכלל ושל MariaDB גם, היא היכולת להשתמש בטבלה זמנית, שיושבת בזיכרון, ותימחק עם כיבוי השרת, כך ניתן להשתמש בפונקציות של בסיס נתונים, בלי לבזבז I/O יקר לכתיבה לדיסק (ותוך כמובן לקיחת הסיכון לאובדן המידע במקרה של קריסה). ב-MariaDB בגירסא הבאה הולכים לשפר אותן כדי שיהיו טבלאות יותר אמיתיות ועם פחות מגבלות. ייתרון נוסף - הטבלאות הזמניות של המערכת (שנוצרות תוך כדי ביצוע שאילתות) עובדות עם הפורמט הזה שהוא מהיר בהרבה ביחס לזה של MySQL המקורי.
אין פה הרבה מה לנסות וכמובן שגם רשיון לא צריך, פשוט להוריד את הגירסא האחרונה שלהם ולהתחיל לשחק איתה. היא אפילו מגיעה עם GUI נחמד (למרות שאני מעדיף את MySQL Workbench).
בהצלחה!
משה.
______________
לא עסקתי פה באפשרויות חדשות שהם מציעים ולא נתמכות ב-MySQL, כי הדגש שלי כאן בבלוג הוא ביצועים ולא אלו.
ביום שלישי האחרון העברתי הרצאה (שחרגה אחר כך בהרבה מהזמן שתוכנן לה, על אף שכמתוכנן לא הספקתי לעבור על כל השקופיות) במפגש של פורום .NET בתפוז, שהתקיים במכללת סלע בבני ברק.
המצגת הזו לא תוכננה כמשהו להעמקה אלא יותר כראשי פרקים בתחומים רבים ומגוונים שנתקלתי בהם, כשעל כל שקופית כמעט אפשר להעמיק בעוד שעה (למשל כדי להכיר את Fiddler, או כל דבר אחר).
אני מתאר לעצמי שסעיף צד השרת רלוונטי בעיקר לאתרי אינטרנט ופחות למערכות עסקיות למינהן, אבל בכל זאת את העקרונות כדאי להכיר.
שאלות הקהל גרמו לי לחרוג מהמצגת במידה רבה ולהדגים דברים שלא חשבתי להתייחס אליהם (למשל שימושי כלי הרשת של IE9, וקצת Firebug מעבר לכח של Fiddler האגדי שבד"כ משמש לדברים אלה, וגם דיון על הפרדת שכבות למול ביצועים בשקופיות חלוקה לדפים ו-SQL), כך שחבל שבניגוד לפעם שעברה לא צילמו והקליטו גם את השאלות והמסביב.
כך או כך, המצגת לפניכם:
תהנו.
כל פעם שאני קורא על שיטה חדשה לעשות קוד "יפה" ונפלא. אני בעיקר חושב על ההשלכות שלה על.
במערכת שמחזיקה אלפי לקוחות (ולעיתים יותר) על שרתים בינוניים ומטה (ובעבר, גם על מה שמכונה בלשון העם "גרוטאות"), אנחנו כל הזמן חייבים לחשוב על המשמעות של כל פעולה שאנחנו עושים, מה המחיר שלה לעומת התועלת.
ערוץ 7 למשל, עד היום, למעשה לא משתמש ב-ORM בכלל!. במערכת שבה כל שאילתת SQL קצת כבדה מדי נשלחת לחינוך מחדש - אין אפשרות לתת למערכת צד-שלישי לייצר כאלה בשבילנו. כל חתיכת I/O היא משאב יקר מפז.
נהנתי מכל שורה !
אתמול אני מקבל דוא"ל פנייה משתמשת, שיש לו אוסף גדול של בעיות. לא הצלחתי להבין אף מילה.
עניתי בחזרה למייל, וקיבלתי משהו שנראה ככה:
ג„¢׳³ֲš: ׳³ג€™' ׳³ג€˜׳³ ׳³ג„¢׳³ֲ¡׳³ֲŸ ׳³׳³׳³ֲ©׳³ֲ¢"׳³ג€˜, 26 ׳³ֲž׳³ֲ¨׳³ֲ¥
(למי שלא יודע, זה מה שקורה כששולחים עברית ב-utf-8 והצד השני קורא אותה כ-windows-1255)
מדובר במוצר שעובד אצל עשרות אלפי משתמשים בכל דפדפן אפשרי מ-IE7 ומעלה.
היה לי ברור שזו בעיה של המחשב המקומי, אבל לא היה לי קצה של חוט.
ביקשתי גישה מרחוק ב-Team Viewer למחשב של הלקוחה.
הלכתי להגדרות של IE, ביטלתי את כל סרגלי הכלים של וואלה, מאקו, נענע10 ולא זוכר מה עוד. הפעלה מחדש של הדפדפן – והכל עובד תקין.
עכשיו כבר התעניינתי באמת, ואז נזכרתי שבעבר עשיתי שינוי בתוך הקוד של jquery, כדי שישלח תוכן כ-windows-1255 ולא ב-UTF-8. השינוי עובד ותקני בכל הדפדפנים.
אחד הסרגלים (לא היה לי זמן ועצבים להבין איזה בדיוק) – פשוט "משכתב" את JQuery Ajax ופוגם בו. אני חושד שכדי לרגל ולשלוח העתק לשרת נוסף של כל התוכן שנשלח באמצעות AJAX, אבל אין לי באמת מושג למה.
על כל פנים – הלקוחה מרוצה. המחשב שלה גם זז קצת יותר מהר עכשיו.
בשבוע האחרון שדרגתי את תוכנת MySQL Workbench לגירסתה האחרונה (5.2.36). מעבר לחידושים שהוכנסו לשם (הגרפיים, ותיקוני הבאגים), אפשר לשים לב בעיקר לנסיון להתקרב למראה הכללי של התוכנה המקבילה עבור SQL Server

הגירסא החדשה של המוצר הזה משפרת את היציבות והופכת את הכלי להרבה יותר פונקציונלי ונוח לשימוש.
המסך הראשי שבו כותבים ומריצים שאילתות SQL השתנה בצורה משמעותית. הדבר הראשון – ביטול ההבדל בין הטאבים למעלה (השאילתות) לטאבים למטה (התוצאות) שעבדו בצורה קצת מוזרה בגירסה הקודמת, בין השאר, הם מאפשרים עריכה של תוצאות של בקשות SQL (יותר מתוחכם מה"Edit 200 Rows" של SSMS או Edit של הגירסא הקודמת של MSW).
מסכי עריכת הטבלאות, שבגירסא הקודמת היו תיבות דו שיח, הפכו לטאבים בחלון הראשי, גם כן כמו SSMS. חבל שאין אפשרות להחזיר את המצב הקודם כשיש צורך כזה.
בכלל, החבר'ה של MySQL עושים בשנים האחרונות מאמצים רבים להפוך את הכלים שלהם יותר ידידותיים למשתמשים (לא רק מסך CLI שחור ומאיים), בדגש על משתמשי חלונות, לאחר שלפני כמה שנים הם גילו שלמרות התדמית של הקוד הפתוח,הרוב המוחלט של המשתמשים שלהם משתמשים בכלל בחלונות, אם לפיתוח ואם לסביבת ייצור.
היכולת להפיץ מידע לכמות גדולה של גולשים בזמן קצר הוכיחה את עצמה שוב השבוע כשלאורך אחר הצהריים והערב פורסמו בפורומים, באתר הקול היהודי (השופר של יצהר והסביבה), ובהמשך גם בערוץ 7 פרסומים על חשש להרס מאחזים בלילה שבין יום שני לשלישי.
סיוון רהב מאיר מערוץ 2 עשתה כתבה על פורום ארץ מולדת אצלנו בערוץ 7, ועל השימושיות של הכלים האלה כשדרוג ביכולת להפרעה לכוחות הגירוש בדרך להריסת עוד מאחז או לכל פעולה שלטונית אחרת.
מדי פעם ערוץ 7 מקבלים צווים לחשיפת כתובות IP של גולשים. עד היום, הצווים הללו העלו חרס בידם. במקרה אחד לפחות ה-IP היה שייך למוסד חינוכי עם עשרות ומאות מחשבים, ובשאר המקרים כנראה פשוט לא הייתה עילה פלילית (חוץ מטעם רע של כותב ההודעה, שבד"כ נמחקה דקות מספר אחר כך).
למען הסר ספק, אני לא מתומכיה של ההפגנה האלימה שהייתה בחטמ"ר אפרים (שם, על פי דיווחי הגולשים בפורומים, היה מי שהכין פלוגות מג"ב וטרקטור כדי להרוס מאחז) או הפגנות אלימות בכלל.
תוך כדי שיטוט ב-History של MySQLConnector לסביבת NET., נתקלתי בכלי הפשוט הבא בקוד פתוח עבור בדיקות ביצועים של רכיבי קוד.
נשמע מעניין.
http://code.google.com/p/slimtune/
ביום שלישי האחרון השתתפתי בערב מעניין (ישר כח למארגנים) שהיה במרכז המחקר והפיתוח של Microsoft בהרצליה.
אחת ההרצאות שם הייתה על כלי מעניין בשם HebMorph, שהוא תוסף ל-Lucene/Lucene.net עבור חיפושים מורפולוגיים בעברית.
לאחר ההרצאה שוחחתי קצרות עם איתמר, המרצה והמפתח, וסיפרתי לו שהכלי שלו נותן תוצאות מצויינות אבל הביצועים שלו בעייתיים.
איתמר חייך, אמר לא יכול להיות ואולי טעינו בכמה דברים ונתן כמה רעיונות. אחר כך כבר נכנסנו למצגת הבאה ולזו שאחריה (זו על ה-nodejs) שזה תחום שמסקרן אותי – ולא מהיום.
למחרת בבוקר התיישבתי במשרד והחלטתי לחקור את הנושא לעומקו.
בדיקה 1: שימוש בכלים המובנים של Lucene
השתמשתי במחשב לא מזהיר במיוחד. מכונה עם מעבד 4 ליבות, 4G זיכרון, דיסק קשיח SATA בסיסי.
המערכת מאפשרת לאנדקס בערך כ-1000 מסמכים בשניה (מאגר החדשות של ערוץ 7)
בדיקה 2: שימוש ב-HebMorph, שאר הקוד ללא שינוי.
100-150 מסמכים בשניה.
בדיקה 3: שימוש ב-SimpleAnalyzer, גם כן מהחבילה של איתמר.
950~ מסמכים בשניה
מעקב אחר מנהל המשימות מראה שהכלי הקטן שפיתחתי, הן על בסיס Lucene והן על בסיס HebMorph/SimpleAnalyzer סובל מ-2 בעיות ביצועים מרכזיות:
- ניצול של מעבד אחד בלבד (מתוך 4 ליבות)
- אי ניצול יעיל של זיכרון
עם בעיית הזיכרון התמודדתי ע"י פיצול למנות (LIMIT של MySQL) של התוכן שמגיע מבסיס הנתונים, ופקודות GC.Collect ששמתי פה ושם.
על הדרך, גיליתי שהאיטיות הזו גרמה גם ל-Paging שבתורו גרר עוד יותר איטיות. "חיתוך" כמויות הנתונים איתם עבדתי שיפרו את המצב פלאים.
בעיית ה-CPU הייתה מורכבת יותר. הבעיה היא ש-IndexWriter פשוט לא מאפשר עבודה במקביל על אותו אינדקס. אמנם זה עבד לי מצויין בעבר אבל זה לא נתמך ואי אפשר לדעת איזה צרות זה יעשה.
קצת חפירה ברשת וקצת השקעה בקוד, ופיתחתי בסוף את הפיתרון הבא:
Dim oMem1 As Indexer = New HebrewIndexer(100)
Dim oMem2 As Indexer = New HebrewIndexer(100)
Dim oMem3 As Indexer = New HebrewIndexer(100)
Dim count As Integer = a.Length / 3
' array indexer start, end
Dim t1 As New Tasks.Task(Sub() _IndexDocuments(a, 0, oMem1, 0, count - 1))
Dim t2 As New Tasks.Task(Sub() _IndexDocuments(a, 1, oMem2, count, count * 2 - 1))
Dim t3 As New Tasks.Task(Sub() _IndexDocuments(a, 2, oMem3, count * 2, a.Length - 1))
t1.Start() : t2.Start() : t3.Start()
Tasks.Task.WaitAll(New Tasks.Task() {t1, t2, t3})
Dim t4 As New Tasks.Task(Sub()
oMem1.Flush() : oMem2.Flush() : oMem3.Flush()
Indexer.AddIndex(oMem1.Directory)
Indexer.AddIndex(oMem2.Directory)
Indexer.AddIndex(oMem3.Directory)
oMem1.Directory.Dispose() : oMem2.Directory.Dispose() : oMem3.Directory.Dispose()
GC.Collect() ' אני לא חד-משמעי בקשר לצורך בפונקציה הזו
End Sub)
t4.Start()
(הוצאתי מפה הרבה שורות שלא קשורות לעניין, ומחלקות שבניתי שגם הן לא קשורות. וכן, אני יודע שיש שיטות חכמות יותר לכתוב את הקוד הזה)
הפונקציה AddIndex היא בעצם הפנייה לפונקציה AddIndexesNoOptimize' של IndexWriter
הרעיון שפיתחתי לאחר שעות ארוכות הוא לייצר שלושה אינדקסים זמניים, בזיכרון, להכניס לתוכם את התוכן בשלושה Threadים שונים, ואחר כך לשלב את האינדקסים המוכנים באינדקסים הראשיים.
מכיוון שגם גישה לבסיס נתונים לוקחת זמן, התהליך של מיזוג האינדקסים קורה ב-Task רביעי (t4), כשבינתיים האפליקציה ממשיכה לרוץ ולוקחת מבסיס הנתונים את המידע הנחוץ להכנסה הבאה.
יש עוד לא מעט עבודה שאפשר לעשות בשלב החיפוש (להבדיל משלב האינדוקס), אבל זה כבר לפעם אחרת.
בהצלחה!
הנה ב-Windows Server 2008 R2

ומסתבר שזה קיים גם ב-Windows 7.

גם זה קורה לפעמים.
מעשה (אמיתי) שהיה לפני מס' חודשים:
עוזי ברוך (מנהל מחלקת החדשות של ערוץ 7) מתקשר ומתלונן: העלתי מבזק, והוא לא פורסם בזמן. עוברים יומיים, ושוב אותה תלונה, ושוב ושוב ושוב מאנשי צוות שונים – חומרים עולים לאתר באיחור.
את המבזק הבא אני מבקש להעלות בעצמי. מעמדת הפיתוח. מקבל את הטקסט ב-Messenger, מעתיק, ומדביק מול עיניהם. עובד.
אבל החבר'ה בחדשות ממשיכים להתלונן. אני בינתיים נובר כמו משוגע בכל רכיבי המטמון במערכת ומוודא שהם נמחקים (flush) כשנצרך. שום דבר.
עוברים חודשיים בהם אני סובל מטלפונים והודעות מתלוננות, עד שמצאתי את הבעיה האמיתית:
באחד הערבים, עבדתי מהבית עם RDP על אחד המחשבים במשרד, ופתאום אני קולט שיש פער זמנים בין המחשב שלי למחשב המרוחק. חמש דקות נוספות של בדיקה העלו שפשוט השעון של ה-DC, ואיתו כל המחשבים במשרד - ממהר!
בהיעדר מנהל רשת, התחברתי לשרת המתאים, הגדרתי שם שרת NTP ובזה נגמר העניין. לו רק יכולתי לחסוך חודשיים של סבל.

בעבר כתבתי על הבעיה הלא מאוד לא נפוצה שנגרמת כאשר משום מה מתבצעת פעולת Flush לחלקים גדולים של ה-Cache.
מערכת שביום יום מתמודדת בהצלחה עם העומס ונותנת זמני תגובה מצויינים, מגמגמת ואף קורסת לדקות ארוכות בשעה שה-Cache עליו היא מתבססת או חלקים ממנו קרס.
לפני קצת פחות משנתיים כתבתי על פתרון פשוט שמטרתו הייתה למנוע הרצת אותה פעולה מאות אלפי פעמים עד שנכנס ל-Cache אחד העותקים לשימוש בפעמים הבאות.
הפיתרון עבד מאוד יפה כל עוד נמצאים באותו שרת, ובאותו Proccess של IIS. גם במקרים שלא, הפעולה צומצמה מאלפים של בקשות מקבילות לכמה עשרות, בתלות בהגדרות הרשת.
ובכל זאת רציתי לפתח פתרון אחר.
זה לא Lock מושלם ב-100%, ובכל זאת, עושה את העבודה ומאיץ משמעותית את זמני עליית האתר מחדש אחרי Recycle או אבדן של חלקים משמעותיים ב-Cache.
הקוד פשוט מאוד וההערות שבתוכו די מיותרות.
Public Shared Function GetFromCacheWithLock(Of T)(ByVal Name As String, ByVal Minutes As Integer, ByVal SecondsLock As Integer, ByVal Func As Func(Of T)) As T
Try
' אם מישהו אחר באמצע
While GetCache("MainFuncs.GetCache.Lock" & Name) = 1
' כל עוד הפעולה רצה, תחכה
Threading.Thread.Sleep(30)
End While
InsertCache("MainFuncs.GetCache.Lock" & Name, 1, New TimeSpan(0, 0, SecondsLock)) ' "נעל" את הפעולה
Return GetFromCache(Name, Minutes, Func)
Finally
RemoveCache("MainFuncs.GetCache.Lock" & Name) ' הסר נעילה
End Try
End Function
Public Shared Function GetFromCache(Of T)(ByVal Name As String, ByVal Minutes As Integer, ByVal Func As Func(Of T), Optional ByVal Priority As Web.Caching.CacheItemPriority = CacheItemPriority.Default) As T
Return GetFromCache(Of T)(Name, New System.TimeSpan(0, Minutes, 0), Func, Priority)
End Function
Public Shared Function GetFromCache(Of T)(ByVal Name As String, ByVal Span As TimeSpan, ByVal Func As Func(Of T), Optional ByVal Priority As Web.Caching.CacheItemPriority = CacheItemPriority.Default) As T
Dim s As T
Dim z As Object = MemCacheClient.Get(Name)
If z Is Nothing Then ' אם אין במטמון, להריץ את הפעולה
s = Func()
InsertCache(Name, s, Span)
Return s
Else
Return z
End If
End Function
בהצלחה !
סוד גלוי הוא שהדפדפנים למכשירים ניידים (וזה כולל את Safari/Chrome למכשירי iOS ו-Android), את דפדפני Opera למינהם ולמיטב ידיעתי – גם IE9 הנייד.
זו גם הסיבה לאכזבתו של אחד מכתבי ערוץ 7 שרכש לעצמו iPad כמיני נייד (חרף אזהרותיי, אגב – אני המלצתי על PC) וגילה לאכזבתו שבמכשיר המדליק עריכת כתבות עליו היא עניין לא נוח במיוחד וגם מוגבל.
הערב נחשפתי במקרה ליציאתו לשוק של הדפדפן החדש של Firefox לניידים, שמבוסס על Firefox 4. חיפוש קצר נוסף העלה כי הדפדפן לנייד אכן תומך ב-contentEditable, וממילא עורכי טקסט המבוססים עליו יעבדו.
חידוש מרענן.
הבלוג המקורי שבדק את זה:
http://ckon.wordpress.com/2011/03/29/firefox-4-mobile-wysiwyg-contenteditable-designmode/
More Posts
Next page »