רגע האמת... האם C++‎ באמת נתן יתרון בתחום Web?

ב־יום שבת, 7 ביוני 2008, מאת ארתיום; פורסם תחת: תכנה חופשית, אינטרנט, פיתוח, תכנה ומחשבים, WordPress בעברית, CppCMS; ‏5 תגובות

אחרי כמעט חצי שנה של פיתוח תשתית C++‎ לפיתוח מערכות התוכן, אני מתקדם לגרסת בטא הראשונה. למעשה כל הרכיבים שתכננתי עבורה מוכנים והדבר היחיד שעוצר אותי בפני הכרזה על גרסת הבטא הראשונה זה חוסר תיעוד שעדיין אני צריך להכין.

המטרה של הפרויקט הייתה ליצור תשתית לפיתוח יעיל ומהיר ל־Web ב־C++‎ -- שפה שלא נפוצה בתחום זה, על מנת לקבל ביצועים יוצאים מן הכלל. בדרך גם למדתי הרבה על תשתיות דומות אחרות ועכשיו הכנתי השוואה ביצועים בין שתי מערכות:

  1. מערכת בלוגים פופולרית WordPress בעברית
  2. הבלוג שכתוב על בסיס CppCMS -- למעשה הבלוג הזה.

WordPress נבחרה בגלל ההכרות המצוינת שלי אתה ויכול להוציא ממנה את מירב הביצועים האפשריים שניתן לקבל בעזרת שפות תכנות דינמיות טיפוסיות כמו PHP.

המערכות הוגדרו ככה:

  1. שרת אינטרנט lighttpd 1.4.13
  2. ממשק שרת FastCGI
  3. ‏PHP גרסה 5.2.
  4. ‏Opcode Cache של PHP נעשה ע"י XCache 1.2.1
  5. בסיס הנתונים MySQL 5.0.‏
  6. תוסף caching עבור WordPress:‏ WP-Cache-2 עם הטלאי שלי שמשפר את הביצועים שלו בעוד כ־60%.
  7. מערכת CppCMS עם ניהול ה־cache בזיכרון.
  8. חומרה: AMD Athlon XP 3000+ 64bit, 1G RAM
  9. מערכת הפעלה: Debian Etch 64 bit.

הכנתי את שני הבלוגים בצורה הבאה:

  1. בכל בלוג יש 1000 מאמרים אופיינים.
  2. לכל מאמר פורסמו 10 תגובות.
  3. כל המאמרים מסודרים ב־10 קטגוריות שונות.

המדידות בוצעו בצורה הבאה:

  1. כל מדידה כללה שלושה שלבים
    • ניקוי ה־cache
    • חימום של ה־cache ע"י משיכה של 100 דפים אופייניים (65 דפי כתבות ו־35 עמודים: ראשי ונושאים).
    • הזרמה של 1000 שאילתות ב־5 חיבורים מקבילים בעזרת http_load עם טלאי שמוסיף כותרת Accept-Encoding: gzip,deflate כדי לגרום משיכה של דפים דחוסים.
  2. בכל פעם הזרמת הפקודות הכילה אחוז הקבוע מראש של דפים חדשים שלא היו ב־cache ושאר הדפים נלקחו מ־100 הדפים שכבר נכנסו ל־cache בשלב החימום. בצורה כזו אפשר היה להבטיח אחוז מדויק של cache hit/miss ratio.‏
  3. כל מדידה בוצעה מספר פעמים והמהירות הגבוהה ביותר נבחרה.

התוצאות:

ללא cache מערכת WP מסוגלת לספק כ־7.6 עמודים בשניה לעומת כ־310 עמודים בשניה ש־CppCMS מייצרת (הבדל של פי 40). כאשר מפעילים מנגנוני ה־cache, זמן ה"חימום שלו" -- שמירה של 100 דפים בזכרון לוקחת כ־13 שניות במקרה של WP וכ־0.28 שניה במקרה של CppCMS.

במקרה אידיאלי של 100% פגיעה ב־cache, ההבדל הוא לא גבוהה במיוחד 2300/711=3.2. אבל, ברגע שרק־99% מהדפים נמצאים בזכרון מטמון היחס הזה קופץ 5.8 ומגיע להבדל של סדר גודל כבר החל מ־3% של פיספוס ה־cache (‏1940 לעומת 176).

עם עליית מס' הפגיעות ל־10% פיספוסי ה־cache ההבדל מגיע ליותר מפ־20. 1450 דפים בשניה לעומת 64 דפים ש־WordPress מייצרת.

תוצאות

מספרים אופייניים:

אחוז הפספוס WordPress CppCMS
07112300
13702160
31761940
51181790
10641450
15411210
20331075
3020795
4013570
5013570

מסקנות:

מערכת ה־cache משפרת את הביצועים של מערכות מבוססות על שפות דינמיות בצורה משמעותית אבל ברגע ש־cache hit ratio מתחיל לרדת באחוזים בודדים, יעילות של ה־cache יורדת בצורה מאוד מהירה ומפילה את המערכת למצב "רגיל".

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

הערה נוספת

מערכת ה־cache של WordPress הרבה יותר פשוטה בהשוואה לזו של CppCMS. בהרבה מקרים, הדפים לא מתרעננים גם כאשר חלקים מסויימים של תוכן השתנו, למשל, שמות של קטגוריות, קישורים ועוד. המערכת הזו מבוססת בעיקר על "timeout".

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

מבחינה זו, ההשוואה אינה מספיק הוגנת.

תגובות

אורן, ב־07/06/08 21:31

אני חושב שהשוואה גם לא הוגנת כי בטח בוורדפרס יש הרבה פיצ'רים שלא מימשת.. אני טועה?

elcuco, ב־07/06/08 23:11

אתה יכול לחזור על הבדיקה, אבל כאשר אתה משתמש ב־reverse proxy? כי הרי מי שישתמש במערכת שלך, מן הסתם ינתב את התעבורה שלו ככה ולא יחשוף את השרת שכתבת ישירות לאיטרנט.

ארתיום, ב־08/06/08 01:02

אני חושב שהשוואה גם לא הוגנת כי בטח בוורדפרס יש הרבה פיצ'רים שלא מימשת.. אני טועה?

די, עבדתי די קשה על מערכת הבלוגים הזו על מנת להביא אותה למצב טוב.

אולי יש פיצ'רים מסוימים של ניהול או ממשק משתמש שלא מומשו אבל זה לא משנה כשמדובר ביצירת עמודים.

נכון שהמערכות אינן זהות, אבל הן מספיק דומות ומלאות על מנת שהשוואה תהיה מספיק הוגנת.

אתה יכול לחזור על הבדיקה, אבל כאשר אתה משתמש ב־reverse proxy? כי הרי מי שישתמש במערכת שלך, מן הסתם ינתב את התעבורה שלו ככה ולא יחשוף את השרת שכתבת ישירות לאיטרנט.

אתה יכול להבהיר לי מה זה יתן ואת מה ישנה?

הערה קטנה נוספת, יש עדיין עבודה שאני צריך לעשות על מנת לבנות מערכות מבוזרות.

שרת ה־cache בסגנון של memcached עדיין בשלבי כתיבה. כך שכרגע ניתן להשתמש רק ב־cache המשותף לכל ה־threads של אותו תהליך.

Drazick, ב־27/10/08 09:53

נראה מרשים ביותר!

הבלוג של ארתיום, ב־16/10/10 18:04

CppCMS מול Java/JSP,‏ C#/Asp.Net‎‏, PHP

פרסמתי השוואת ביצועים עדכנית בין CppCMS ושלוש טכנולוגיות web מובילות: PHP,‏ Asp.Net/Mono ו־Java/JSP.

התוצאות וההסברים פורסמו כאן: http://art-blog.no-ip.info/cppcms/blog/post/67

הוסף תגובה:

 
 כתובת דוא"ל לא תוצג
 

ניתן לכתוב תגובות עם שימוש בתחביר Markdown.

חובה לאפשר JavaScript כדי להגיב.

דפים

נושאים