להימנע מ-304 Get request – איך להפחית עומס מהשרת

תשובה 304 לבקשת GET REQUEST, משמעותה שהאלמנט (CSS/JS וכו') לא השתנה ואין טעם להורידו שוב, אסביר איך זה עובד:

כאשר גולש נכנס לאתר אינטרנט, הדפדפן מוריד את כל האלמנטים המרכיבים אותו  ושומר אותם במחשב גם אם לא מופיע Cache-Control ב-Header. כאשר הגולש יכנס לאתר בפעם השנייה (או ימשיך לאחד העמודים בתוך האתר), הדפדפן יוריד ויטען את העמוד כאשר אלמנטים שהורדו בפעם הקודמת והכילו Cache-Control ב-Header ייטענו ישירות מהמחשב. אלמנטים שהורדו ללא Cache-Control (או שפג תוקפו של max-age) יידרשו מהדפדפן לפנות לשרת ולאמת (ע"י השוואת תאריך Last-Modified מול השרת) שהקובץ לא השתנה, במידה ולא, השרת יחזיר תשובה: (304 Not Modified).

כדי להציג מה ההשפעה של חוסר בהגדרת Cache-Control, הרצתי בדיקה ב-Webpagetest, על הפורום iatraf.co.il, בחרתי בכוונה בפורום מאחר ומס' הצפיות הממוצע של פורום עומד על 5 עמודים לגולש והגולשים חוזרים מספר פעמים ביום לאתר, לכן ול-Cache-Control יש השפעה חשובה על איכות הגלישה באתר. (למעלה מ-1.5 שניה פחות לעמוד)

לדף הבית יש 56 בקשות 304, מתוכם לפחות 30 בקשות גם בעמודי ההודעות בפורום (קבצי CSS, JS, PNG). את ההשפעה ב-Frontend אנחנו כבר יודעים, אבל מה ההשפעה ב-Backend? (אנו רואים שבאתר זה ה-TTFB לדף הבית עומד על 1.65)

כאשר הדפדפן מבקש מהשרת אלמנט שכבר קיים במחשב ללא Cache-Control הנה התהליכים שמתבצעים:

  • הדפדפן שולח GET REQUEST לשרת.
  • ברוב המקרים ה-GET REQUEST תכלול גם עוגייה, בזבוז מיותר של רוחב פס (בעלי אתרים בעלי עוגיות, תעבירו את כל התוכן הסטטי לסאב-דומיין).
  • השרת (Apache), מקצה מקום לדפדפן ומעבד את הבקשה.
  • בשלב הזה הוא פותח את קובץ ה-htaccess, מעבד את החוקים הכתובים בו, ומחפש את הקובץ. (בשלב הזה Apache מריץ לפחות 10 הוראות stat כדי לקבל את htaccess ואת מצב הקובץ).
  • Apache מחזיר 304 לדפדפן וממשיך לקובץ הבא (KeepAlive on) או סוגר את התקשורת (KeepAlive off).
הזמן הממוצע שכל התהליך הזה לוקח הוא בין 0.1-0.2 שניה בשרת שאינו עמוס, כל התהליך הזה מיותר לגמרי משום ש: 
  • הוא מאט את טעינת האתר. 
  • הוא מנפח את רוחב הפס – 0.2Kb בממוצע לכל בקשה.
  • הוא תופס מקום בשרת הווב (MaxClients). 
  • הוא מגדיל את העומס על ה-Hardisk. 

ערכתי בדיקה דומה על דף הבית בחמשת הפורמים הראשונים בגוגל (במילת החיפוש: "פורום"):

כל האתרים חוטאים בניהול שגוי של Cache-Control, ויכולים להאיץ את מהירות הגלישה של הגולשים תוך כדי חסכון בהוצאות התקשורת והשרתים.

עד הפעם הבאה, אבי.

לעוד חומרים בנושא האצת אתרים

פורסם בקטגוריה האצת אתרים, עם התגים , . אפשר להגיע לכאן עם קישור ישיר.

7 תגובות על להימנע מ-304 Get request – איך להפחית עומס מהשרת

  1. מאת גיא‏:

    בכל מצב אתה תקבל בקשות 304 אחי, אין מה לעשות, וגם באתר שלך שיש בקשות כאלה.
    זו בקשה שהיא יחסית זניחה, וברגע שאתה משתמש ב-SPRITE זה לא כזה נוראי.

    • מאת Avi Keinan‏:

      היי גיא,

      "בכל מצב" זה ממש לא נכון, זו בקשה מיותרת, כי אם מדובר בקובץ JS, הרי שרינדור העמוד מתעכב לחינם.
      בעת הקמת האתר צריך לבצע "סקר" ולקנפג את האתר בהתאם.

      אני מאמין שאפשר לשפר את הביצועים של wallaeshe (הסנדלר הולך יחף), אבל מאחר ומדובר בפרויקט פנאי ולא בפרויקט כלכלי כרגע זה לא בסדר העדיפויות.

      אבי

      • מאת גיא‏:

        אני מתקן את עצמי, אתה תקבל 304 בחלק מהמקרים גם שיהיו לך הגדרות קאש נכונות, בחלק מהמצבים הדפדפן כן לוקח 304 ובחלק הוא יודע לקבל את הקובץ מהמחשב בלי להוריד אותו שוב, ואכן בקשה 304 לא עדיפה ורצוי לקבל קאש מהמחשב, טעות שלי 🙂

        ד"א אם תעשה את הבדיקה שוב תראה שהדברים באחד האתרים עם מספר הבקשות הנמוך השתנה עוד יותר לטובה 🙂

        • מאת Avi Keinan‏:

          אתה תקבל 304 כאשר ה-max-age פג תוקף והדפדפן מוודא שהקובץ לא השתנה,
          בכל מקרה אחר, אין שום טעם שתקבל 304, אלא אם יש לך באג בדפדפן (אני אשמח לראות דוגמא ל-304 לא רצוי).

          לגבי הבדיקה – אני אשמח אם תספר לנו באיזה אתר מדובר.

          • מאת גיא‏:

            לגבי 304, תגלוש בכרום ברגע שתעשה רענן(F5) אתה תקבל 304, ברגע שתעבור עמוד תקבל מהקאש.

            לגבי האתר: fxp.

  2. מאת Avi Keinan‏:

    בדקתי וזה נכון. חידשת לי.

    סחטיין על השיפור ב-FXP, אגב, אם תשנה את המיקום של jquery לשרת של FXP, או תשתמש ב-CDN של גוגל ללא https, תחסוך זמן יקר בטעינת האתר.

  3. מאת גיא‏:

    באמת עדיף, לא צריך HTTPS 🙂
    תודה.

להגיב על גיא לבטל

האימייל לא יוצג באתר. שדות החובה מסומנים *