ערכתי לאחרונה בתאריך 22.12.13 בשעה 18:49 בברכה, ליל קיץ
א. צימצום קריאות לשרת מהדף:
מספר הקריאות חשוב בהרבה מגודל הקריאות הפיזי על הכונן.
לדוגמא: אם בדף הראשי אתה טוען 150 קבצי jpg במשקל כולל של 1mb,
עדיף לעשות להם איחוד ולקרוא קובץ אחד גדול, אפילו אם הוא יהיה במשקל של 1.5mb.
(הדוגמא שהבאתי בכוונה היא בהקצנה, יכול להיות שבמקרה הספציפי הזה חצי מגה לא יובילו לשיפור משמעותי)ב. קבצי ג׳אווהסקריפט ארוכים:
השתמש בקומפרסרים כדי לדחוס את הג׳אווהסקריפט שלך לקובץ קטן יותר.
סעיף א׳ פועל גם על סעיף ב׳:
אם יש לך 10 קבצי ג׳אווהסקריפט שונים, השתמש ב grunt למשל כדי לאחד אותם לקובץ אחד.
ג. שים קבצי ג׳אווהסקריפט בתחתית העמוד ולא ב header.
זה יכול להיות טריקי כי מפתחים מסויימים סומכים על הידיעה שהקובץ js נטען לפני עליית העמוד,
אבל טעינה של js בסוף העמוד תוביל בסופו של דבר ליצירת העמוד ולאחר מכן לטעינה של ה js לתוכו -
מה שאולי טכנית לא משפיע על זמן טעינת העמוד אבל פיזית - העמוד עולה מהר יותר מכיוון שהתוכן מוצג ורק לאחר מכן ה js מופעל.
ד. css, בדיוק אותו הסיפור כמו js.
אפשר להשאיר אותו ב header, אבל דחוס אותו בעזרת less compressor או כל כלי אחר לקובץ אחד קטן, במקום המון קבצי css שונים ו uncompressed.
ה. קבצים סטטים
פיצול של שרתי ההגשה יכול מאוד להועיל בזמני טעינת העמוד.
לדוגמא באתר שלך: אם התמונות היו מאוחסנות על cdn נפרד העמוד היה נטען מהר יותר,
משום שמספר הבקשות לאותו שרת ספציפי היו קטנות יותר.
אם אתה משתמש בספריות חיצוניות (jquery, ANGULAR) - השתמש ב cdn של גוגל על מנת להגיש את הספריות הסטטיות,
אין טעם שתגיש אותם מהשרת שלך.
צד שרת:
א. השתמש ב gzip כדי לדחוס את הקבצים שנשלחים אל הקליינט.
ב. caching files. אם יש מידע שחוזר על עצמו אין טעם לקרוא לו מחדש בכל פעם.
headers על הקבצים או הגדרה נכונה של האפצ׳י/nginx יובילו ל caching אצל הלקוחות ויחסכו זמן טעינה יקר ערך.
ג. mysql queries
אם הדטאבייס שלך לא יעיל השאילתות יכולות להיות ארוכות מאוד ועד שלא יסתיימו, אין אפילו התחלת טעינה של העמוד.
כפי שנאמר, ניתן לחסוך שאילתות כבדות עם memcached או כל כלי אחר (אפילו nosql) כדי לטעון שאילתות שחוזרות על עצמן לזיכרון של השרת ולחסוך בזמני הרצה.
אם אין לך אפשרות להתקין מודול קאשינג על השרת, תמיד גם אפשר להשתמש בקבצי cache סטטים עלההארדיסק.
נכון, זה קצת טוחן את הדיסק הקשיח אבל זה מאוד משתלם, מנסיון של עבודה על פלטפורמות של עשרות מיליוני יוזרים.
indexes - אם אין לך אפשרות לבצע קאש על השאילתות, בדוק את השאילתות המורכבות וראה כיצד ניתן לייעל אותן, אינדוקס נכון של הטבלאות יכול להעלות את זמן התגובה פלאים, גם אם זה גוזל המון מהזיכרון הפיזי - אז מה?
ד. הגדרות של השרת
אני מזמן נטשתי את apache ועברתי ל nginx.
על ה nginx אני משתמש במודול של php-fpm. זה בעצם fastcgi אלטרנטיבי. הוא מאפשר ניהול נכון יותר של הפרוססים php שרצים על השרת מה שמגדיל את זמני התגובה בצורה מאוד משמעותית.
מעבר לכך, יש לו המון יתרונות נוספים כמו אפשרות לניהול עצמי של הפרוססים על השרת,
מה שמאוד משפיע על הסקלביליות של האתר שלי בכל מה שנוגע לעבודות צד-שרת נטו.
ה. אם אתה על mysql, תנטוש את myisam.
היתרונות שיש ל myisam מאוד קטנות ביחס לתועלת שמביא innodb.
אז נכון.. הבנצ׳מארקים מראים ש myisam מהיר יותר בשליפה, אבל אל תשכח ש innodb פשוט מבטל
לחלוטין את התור שנוצר בבקשות לשאילתות בעיקבות נעילות טבלה של mysql,
לכן בטווח הארוך הכמה - מילישניות שתחסוך לא שוות את המאמץ.
ו. חיבורים פנימיים
במידה והדטאבייס שלך, או כל שירות אחר, נמצאים על שרת ששונה משרת ה web שלך, וודא כי הם באותה הרשת ובצע חיבור אליהם בעזרת ip פנימי בלבד.
חיבור דרך ip חיצוני גלוי יוביל לגישה לשרת המידע דרך הרשת העולמית, מה שיאט בצורה משמעותית את זמני טעינת הנתונים לתוך שרת ה web.
דרך הפיירוול אפשר לבצע מעקף כך שבלי נגיעה בקוד ה ip החיצוני ייקרא ככתובת פנימית,
במידה ואתה לא רוצה לבצע שינויים בקוד שלך.
----
סקלאביליות:
חשוב לזכור שלכל שרת יש limit אליו הוא יכול להגיע, בין אם זה שרת דטא או שרת web,
זה תלוי מן הסתם בכח הפיזי של השרת והן בהגדרות אופטימיזציה נכונות.
קשה לי להאמין שזה המקרה, אבל גם בשרתים מאוד מאוד כבדים (מספר מעבדים גבוה מאוד וזיכרון די מטורף)
הצלחתי להגיע למצבים בהם השרת כבר לא יכול לעמוד בכמות הפניות.
מה עושים?
load balancer, מחלקים את הכח בין 2 שרתי עיבוד שיעשו בשבילך את העבודה.
mysql - ניתן לבצע replica של הדטאבייס המקורי כך ששליפות המידע יתבצעו משני שרתים במקביל.
----
אתה יכול להיכנס לאתר שלי וללמוד מחקירה על הדברים שביצעתי כחלק מכל הסעיפים שרשמתי כאן:
http://memofish.com
עדיין לא סיימתי את עבודות האופטימיזציה, שכן רק על העמוד הראשי יש בממוצע 150 שאילתות שונות שרצות מה שמעט את אופן העלאת המוצרים.
השלב הבא הוא להעביר את השאילתות הנפוצות ל memcached שכבר התקנתי על השרת,
מה שלהערכתי יוביל לטעינה של העמוד במלואו בכשנייה אחת (עכשיו בערך 3 שניות על יוזר שנטען cache קליינד סייד אצלו).
השרתים הפיזיים שלי מאוד מאוד חלשים, בעזרת הגדרות נכונות אפשר להגיע לזמני טעינה יפים מאוד גם על כאלה.
השתמש ב profiling בכרום וב yslow של יאהו כדי ללמוד טוב יותר על מה אפשר לעשות.
תתפלא כמה שניות יקרות ערך אפשר לחסוך על שינויים שטותיים.
גל
