הבלוג של ארתיום :: פיתוח http://artyom.cppcms.com/ בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא! מעשה בשני NaNים http://artyom.cppcms.com/post/336 http://artyom.cppcms.com/post/336 <div style="direction:rtl"> <p>לאחרונה ניסיתי להריץ אימון של GAN על pytorch עם תמיכה ב־dlprimitives. אחד דברים הלא נעימים באימון של GANים באופן כללי זה שהם לא ממש יציבים ומתבדרים בקלות.</p> <p>שמתי לב שבגרסת cuda הוא רץ ללא דופי ובגרסה שלי הוא נתקע. נתקע על ביצוע backpropogation ב־convolution. אחד ההבדלים העיקריים באגלוריתם בהשוואה לשאר היה שימוש בפעולות אטומיות לחישוב סכום (טריק מאוד נפוץ במימוש קונבולוציה)</p> <p>אחרי זמן מה הגעתי למסקנה שהחישובים מגיעים ל־NaN באיזהו מקום ואז הכל נתקע. לא הבנתי למה פעולת חיבור אטומית פשוטה נתקעת. בכל מקרה איתרתי באג האחר שהביא לחישוב ה־NaN והכל הסתדר. אבל בכל זאת נושא התקיעה הטריד אותי.</p> <p>כתבתי שאלה ב־Stackoverflow העתקתי קטע קוד... ואז נפל האסימון</p> <pre><code>float oldv = *ptr; for(;;) { float newv = oldv + v; float prev = as_float(atomic_cmpxchg((__global volatile int *)(ptr),as_int(oldv),as_int(newv))); if(prev == oldv) return; oldv = prev; } </code></pre> <p>קחו לכם כמה דקות.</p> <p>פעולת comxchg ב־OpenCL עובדת רק על int. לכן הייתי צריך לעשות bit-casting ל־int ובחזרה (<code>as_float</code> ו־<code>as_int</code> בדיוק עושים את זה). ואז תנאי הבדיקה <code>prev==old</code> ביצעתי ב־float במקום בשלמים.</p> <p>כך שאם הערכים שווים אז ההחלפה הצליחה. אבל מה שכחתי? NaN == NaN תמיד נותן false! ולכן תקעתי בלולאה אינסופית כי התנאי לעולם לא ייתקיים. החלפתי לבדיקה בערכים שלמים (קרי ייצוג בינארי) והכל עבד חלק.</p> <p>מסקנה NaN הוא טריקי... יש לכבדו</p> </div> התחלתי להתקדם לאימון בקוד פתוח: pytorch עם תמיכה ב־OpenCL http://artyom.cppcms.com/post/333 http://artyom.cppcms.com/post/333 <div style="direction:rtl"> <p>תקציר: הצלחתי לבצע inference של AlexNet ב־pytorch ב־OpenCL. הביצועים זהים לפעלה ישירה של dlprimitives.</p> <p>הדרך עוד ארוכה אבל פחות קצת יותר ברורה מה לעשות. המאמר המלא באנגלית בבלוג הפיתוח:</p> <p><a href="http://blog.dlprimitives.org/post/5">http://blog.dlprimitives.org/post/5</a></p> </div> השוואה בין תפוחים ירוקים ואדומים http://artyom.cppcms.com/post/331 http://artyom.cppcms.com/post/331 <div style="direction:rtl"> <p>כשמודבר ב־Deep Learning זה מאוד קשה להשוות בין GPU של החברות המובילות AMD ו־NVidia. בניגוד למשחקי מחשב שנותנים לך מדדים ברורים על עלות מול תועלת, תחום DL נשלט באופן בלעדי ע"י NVidia. גם אם קיימים פתרונות של AMD הם לא תמיד עובדים. למשל כרטיסי RDNA/RDNA2 עדיין לא נתמכים ע"י AMD לטובת Deep Learning - והם בעצם הכרטיסים הזמינים היחידים היום בשוק.</p> <p>ובכן כחלק מפרויקט <a href="https://github.com/artyom-beilis/dlprimitives">DLPrimitives</a> עשיתי השוואה כזו:</p> <p><a href="http://blog.dlprimitives.org/post/1">http://blog.dlprimitives.org/post/1</a></p> <p>וכן גם השקתי בלוג חדש לטובת עדכונים על הפרויקט.</p> </div> רשתות נוירונים בקוד פתוח... להפשיל שרוולים http://artyom.cppcms.com/post/330 http://artyom.cppcms.com/post/330 <div style="direction:rtl"> <p>כתבתי בעבר על המצב העגום של <a href="http://artyom.cppcms.com/post/328">תחום ה־deep learning בקוד פתוח</a> - שלמעשה לא קיים. אחרי ש־Google בפועל <a href="https://github.com/plaidml/plaidml/issues/586">הרגו</a> את ה־plaidml עם keras והפיתוח של Caffe הופסק אז נוצר המצב בו אין כל דרך לאמן רשתות בעזרת פלטפורמה פתוחה - OpenCL.</p> <p>יש סיבות טובות לעבוד עם OpenCL מעבר לשמירה על הקוד הפתוח. למשל לפתח תוכנה שתעבוד על כל כרטיס גרפי סביר ובכל מערכת הפעלה - בלי להסתבך.</p> <p>אז הרמתי את הכפפה: <a href="https://github.com/artyom-beilis/dlprimitives">https://github.com/artyom-beilis/dlprimitives</a></p> <p>זהו פרויקט חדש בשם DLPrimitives שאמור לתת מענה לסוגיה. הוא אמור לספק ספריה בסגנון cudnn/miopen שמממשת את הפעולות הבסיסיות של Deep-Learning וגם לספק כלים ל־inference. בנוסף, הרעיון הוא להתחבר כ־backend לאחד ה־deep learning frameworks העדכניים כמו pytorch, tensorflow או mxnet.</p> <p>התהליך הוא איטי וקשה. אומנם המתמטיקה היא לא מסובכת וכתיבה ל־GPU היא בסה"כ לא עניין מסובך. אבל אם רוצים להגיע לביצועים טובים הסיפור הוא מעט שונה. עם זה, התוצאות כבר כאן.</p> <p>לחסרי סבלנות - הצלחתי להגיע ל־150%-200% של ביצועי caffe-opencl ו־plaidml על פלטפורמת amd ו־nvidia ולהגיע לכ־50% עד 70% של ביצועי המימושים הספציפיים שלהם על בסיס cudnn/miopen.</p> <p>כל התוצאות:</p> <p><a href="https://github.com/artyom-beilis/dlprimitives/blob/master/docs/summary.md">https://github.com/artyom-beilis/dlprimitives/blob/master/docs/summary.md</a></p> <p>סיכום לעצלנים - ממוצע על 5 רשתות נפוצות alexnet, resnet18, resnet50, vgg, mobilenet:</p> <table dir="ltr"> <thead> <tr> <th>GPU</th> <th>Batch</th> <th>Train, Cuda/HIP</th> <th>Test, Cuda/HIP</th> <th>Train, Plaidml/Caffe</th> <th>Test, Plaidml/Caffe</th> </tr> </thead> <tbody> <tr> <td>gtx960</td> <td>16</td> <td>51%</td> <td>60.73%</td> <td>171%</td> <td>167.33%</td> </tr> <tr> <td>gtx960</td> <td>8</td> <td>59%</td> <td>72.03%</td> <td>187%</td> <td>155.25%</td> </tr> <tr> <td>gtx1080</td> <td>16</td> <td>42%</td> <td>41.34%</td> <td>207%</td> <td>137.52%</td> </tr> <tr> <td>rtx2060s</td> <td>16</td> <td>49%</td> <td>57.53%</td> <td>211%</td> <td>149.48%</td> </tr> <tr> <td>rx560</td> <td>16</td> <td>53%</td> <td>56.82%</td> <td>153%</td> <td>115.63%</td> </tr> <tr> <td>rx560</td> <td>8</td> <td>55%</td> <td>54.19%</td> <td>172%</td> <td>122.64%</td> </tr> <tr> <td>intel-hd530</td> <td>8</td> <td></td> <td></td> <td>109%</td> <td>66.12%</td> </tr> </tbody> </table> <p>אומנם זו התחלה אבל כבר התחלה טובה!</p> </div> מקוביות לכוכבים http://artyom.cppcms.com/post/329 http://artyom.cppcms.com/post/329 <div style="direction:rtl"> <p>לאחרונה רכשתי <a href="https://www.celestron.com/products/astromaster-102az-telescope">טלסקופ פשוט וחזק</a> וצללתי לתחום שעניין אותי עוד מילדות - אסטרונומיה. בתור מתחיל אחת הבעיות הקשות ביותר זה למצוא את גרמי השמיים שאתה מעוניין לצפות בהם. מובן שיש לא מעט אפליקציות "פלניטריום" חופשיות וסוגרות כמו Google SkyMap שמקלות על החיפושים. בסופו של דבר זה לא מסובך למצוא בשמיים משהו בהיר כמו ירח, כוכב לכת או קלאסטר פליאדות - כי גם בתוך העיר רואים את הדברים הבהירים ביותר.</p> <p>הבעיה זה למצוא את הדברים שעמומים יותר - שבשבילם קונים טלסקופ בקוטר גדול - שיאסוף הרבה אור. אז איך מוצאים מה שלא רואים בעיניים? יש מספר שיטות:</p> <ol> <li>לקנות טלסקופ עם חצובה רובוטית שתדע לכוון אותך לכל גרם שמיים שתרצה תמורת סוכם לא סימלי. בשביל חובב אסטרונומיה מתחיל מדובר בסוכם כסף לא מבוטל.</li> <li>זה להשתמש בשיטת <a href="https://en.wikipedia.org/wiki/Star_hopping">star hopping</a>.</li> </ol> <h2>אז במה מדבור?</h2> <p>הרעיון זה למצוא נקודות ייחוס - כוכבים שקל לזהות ולזוז מהם בכיוון הרצוי. לדוגמה:</p> <p><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Canis_Major_IAU.svg/500px-Canis_Major_IAU.svg.png" alt="כלב גדול" /></p> <p>אם רוצים למצוא קלאסטר M41 (שמסומן בעיגול צהוב) אז אפשר למצוא את סיריוס ואת אדרה ולכיוון את הטלסקופ למיקום של 1/3 ו־2/3 ביניהם. כמובן שזה דורש: (א) שבסביבת האוביקט שאתה מחפש יהיו כוכבים בהירים וקלים לזיהוי. (ב) שנקודות ייחסו יהיו קלות להערכה בעין. שיטה זו דורשת גם הרבה מיומנות וגם שמיים חשוכים יחסית כדי להקל על הניווט מה שלא תמיד מתאפשר בתנאי העיר.</p> <p>ומה לגבי אפליקציות כמו SkyMap הרי הן יודעות לכוון אותך למקום הרצוי? הבעיה שלסנסורים של טלפון יש שגיאה המגיע עד כ־<a href="https://link.springer.com/article/10.3758/s13428-020-01404-5">5 מעלות בערך</a> בעוד ששדה הראיה של טלסקופ טיפוסי למתחילים נע בין 1.0 ל־2.5 מעלות. אבל זו רק חצי בעיה. השגיאה של המצפן יכולה להגיע עד עשרות מעלות. מה שהופך כל תוכנות הפלנטריום לא רלונטיות לכיוון מדויק של הטלסקופ אלא רק להערכה כללית של כיוון הצפייה.</p> <h2>אז עלה בראשי רעיון</h2> <p>אומנם הסנסורים לא מדויקים אבל לטלפון יש גם סנסור gyro. אפשר לקרוא אותם בעזרת <a href="https://www.w3.org/TR/orientation-event/">Device Orientation Event</a> ואז אם במקום למדוד את הכיוון האובסולטי למדוד את השינוי נוכל להגיע לדיוק יותר גבוה! גם בציר גובה בגם בציר הכיוון (מצפן)</p> <p>כיוון שאני מעולם לא פיתחתי אפליקציות אז בחרתי לעבור עם WebApi ולממש הכל ב־JavaScript. בצורה זו אוכל בקלות לבנות אפליקציה גם ל־Android וגם ל־iPhone (כי הרבה חובבי אסטרונומיה אוהבים iPhoneים). בסה"כ מדובר בקצת גיאומטריה חישובית וגם בבסיס הנתונים.</p> <p>כיוון שהתכוונתי לבנות אפליקצית קוד פתוח אז יכולתי לדוג קוד פחות או יותר מכל מקום כולל מכוסה ב־GPL. ומצאתי</p> <ul> <li>את הכוכבים ובעיקר קבוצות כוכבים מצאתי פה: <a href="https://github.com/eleanorlutz/western_constellations_atlas_of_space">https://github.com/eleanorlutz/western_constellations_atlas_of_space</a></li> <li>את אוסף ה־Deep Space Objects מצאתי כאן: <a href="https://github.com/mattiaverga/OpenNGC">https://github.com/mattiaverga/OpenNGC</a></li> <li>את הפנקציות לחישוב מיקום כוכבי הלכת מצאתי כאן: <a href="https://github.com/TheSiebi/SpacePointer">https://github.com/TheSiebi/SpacePointer</a></li> </ul> <p>כל מה שנשאר לי זה להמיר את ה־csvים ל־JSON להמיר כמה פונקציות חישוביות מ־python ל־javascript ולהסתבך בהרבה טרנספורמציות לינאריות. וכמון לכתוב גם UI נחמד.</p> <p>אז הנה התוצאה: <a href="https://artyom-beilis.github.io/skyhopper.html">https://artyom-beilis.github.io/skyhopper.html</a> לטלפון חכם בלבד.</p> <p>וכמבו הנה הקוד: <a href="https://github.com/artyom-beilis/skyhopper">https://github.com/artyom-beilis/skyhopper</a></p> <h2>אז איך זה עובד?</h2> <ul> <li>אתה מחבר את הטלפון לטלסקופ</li> <li>מכוון אותו לכוכב שקל לזהות</li> <li>מבצע איפוס ע"י לחיצה על כוכב שכיוונת אליו במפת הכוכבים על המסך</li> <li>בוחר את המטרה בה אתה מעוניין לצפות</li> <li>מזיז אל הטלסקופ בהתאם להוראות והאפליקציה מודדת את התזוזה ונותנת משוב - מודדת את שינוי הזווית בגובה וברוחב הנדרש ומכוונת אותך ליעד!</li> </ul> <p>בדקתי את האפליקציה כבר מספר לילות ובד"כ מגיע בדיוק למטרה! לפעמים הג'ירו מאבד כיוון אבל בכל מקרה מומלץ לבצע איפוס לפני כל תזוזה לאובייקט חדש.</p> <p>כך הצלחתי למצוא מספר לא מבוטל של גרמי שמיים בתנאי עיר שבכלל לא חלמתי למצוא אותם לפני!</p> <h2>מסקנות מתחום כתיבת הקוד</h2> <p>זו נראה לי הפעם הראשונה שהשתמשתי במספר רב של מקורות שאפילו מופיעים תחת רישיון GPL. מה שׁזירז את הפיתוח בצורה דרמטית. קיבלתי מהר משוב מאנשים בתחום אסטרונומיה שעזרו לי לשפר את הממשק עם הצעות מאוד נכונות. כל זה אפשר לי להגיע לתוצאה די מוגמרת תוך מספר ערבים</p> </div> רשתות נוירונים בקוד פתוח... תמונת מצב http://artyom.cppcms.com/post/328 http://artyom.cppcms.com/post/328 <div style="direction:rtl"> <p>כידוע היום שוק ה־deep learning נשלט באופן <a href="http://artyom.cppcms.com/post/324">כמעט בלעדי</a> ע"י nVidia. אומנם כל תשתיות למידה החישובית הפופולריות כגן TensorFlow, PyTorch, Caffe, MXNet ואחרות משוחררות כקוד פתוח, אבל בליבו של כל אחד מהם, ללא יוצא מן הכלל, רצות ספריות cublas ו־cudnn המאפשרות לנצל את החומרה בצורה מיטבית. כולן כמובן קוד בסגור ומסוגר הרץ על בסיס CUDA. כמובן, גם הוא API פרטי וקנייני של חברת nVidia.</p> <p>אקדים ואומר: אין אני טוען שהסכנה כאן כי החברה "המרושעת" תשתלט על בינה מלאכותית ותקים skynet מתחת לרגליים שלנו. לא, בסה"כ מדובר במימוש פעולות מתמטיות בסיסיות מוגדרות היטב בצורה יעילה להפליא.</p> <h2>אבל אני רוצה קוד פתוח?</h2> <p>אז יש מספר פתרונות וכיוונים:</p> <ol> <li>לאמן הכל ב־CPU בלבד.</li> <li>להשתמש בתשתית ROCm של AMD.</li> <li>להשתמש ב־OpenCL במקום ב־CUDA ואז חוץ מדרייבר של nVidia הכל יהיה פתוח (פחות או יותר)</li> </ol> <p> <a href="/post/328">המשך...</a> </p> </div> CppCMS עובר מ-LGPLv3 ל-MIT http://artyom.cppcms.com/post/320 http://artyom.cppcms.com/post/320 <div style="direction:rtl"> <p>היום עדכנתי רישיון של CppCMS ל-MIT. הגרסה הקרובה 1.2 תשוחרר עם רישיון מעודכן</p> <p>ההחלטה נובעת ממספר סיבות:</p> <ol> <li>רצון להגדיל נתח השוק של CppCMS ולהקל על כניסה של משתמשים חדשים</li> <li>להביא יותר מפתחים לפרויקט</li> </ol> </div> אחרי תקופה ארוכה שוחררה בטא של CppCMS 1.1.0 http://artyom.cppcms.com/post/319 http://artyom.cppcms.com/post/319 <div style="direction:rtl"> <p>אחרי תקופה ארוכה של המתנה שוחררה גרסת בטא 1.1.0 של CppCMS. גרסה זו <a href="http://cppcms.com/wikipp/en/page/cppcms_1_2_whats_new">מכילה המון שיפורים ושיוניים</a>. ביניהם:</p> <ul> <li>תכנון מחדש של application pool לתיקון מספר בעיות מובנות שהיו קיימות בו עד כה</li> <li>API חדש של פעולות non-blocking לשיפור משמעותי בביצועי אפליקציות אסינכרוניות</li> <li>סיכון ועיבוד בזמן העלאה של התוכן (למשל עיבוד או בדיקה של קבצים תוך כדי העלאה)</li> <li>תמיכה משופרת ב-RESTful API</li> <li>מערכת לניהול plugin ושיפורים מערכת תבניות (templates) בהם.</li> <li>אפשרות ניהול session ללא עוגיות (למקרה והמשתמש ממש צריך)</li> <li>שילוב ניהול ה-session מול טכנולוגיות אחרות כולל מימוש עבור PHP, Java Servlet, ASP.Net ו-Python Django</li> <li>שיפורי ביצועים רבים</li> <li>ועוד...</li> </ul> <p>התכנון הוא לבצע בדיקת בטא מהירה, לשחרר 1.2 כגרסה יציבה (גם ככה חלק ניכר מהמשתמשים כבר עובד בענף הפיתוח ב-git).</p> <p>לאחר מכן אני רוצה לעבור לפיתוח בחלקים יותר קטנים ללא השהיות גדולות בין הגרסאות. בהמשך <a href="http://cppcms.com/wikipp/en/page/cppcms_1x_tasks">מתכנון</a>:</p> <ul> <li>ל-1.4 תמיכה מלאה ב-HTTP/1.1, ב-HTTPS ומימוש של websockets</li> <li>ל-2.0 להעביר CppCMS ל-C++11 תוך ניקוי חלק מה-API שילקח מספריה סטנדרטית כמו <code>std::shared_ptr</code></li> </ul> <p>אתם מוזמנים להתנסות בגרסת בטא האחרונה!</p> </div> שילוב בין טכנולוגיות Web שונות ו-CppCMS http://artyom.cppcms.com/post/317 http://artyom.cppcms.com/post/317 <div style="direction:rtl"> <p>כשיש לך מערכת ווב גדולה ומפותחת ואתה צריך להעביר חלקים קריטיים ממנה לטכנולוגיה מהירה יותר (קרי CppCMS) אתה נתקל קודם כל בבעיה הבסיסית - איך לשתף מידע.</p> <p>נתונים גולמיים זה קל - יש מסדי נתונים, יש קבצים - אין פה משהו מסובך, אבל אתה צריך גם לשתף מידע על המשתמש ועל ה-session שלו בין הטכנולוגיות ופה כל אחד ממש את מה שהוא צריך בצורה אחרת. מצד שני זה מאוד חיוני לשתף מידע קריטי כמו זיהוי משתמש בצורה מאובטחת.</p> <p>לכן, יצרתי שכבת תיאמות שמאפשרת לגשת ל-Session של CppCMS מכל שפת תכנות אחרת.</p> <p>בשלב ראשון עדכנתי את המחלקות הקשירות לניהול ה-Session של CppCMS שיוכלו לפעול בצורה בלתי תלויה מהמערכת. <a href="http://sourceforge.net/p/cppcms/code/HEAD/tree/framework/trunk/cppcms/capi/session.h">יצרתי API נקי</a> מבוסס C בלבד כדי שלא יהיו בעיות כמו חריגות (exceptions) האופייניות ל-++C וגם כדי שאפשר היה לטעון את הפונקיות ישירות בעזרת dlopen.</p> <p>אחר כך יצרתי מספר מודולים עבור שפות שונות:</p> <ul> <li>PHP עם שימוש ב-Swig</li> <li>Java/Servlet עם שימוש ב-JNA</li> <li>Python עם שימוש ב-ctypes והתממשקות עם Django (אבל לא מוגבל ל-Django)</li> <li>Asp.Net עם שימוש ב-PInvoke</li> </ul> <p>כמובן זה לא מוגבל אליהם בלבד. אבל לכל שפה חדשה צריך לבנות מעטפת. שקלתי לעשות גם ל-Ruby on Rails אבל ויתרתי לבינתיים כי אין לי ניסיון עם Ruby בכלל, אז שמישהו יתרום בעת הצורך.</p> <p>חייב להגיד לכל טכנולויה היו בעיות משלה... למשל ב-Python היו התנהגויות מוזרות כשניסיתי לבנות מתודות באופן דינאמי, ב-Java/JNA הכל עבר חלק להבפליא. PInvoke שיגע אותי עם חוסר רצון שלו להמיר UTF-8 ל-string ובחזרה (אגב Mono כן עושה זאת בצורה שקופה אבל לא Net. של Windows מתעקש להשתמש בקידוד ANSI). יצירת מודולים עם Swig עבדה לא רע בכלל, אבל נדרשת עוד מעטפת כדי להתאים את הכל בסופו של דבר לשפה עצמה והתנהגותה.</p> <p>ואיך זה נראה</p> <p>PHP:</p> <pre><code>// pool initialization $pool=CppCMS_SessionPool::from_config('cppcms-config.js'); // per request session access $session=$pool-&gt;session(); $session-&gt;load(); $x=0; if($session-&gt;is_set('x')) { $x=$session['x']; } $x=intval($x)+1; $session['x']=$x; $session-&gt;save(); ... </code></pre> <p>Java/Servlet:</p> <pre><code>static SessionPool pool; public void init() throws ServletException { pool = SessionPool.openFromConfig("/path/to/cppcms-config.js"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Session session = pool.getSession(); session.load(request); String x="0"; if(session.isSet("x")) x=session.get("x"); x=Integer.toString(Integer.parseInt(x)+1); session.set("x",x); session.save(response); session.close(); ... } </code></pre> <p>Python/Django:</p> <pre><code># Create global pool pool=cppcms.SessionPool('/path/to/cppcms-config.js') # Actual view def home(request): s=pool.session() s.load(django_request=request) v='0' if 'x' in s: v= s['x'] s['x']=str(int(v)+1) response = HttpResponse() s.save(django_response=response) ... </code></pre> <p>C#/ASP.Net:</p> <pre><code>static SessionPool pool; static Example() { pool = SessionPool.FromConfig("cppcms-config.js"); } protected void Page_Load(object sender,EventArgs e) { using(Session s = pool.Session()) { s.Load(Request); string v="0"; if(s.IsSet("x")) v=s["x"]; v = (int.Parse(v) + 1).ToString(); s["x"]=v; s.Save(Response); } ... } </code></pre> <p>אפשר לראות את הקוד והדוגמאות המלאות <a href="http://sourceforge.net/p/cppcms/code/HEAD/tree/framework/trunk/contrib/integration/session/">כאן</a></p> <p>אני עדיין תוהה עם איזו עוד פלטפורמה כדי לעשות אינטגרציה. בסופו של דבר חשובה לי הפשוטות והנוחות של העבודה.</p> </div> לשרת את כל אתרי החדשות בארץ בעזרת... CppCMS http://artyom.cppcms.com/post/315 http://artyom.cppcms.com/post/315 <div style="direction:rtl"> <p>אני לא יודע אם שמתם לב, אבל בשנה האחרונה קצב הפיתוח של תשתית CppCMS ירד בצורה ניכרת. ריכזתי את מרבית המאמצים במערכת פרסום מיוחדת הבנויה על תשתית ה־CppCMS שפותח עבור לקוח.</p> <p>הפרויקט נקרא <a href="http://linicom.co.il">ליניקום</a>.</p> <p>היום, כשליניקום כבר פעיל זמן רב ומתוחזק ע"י צוות מורחב, אני אוכל להקדיש יותר זמן לתשתית CppCMS עצמה.</p> <p>מספר מילים על "ליניקום":</p> <p>"ליניקום" הוא מנוע שמביא פרסומות תלויות תוכן ומותאמות למשתמש לאתרים שונים בקלות רבה. מרבית אתרי החדשות הגדולים בארץ משתמשים בשירותי ליניקום, ביניהם: ynet, הארץ, מאקו, Jerusalem Post, ואללה ועוד רבים אחרים כולל מספר אתרים גדולים בחו"ל.</p> <p>להלן כמה עובדות מעניינות:</p> <ul> <li>ליניקום מבוססת על טכנולוגית CppCMS</li> <li>המערכת משרתת כ־10,000,000 פניות המותאמות למשתמש ביום - קרי כ־115 פניות בשניה.</li> <li>בשעות העמוסות הקצב מגיע לכ־160 פניות בשניה.</li> <li>השרת מייצר תעבורה יוצאת ממוצעת של כ־11 מגאביט בשניה.</li> <li>צריכת זיכרון הכוללת של המערכת (שרת וואב, בסיס נתונים, יישום, מערכת ההפעלה) הוא בסביבות 360MB</li> <li>העומס הממוצע על המעבדים הוא כ-5%</li> <li>השרת רץ על c1.medium instance בודד ב־Amazon EC2</li> </ul> <p>המערכת רצה מאחורי lighttpd ומשתמשת ב־PosgreSQL לשמירה וניהול הנתונים בצורה אינטנסיבית, עם זאת, מרבית הנתונים הנדרשים בזמן אמת שמורים ומנוהלים בזיכרון.</p> <p>כמעט כל פניה לשרת דורשת עיבוד נתונים על מנת לספק פרסומות מותאמות אישית, מבחינה טכנית, זה אומר שלא ניתן לעשות "מיקור חוץ" של הפניות האלה לקבצים הסטטיים וכל פניה של כל לקוח צריכה להיות מטופלת בנפרד.</p> <p>מערכת הפרסום הזו, היא הדוגמה הקלאסית לשימוש בטכנולוגיית CppCMS - מערכת שצריכה להיות מהירה ואפקטיבית. מערכת שמסוגל להתמודד עם עומסים גבוהים ולעתים חריגים ללא בעיות ולספק איכות השירות גבוהה ביותר.</p> <p>שימוש בנתונים השמורים בזיכרון, ניהול נתונים שלא יכולים להיות שמורים בזיכרון מטמון - זה המקום בו יכולות CppCMS באות לידי ביטוי במלואן. יכולת גדילה גבוהה עם דרישות תחזוקה מינימליות, אמינות גבוהה - האם אלה שמאפשרים לדאוג לצד העסקי בלי לחשוב על בעיות ביצועים אפשריות.</p> </div>