יום שבת, 19 במרץ 2016

על החומרה שמריצה את התוכנה שלנו

אני עושה כאן קצת ניסוי.

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

יש קורסים העוסקים בחומרה באוניברסיטה "ארכיטקטורת מחשבים" או "מבנה וארגון מחשבים", למשל. כיאה לאוניברסיטה הקורסים הללו מתמקדים יותר בתיאוריה עם דוגמאות (לא) מייצגות: למשל מעבדי 80806 בני 20 שנה.

הקורסים מתחילים בבעיה של ייצוג ספרות, אולי מספרים עשרוניים, סט פקודות RISC vs. CISC, ואז אינדיאנים גדולים ואינדיאנים קטנים... - שהכל חשוב, אבל בגלל שנכנסים כ"כ לעומק בפרטים הללו - מסיימים אולי עם שכבות זכרון ו Cache של מעבד או הממשקים הנמוכים של הקוד עם מערכת ההפעלה. התמונה לא מתחברת לתמונה שלמה ושימושית עבור רוב האנשים.

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

מי שמסיים קורס שכזה והולך לקנות מחשב, עדיין לא יכול להתמודד עם הצעות של מוכר כגון "64 ג'יגבייט SSD לדיסק ראשי זה בסדר גמור - אתה שם עליו רק מערכת הפעלה!" או "אם אתה משקיע כבר, שים 16 ג'יגבייט זכרון - חבל לקנות מחשב טוב אבל אז הוא לא יזוז כי אין לו מספיק זיכרון!" (עצות שאני קיבלתי בפעם האחרונה שקניתי מחשב. לא התבלבלתי בגלל המוכר ושמתי את הכסף על SSD גדול יותר ופחות זיכרון).

אז אתה, כמתכנת, מבין במחשבים, או לא?

ואז בעבודה (את/) אתה שומע כל מיני הערות על SSD או ECC ואולי Blades - ואין לך מושג (אני מנחש - אני דווקא מכיר) על מה מדברים ואיך זה קשור לתוכנה שאתה כותב. אז אני יודע מה זה ALU ומה הם שערים לוגים - אבל מעולם לא נתקלתי בשיחה במסגרת העבודה שהגיעה לאיזורים הללו בכלל.


מקור: hdwallpapershoot



אז למה הפוסט הזה הוא "ניסוי"?
  1. קשה לי לטעון שהידע שאכסה הוא ידע שימושי למתכנת. הבנת החומרה תרמה לכמה דיונים ספקולטיביים (אך אינטלגנטיים) בקריירה שלי - אך קשה לי לומר בבירור שהיא עזרה לי לפתור בעיות שלא הייתי יכול לפתור בדרך אחרת.
  2. אני לא מומחה אמיתי בתחום. הידע שלי מגיע יותר מפירוק והרכבה של מחשבים (שעשיתי יותר כשהייתי צעיר), ומהתעניינות כללית באתרים כגון TomsHardware או AnnandTech, והרבה התעניינות אישית בהזדמנויות שכן היה מגע עם החומרה.
  3. אני לא הולך "לדקדק" כפי שאני עושה בד"כ. כלומר: אני הולך לצמצם את תהליכי האימות שאני עושה בד"כ - ולכן סביר שהפוסט הזה יהיה פחות מדויק ומקיף ממה שבד"כ אני מפרסם.
אני כותב אותו בעיקר בשביל הפאן.

הוא עדיין עשוי להיות מעניין ושימושי לרבים - ויהיה אפשר ללמוד ממנו. כלומר: ממישהו שיודע יותר, אפילו שהוא לא מומחה (שזה אני).

אז עם כל ההסתייגויות וההבהרות - נצא לדרך.

הא... נ.ב.: אני הולך לעשות עוד משהו בצורה הפוכה לגמרי מהקורס האקדמי: במקום להתחיל מ"הכי בפנים שיש" (ייצוג ספרות, שערים לוגים) אני הולך להתחיל מבחוץ - מהקופסה. להתחיל בדבר הראשון שאנו נתקלים בו בעולם האמיתי, ולא בגורס הבסיסי ביותר במערכת החישובית (ייצוג מספרים?).


מקור: Rainbow Communication - computer and internet 101


הקופסה


אני אניח שאתם מבינים לעומק את ההבדל בין ה case ("המחשב") למסך וה Peripherals השונים. הנה וידאו קצר בו מפגישים חבר'ה צעירים עם מחשב משנות ה 90 עליו מותקנת "חלונות 95" ("את יכולה לנחש מה זה?" שואל המראיין - "המחשב הראשון שנוצר??" עונה הצעירה בפליאה) - אם אתם רוצים קצת להשתעשע.



בגדול יש 3 סוגי cases למחשבים (כלומר: שרתים, לא מחשב ביתי):
  • Tower - הזול ביותר, המשמש גם מחשבים ביתיים. קל להזיז אותו ולאחסן אותו בכל מקום - אך אינו יעיל בתפוסת המקום. מכיל הרבה אוויר ;-). לא ניתן להניח אותם זה על זה (בבטחה), ואין דרך טובה לארגן כבלים / את האוורור.
    • בסאפ היה לנו חדש שרתים עם Tower cases (עבור הפיתוח). שמו אותם על מן מדפים כאלו. 3 או 4 קומות. 
  • Rack Mount - הוא סטנדרט אחיד ל Cases של שרתים כל שיוכלו להתאים באותו הארון ולהיות מאוחסנים ביעילות של מיקום ואוורור (לדוגמה הסטנדרט אומר שזרימת האוויר צריכה להיות מקדימה לאחור).
    • את השרתים מאחסנים בתוך ארון שנקרא Rack או Cabinet (בציור נראה כמו שלד - אך מדובר לרוב בארון מאסיבי). ה Rack מגיע עם קיטים של מסילות (Rail kit) שמבריגים על השרתים הפיסיים וכך ניתן לחבר אותם ל Rack.
    • המסילות מסייעות לגשת בקלות לכל יחידה. יש לרוב התקנים לסידור הכבלים כך שישבו יפה בתעלות משלהן.
    • הסטנדרט המקובל שאני מכיר הוא זה: בשרתים - הכבלים הם מאחור, בציוד תקשורת - הכבלים הם מלפנים. (יש הרבה יותר מה לחבר). אם אתם נכנסים לחדר שרתים (חוויה שהולכת והופכת לנדירה בימנו) ורואים בלאגן של כבלים - אתם כנראה רואים ציוד רשת.
    • בעוד הרוחב והעומק של ה cases של השרתים הוא זהה - הגובה יכול להשתנות ביחידות קבועות, הנקראות Rack Unit. בקיצור RU או רק U. ציוד תקשורת יהיה בד"כ 1U, ושרתים יהיו לרוב 2-4U גבוה. שרת של 4U תופס מקום של שני שרתי 2U. בארון יש בד"כ 42 או 48 U בסך הכל. 
    • השרתים הם עדיין עצמאים (יש לכם ספקי כח ומאווררים משלהם), ויכולים להגיע מספקים שונים.
  • Blade - בכדי לחסוך עוד מקום, וגם לייעל כמה תהליכים (למשל: צריכת חשמל, חיבורי רשת) יצרו פורמט שנקרא Blade ("להבים"). שרתי ה Blade מורכבים בתוך שאסי (chassis = שלדה) שהיא בעצמה מורכבת בתוך Rack (והיא תתפוס משהו כמו 8-15U). השאסי מספק לשרתים חשמל, קירור וחיבורים (במקום כבלים) מה שמאפשר לכל אלו להיות יעילים ומאורגנים יותר.
    • אם תזדמנו לחדר שרתים, תוכלו לזהות Blade unit בכך שהיחידות הן אנכיות (כמו "להבים") ולא אופקיות כמו Rack units.
    • החיסכון הגדול במקום הוא במידה רבה בגלל היכולת לשתף Redundancy: בכל שרת Rack יהיו באופן טבעי שני ספקי כח (ספקי כח ודיסקים הם הרכיבים שמתקלקלים הכי הרבה), ואמצעי קירור (מאווררים, לרוב) יתירים. לא נרצה שהשרת יפסיק לפעול אם "נדפק" ספק הכח או נתקע מאוורר. מצד שני - היתירות בכל יחידה גוזלת הרבה מקום. ה Blade חוסך את היתירות לכל שרת ב Rack ומספק יתירות שיתופית לכל השאסי.
    • עד כמה שידוע לי, אין שום תקן אחיד לחיבור בין השאסי ל Blades עצמם. אם יש לכם שאסי של IBM - תוכלו לחבר אליו רק יחידות (שונות) מתוצרת IBM.
    • ה Blade נשמע כמובן הפתרון המועדף, אך יש לו גם חסרונות. המחיר - הוא לרוב החיסרון העיקרי, חוסר הגמישות לשלב בין יחידות של ספקים שונים או "להשתחרר" מספק - ללא השקעה כספית ניכרת. היחידות עצמן לרוב הן קבועות ולא ניתנות להרחבה (אין חריצי PCI ולעתים לא ניתן להוסיף דיסק או זכרון). ה Blade מתאים בעיקר ל Data Centers גדולים.

אני רוצה לציין משהו על צריכת חשמל: צריכת החשמל, עד כמה שידוע לי, היא כיום האתגר העיקרי בבניית Data Center. יותר כח מחשוב => יותר צריכת חשמל => יותר דרישת קירור.

לרוע המזל יש גבול לכמה קירור ניתן לספק לנפח מסוים, ועל כן לא ניתן לדחוס שרתים ללא גבול. דרישות הקירור הופכות לדרישות נדל"ן - שזו הוצאה גדולה בפני עצמה. כלומר: חשמל (של המחשבים + הקירור שלהם) והנדל"ן שמאחסן אותם הוא מרכיב העלות המרכזי של ה Data Center המודרני. כיצד מצמצמים עלויות?
  • רכישה של שרתים עם נצילות חשמל טובה יותר (הדורות החדשים של המעבדים לגמרי שם).
  • אופטימיזציות שונות. ספק כח (PSU) עם יעילות של 90%+ (platinum class) הוא דיי יקר - מאות דולרים ליחידה עבור שרת רגיל. עבור יחידות ב Rack לעתים קשה להצדיק את ההוצאה: שתי יחידות לכל שרת (עבור יתירות).
    ב Blade - אין בעיה להשקיע ב PSU יעיל הרבה יותר. להזכיר: ה PSU בעצם ממיר את המתח 110/240v לסדרת מתחים נמוכה (6/12/24v) לה רכיבי המחשבים בעצם זקוקים. תוך כדי ההמרה - אנרגיה מתבזבזת וממורת לחום. PSU זולים (מה שיש לנו בבית) לרוב מבזבזים כ 20-30% מהאנרגיה בהמרה - וייתכן שיהיה כלכלי יותר לקנות PSU יעיל מעט יותר (במידה ואנו משתמשים במחשב שעות רבות - כמוני).
    • יחידות Blade לרוב דורשות זרם תלת-פאזי, ושמעתי טענה ש PSU תלת פאזי יהיה בהגדרה יעיל יותר. אולי בגלל היכולת לנצל בכל פעם פאזה אחרת שהיא חיובית בכיוון הזרם שלנו ?!?! (ניחוש).



כך נראה Rack במציאות. Rack מסודר להפליא - עלי לציין. בחלק התחתון שלו ניתן לזהות יחידות Blade.
הערה: אם אתם מזהים יחידות אנכיות ממש קטנות (10-15 ס"מ) אלו אינם blades אלא דיסקים נשלפים ב Hot swap. אל תעשו לעצמכם פאדיחות :)


בתוך הקופסה


בתוך ה Case של המחשב לוח האם (motherboard) הוא זה שמחבר פיסית את כל הרכיבים השונים: הוא מקבל חשמל מספק הכח (PSU = Power Supply Unit) ומעביר מתחים לרכיבים השונים. הוא כולל גם את קווי החשמל עליהם עוברים נתונים בין הרכיבים השונים, מה שנקרא Bus, את החיבורים החיצוניים (USB, SATA), וכו'.

רכיבי המחשב השונים. מקור: How to know your computer hardware components

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

כמרכיבים מחשב אנו קודם לכן בוחרים מעבד - ומשם את שאר הרכיבים.
ארכיטקטורות נפוצות הן:
  • x86 (ידועה גם כ x86-64, x64, או AMD64) - הארכיטקטורה הנפוצה ביותר (כ 90% משוק השרתים). מריצה "חלונות", לינוקס, ומק. מיוצרת על ידי אינטל אבל גם ע"י מתחרתה AMD.
    • מעבדי AMD ואינטל דורשים לוחות אם שונים, אבל שאר הרכיבים (זיכרונות, חריצי הרחבה) - הם משותפים.
  • PowerArchitecture (לשעבר PowerPC) - ארכיטקטורה שמשמשת בעיקר את IBM בשרתי ה High-End שלה (Power 8, Power 7, ובקרוב Power 9), השנייה הנפוצה לאחר x86. מריצה בעיקר AIX (יוניקס של IBM).
  • Sparc של שרתי אורקל (לשעבר Sun Microsystems) - שולטת על אחוז או שניים משוק השרתים העולמי (לפני עשור או שניים - נתח השוק שלה היה גבוה משמעותית). מריצה בעיקר Solaris (יוניקס של Sun).
  • ARM - הארכיטקטורה שנפוצה מאוד במכשירי מובייל בשל חסכנותה בחשמל. ישנם גם יישומים שלה בצד השרת (עדיין לא נפוצה).



לאורך השנים המעבדים הגבירו את מהירות העבודה שלהם: על לוח האם ישנו שעון שמספק קצב למעבד: זה התחיל ב 4KHz (קילו-הרץ) והסתיים בערך ב 4.3GHz (ג'יגה-הרץ). חוקי הפיסיקה לא מאפשרים להעלות את מהירות המעבד מעל כ 4300~ מגה-הרץ בצורה יעילה (קירור בחנקן נוזלי יכול לאפשר 6GHz בערך - אך זו לא גישה כלכלית). לכאורה: יצרני המעבדים לא יכלו לייצר מעבדים מהירים יותר.
בפועל שיטות הייצור אפשרו למזער עוד ועוד את המעבדים והפתרון היה לייצר כמה cores בכל מעבד. כלומר: המעבד הוא "אריזה" שבתוכה ארוזים 2, 4 או יותר מעבדים "cores" כמעט-עצמאים שמבצעים את החישוב.

חשוב לציין שמהירות השעון (GHz) ומספר ה Cores הם לא מדד מוצלח להערכת כח-מחשוב. לדוגמה המעבד של אפל למובייל (A9) מכיל רק 2 cores במהירות 1.85GHz - אך הוא מהיר משמעותית ממעבדים בעלי "8 cores במהירות שעון של 2GHz" (להלן SnapDragon 810 של חברת Qualcomm).

עוד שינוי שהתרחש בשנים האחרונות בעולם ה Consumer הוא שבתוך ה"אריזה" של המעבד (CPU) נהוג היום לארוז גם מעבד גרפי (GPU, לעתים כמה cores) שנדרש עבור הרצת אפליקציות גרפיות ומשחקים.

את לוח האם מתאימים למעבד ע"פ דגם ה Socket (למשל LGA 1151 של אינטל) ו Firmware מתאים (כלומר: לוח האם צריך לציין שהוא תומך במעבדים מסדרת Skylake של אינטל - אחרת ייתכן ולא יידע להפעיל חלק מהיכולות שלהם).
Firmware היא התוכנה של רכיב אלקטרוני, במקרה שלנו ה Chipset של לוח האם - סדרת רכיבים אלקטרוניים שתומכים בארכיטקטורת המעבד. ה Chipset הוא "המוח" של לוח האם, והוא נקרא כך כי הוא בעצם סדרה של רכיבים אלקטוניים שמרכיבים במקומות שונים על לוח האם.

Sockets של מעבד אינם תואמים לאחור או לעתיד. בד"כ החלפה של מעבד תדרוש החלפה של לוח אם, וזיכרונות, ולעתים אף של חריצי ההרחבה (כרטיס רשת, כרטיס גרפי, וכו').


מעבד Sandy-Bridge של אינטל. מקור: www.bit-tech.net


בתוך "אריזת" המעבד כוללים 3 רמות שונות של זיכרונות Cache המסומנים כ L2, L1, ו L3. אתם בוודאי מכירים את העניין הזה, אך אני אחזור עליו בקצרה. מדוע 3 רמות שונות?
  • כאשר ה Cache הוא גדול יותר, ניתן לאחסן בו יותר נתונים אך החיפוש אחר ערכים (latency) - מתארך. יש פה Tradeoff מובנה בין מהירות תגובה לנפח אכסון.
  • בעבר למדתי ש L1 (הזיכרון הקטן והמהיר ביותר) נמצא קרוב יותר לליבת ה Core - מה שמקצר את ה Latency שלו, ו L2 הוא יותר רחוק. לא מצאתי אימות למידע הזה.
  • בסופו של דבר מחלקים את ה cache לשלוש רמות (בד"כ!): 
    • L1 הכי קטן והכי מהיר - נמצא בתוך ה Core. ב Skylake לכל core יש 64KB של L1.
    • L2 קצת יותר גדול ופחות מהיר - גם נמצא בתוך ה core. ב Skylake לכל core יש 256KB של L2.
    • L3 הוא לרוב משותף בין כל ה cores (חבל להביא ולאחסן אותם נתונים בצורה כפולה בין ה cores). הגודל שלו הוא בין 2MB במעבדים הבסיסיים עד עשרות MBs במעבדי השרת.
    • ב Skylake הציגו גם לראשונה זכרון L4 (בחלק מהדגמים) - אך הוא נועד למעבד הגרפי (GPU).
  • ה Cache מחזיקים שני סוגי מידע:
    • קוד להרצה (שגם אותו צריך לטעון לזיכרון)
    • נתונים של התוכנה.
  • כל פעם שאתם קוראים בקוד התוכנה אפילו לביט אחד של נתונים מהזיכרון שאינו נמצא ב Cache, יש לבקש העתקה של בלוק (אם כבר מבצעים העתקה, מעתיקים לפחות כמה עשרות או מאות Bytes) מהזיכרון הראשי ל L3 ואז ל L2 ואז (אולי) ל L1.
    • ה RAM הוא לא באמת "Random Access" - מהירות התגובה שלו כלפי המעבד תלויה מאוד באילו נתונים נמצאים כבר ב Cache.



צלילה קצרה למעבדי אינטל (x86) השונים


בפוסט זה אני אתעלם כמעט לגמרי מהארכיטקטורות האחרות ואתמקד רק ב x86. הנה רשימת הדורות האחרונים של הארכיטקטורה:


Sandy Bridge הוא גאווה ישראלית: הוא פותח בסניף אינטל בחיפה. הוא הציג יכולות עיבוד וידאו שהיוו ממש קפיצת-מדרגה, וכלל עוד כמה חידושים מרשימים (Turbo Boost?). מאז לאינטל אין כמעט תחרות מצד AMD (המתחרה המשמעותי היחידי בעולם ה Desktop) והדורות הבאים כמעט ולא הציגו ביכולת העיבוד שלהם - רק השתפרו בצריכת החשמל. בצד השרתים דווקא יש התקדמות מתמדת - מכיוון שיש תחרות מצד יבמ, אורקל, וחשש לתחרות מצד מעבדי ARM.

מילה לגבי תהליך הייצור: בכל שנה בערך אינטל מוציאה דור חדש של ארכיטקטורת המעבד שלה (שהיא תואמת לאחור). דור אחד משפר את הליטוגרפיה (טכניקת הדפסת המעגלים, הנמדד במרחק המינימלי בין 2 קווים - בננומטר) - מה שנקרא "Tick". דור עוקב משפר את הארכיטקטורה וה Layout של המעבד - מה שנקרא "Tock". 

כל קפיצה בתהליך הייצור מאפשרת לדחוס בערך פי 2 טרנזיסטורים בנפח נתון: "22 בריבוע" (שטח המעבד) הוא בערך חצי מ "32 בריבוע". כלומר: ניתן ליצור מעבדים עם יותר cores, או מעבדים קטנים יותר וחסכניים יותר בחשמל.

ייתכן ומעכשיו, בשל הקושי לשפר את תהליכי הייצור כל שנתיים - אינטל תעבור למחזור תלת שנתי: ״תהליך״, ״ארכיטקטורה״, ו״אופטימיזציה״.

במעבדים השולחניים של אינטל יש כ 4 cores (בשל מחסור בתחרות?), במעבדים עבור מחשבים ניידים - 2 (עבור צריכת חשמל נמוכה, בכדי להאריך את חיי הסוללה), ובשרתים - עד 22 cores (עבור ביצועים).

ההערכה היא שלא ניתן יהיה ליצור תהליך קטן מ 7nm או 5nm - ובעתיד קצב השיפור של מעבדים ייעצר (או שיימצא טריק אחר על מנת לשפר אותם).

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


בדוגמה הזו לקחתי את Ivy Bridge, אך לכל דור יש את גרסאות ה M, EP, E וה EX שלהם.
לרוב גרסאות ה EX וה E משוחררות מאוחר יותר, לעתים שנה או יותר לאחר שחרור גרסת ה Desktop / Mobile.

i3/5/7 ו E3/5/7 הן תתי סדרות בתוך הארכיטקטורות ומשמשים לעתים כשמות מרקטיאליים. למשל: המשמעות של i7 עבור מעבדים שולחניים ועבור מעבדי מובייל - היא שונה.
אינטל גם מוציאה מעבדים הממותגים תחת השמות Pentium ו Celeron - שהם המעבדים הזולים ביותר.

הנה דוגמה להבדלים בין הסדרות השונות במחשבים שולחניים (מבוסס על סדרת Skylake):
  • Celeron/Pentium - מעבדים בעלי 2 cores.
  • i3 - מעבדים בעלי 2 cores ויכולת HyperThreading (בקיצור HT). יכולת שמאפשרת הדמייה של פי-2 cores נוספים לצורך עיבוד מקבילי - ומקובל להעריך אותה כב 20% שיפור בכח החישוב. כלומר: כ 2.4 cores בהערכה פשוטה.
  • i5 - מעבדים בעלי 4 cores + יכולת Turbo Boost (בקיצור: TB) המאפשרת למעבד להגביר את קצב השעון אם חלק מה cores לא פעילים (עבור קוד שאינו concurrent). השיפור הוא כ 10% יכולת חישוב במצבים ספציפיים שכאלו.
  • i7 - מעבדים בעלי 4 cores ויכולות TB + HT.
  • i7 Extreme - מעבדים בעלי 4 או 6 cores, עם כל היכולות האפשריות ו Bus משופר (שזה השיפור העיקרי - בעיקר עבור gamers כבדים). אינטל אגב, היא גם היצרנית של ה Chipsets עבור המעבדים שלה.

והנה דוגמה להבדלים בין הסדרות השונות במעבדים עבור מחשבים ניידים (מבוסס על סדרת Skylake):
  • Celeron/Pentium - מעבדים בעלי 2 cores.
  • i3/m3/m5/m7 - מעבדים בעלי 2 cores ויכולות TB + HT.
  • i5/i7 - מעבדים בעלי 2 cores ויכולות TB + HT + זכרון L4 ייעודי עבור המאיץ הגרפי (לא בכל הדגמים).
  • i5 Extreme (מסומנים כ HQ) - מעבדים בעלי 4 Cores + יכולת TB + זכרון L4 ייעודי עבור המאיץ הגרפי.
  • i7 Extreme (מסומנים כ HQ או HK) - כמו מעבדי i5 Extreme + יכולת HT.

ישנם עוד הבדלים שונים (לרוב פחות משמעותיים) בין הדגמים השונים בתוך כל סדרה. בקיצור: כדאי לעקוב אחרי הפרטים!
במשך שנים מכרו מעבדי i7 לעולם המובייל שהיו מהירים בכ 30% בלבד ממעבדי i3 למובייל - למרות שעלו כפול ויותר מהמעבדים הפשוטים יותר. הרבה אנשים שילמו ומשלמים פרמיה על המדבקה עליה מתנוסס הלוגו "i7" ("זה הכי טוב!") - ללא ערך משמעותי להשקעה.



הזיכרון

זכרון פעם היה רכיב יקר למדי (אני זוכר שקניתי בתיכון 4MB זכרון ב 300$), אך הוא הפך ונהיה זול למדי, גם אבסולוטית וגם יחסית לשאר חלקי המחשב. מחשב אישי לרוב יכול להכיל עד כ 32GB זכרון (מחשב נייד: בד"כ חצי מזה), אך שרת יכול בקלות להכיל 256GB זכרון ואפילו ניתן למצוא שרתים עם 2TB זכרון. למה כ"כ הרבה זכרון? בד"כ עבור יישומים ייחודיים (למשל: In-Memory Databases).
הזיכרונות בארכיטקטורת אינטל הם מסוג DDR-SDRAM ומסומנים כ DDR3 או DDR4.

מרגע שאינטל עברה לארכיטקטורה של 64-ביט, הכמות התאורטית של זכרון אליו המעבד יכול לגשת היא איננה מגבלה (המעבדים הנוכחיים משתמשים ב 48 ביט לייצוג זכרון, מה שמאפשר גישה תיאורטית ל 256TB זכרון). לרוב מה שמגביל את כמות הזיכרון שניתן להתקין הוא לוח האם, או מגבלות מלאכותיות של מערכת ההפעלה / התוכנה בה אתם משתמשים (Windows 7 Home Premium לא תאפשר להשתמש ביותר מ 16GB זכרון מבלי לשדרג לגרסה יקרה יותר של מערכת ההפעלה). אם בעבר (לפני עשור) ההמלצה הייתה תמיד לרכוש כמה זכרון שהתקציב שלכם מאפשר, כיום לרוב היישומים לא יהיה שימוש ליותר מ 8GB זכרון (בהנחה שמערכת ההפעלה צורכת כ 1GB זכרון).

הרבה אנשים מסיקים מכך שהם יכולים לקנות כמות מוגבלת של זכרון (נאמר: 4GB למחשב ביתי, או 16GB לשרת) - ולהוסיף עוד DIMMS (יחידות זכרון, מגיעים כיחידות מאורכות נקראות גם sticks) במידת הצורך. זה לא כ"כ פשוט!

לזיכרון יש תזמונים (CAS - ניגע בזה בהמשך) מעט שונים, ושני יחידות DIMM שלא מתואמות לחלוטין - יגרמו לחוסר יציבות של המחשב, ולעתים בכלל לא יעברו את שלב ה Boot של המחשב. יותר גרוע: אתם יכולים לקנות 2 יחידות מאותו מודל של אותו יצרן - והן עדיין לא יעבדו זו עם זו. כיצד זה ייתכן? כי היצרן לעתים משנה תזמונים בין אצוות ייצור של אותו מודל. עליו להתאים לתנאים (חומרים ורכיבים שזמינים לו) - מה שגם מכתיב את התזמונים של האצווה. כמה ניסיונות להגדיר סטנדרטים בתחום הזה - לא ממש צלחו.

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

מה שבטוח הוא לקנות kit שכולל 2 או 4 DIMMs ולהשתמש בו. אם אתם רוצים לשדרג - החליפו את כל ה kit.
אני מניח שהבעיה הזו נפוצה יותר במחשבים הפרטיים ופחות נפוצה כשמדובר בזיכרון לשרתים.

The Most Common DDR DRAM Myths Debunked
DDR DRAM FAQs And Troubleshooting Guide



סוגי הזיכרון השונים

בחלוקה ראשונה אפשר לחלק את הזיכרונות ל2 קטגוריות בסיסיות:
  • זכרון סטטי (SRAM) - מהיר יותר, יקר מאוד, צורך הרבה חשמל, ותופס יותר מקום (6 טרנזיסטורים נדרשים לשמירת ביט אחד של זכרון) - ולכן משתמשים בו עבור זכרון מטמון L1 עד L3.
  • זכרון דינאמי (DRAM) - צפוף, פחות מהיר, פחות יקר, ודורש פחות חשמל - ולכן משמש לזיכרון הראשי של המחשב (גם שרתים).

הבנו מדוע אנו קוראים לזיכרון DRAM, אך מהיכן ה S ב SDRAM?

ה S היא עבור Synchronous מכיוון שהזיכרון מסנכרן את המהירות שלו מול ה BUS של לוח האם. לא 1:1 אלא בכפולות : פי 6 או פי 6.5 -למשל. בעבר הרחוק המעבד והזיכרון רצו באותה מהירות השעון: 33Mhz למשל, אך לא ניתן היה באותה תקופה להעלות את מהירות השעון של הזיכרונות מעבר לכך. הפתרון היה להריץ את המעבד ב 66Mhz ואת הזיכרונות ע"פ קצב של 33Mhz וליצור ביניהם פער של פי 2 במהירות השעון (להלן מעבד 486X2)

הזמנים השתנו ומעבדים רצים במהירות של בערך 3-4GHz, אך הזיכרונות עדיין לא מסוגלים לעבוד עם BUS מהיר בהרבה מ 1GHz.


נשארנו עם ה DDR (קיצור של Double Data Rate).
DDR  הוא תקן לזיכרונות שמעבירים נתונים פעמיים בכל פעולת שעון של ה BUS: פעם בנקודת השיא של השעון ופעם בנקודת המינימום (דמיינו גל סינוס). DDR3-1600 הוא זכרון שעובד עם ה BUS בקצב של 800Mhz, אך כיוון שהוא מבצע שתי העברות נתונים בכל אות של שעון - הוא מסוגל לבצע 1600 מיליון (מגה) העברות נתונים בשנייה, כאילו שהוא עובד עם שעון של 1600Mhz. רכיב הזיכרון עצמו, אגב, עובד רק במהירות של 200Mhz - אבל זה סיפור אחר.
אותו רכיב DDR3-1600 נקרא לעתים גם PC3-12800 בגלל שהוא מסוגל להעביר (תאורטית) כ 12.8GB נתונים בשנייה. כל העברת נתונים מעבירה את מלוא רוחב ה bus (כלומר: 64-ביט) כך שבכל העברת נתונים מעברים שמונה Bytes (שהם 64-ביט).



DDR3 ו DDR4 הן גרסאות שונות של התקן. התקנים אינם תואמים לאחור או לפנים, ואם יש לנו מעבד שלא תומך ב DDR2 לא נוכל להשתמש בזיכרונות מסוג DDR2 איתו. בשנות מעבר (למשל כעת) המעבדים יודעים לתמוך ב-2 תקנים, ומעבדי skylake של אינטל יודעים לתמוך היום גם ב DDR3 וגם ב DDR4 (אך לא ביחד - כמובן).

התקנים השונים של DDR מגדירים אגב מיקום שונה בכל גירסה לאיזה חריץ פיסי שנמצא על ה stick - כך שלא יהיה ניתן "בטעות" להכניס ל slot זכרון מדגם שלא נתמך. בכל גרסה של DDR עולה הצפיפות של הזיכרון (יותר נפח על Stick), עולה מהירות העברת הנתונים, ויורד המתח החשמלי הנדרש (פחות התחממות). התקן העדכני DDR4 (תקן מ 2014, החל להיות נפוץ לשימוש רק בחודשים האחרונים) תומך בנפח של עד 128GB ל stick, ובמהירות העברה (תאורטית) של עד 25.6 GB בשנייה.

עד כמה באמת משנה המהירות של הזיכרונות? לא כ"כ. ע"פ בדיקה שעשה האתר Hardware Canucks המעבר מ DDR3 ל DDR4 מקביל שיפרה בממוצע כ 2.5% בביצועי הקריאה של הזיכרון, 7% בביצועי הכתיבה, וכ 4% בביצועי ההעתקה בתוך הזיכרון. חשוב לציין שההשפעה של הזיכרון על הביצועים תלויה מאוד באפליקציה (והדרך שבה היא משתמשת בזיכרון), אך גם בדגם המעבד הספציפי (וה memory controller שלו) ובלוח האם. לא ניתן באמת להעריך רכיב זכרון מול רכיב זכרון ללא ההקשר המלא.

השפעה של DDR3 מול DDR4 במהירויות שונות על אפליקציית WinRar. במבחנים, זו האפליקציה שהושפעה הכי לטובה (ובבירור) מזיכרון מהיר יותר.
מקור: hardwarecanucks


למחשבים ניידים אגב, יש DIMMs (כלומר: Sticks) שהם קטנים יותר פיסית ונקראים SO-DIMM.
זיכרונות DDR (ואולי גם אחרים) מותקנים בזוגות על לוח האם בגלל טכנולוגיה שנקראת Dual Channel שאמורה לנצל את הזיכרונות בצורה יעילה יותר (אין קשר ל DDR). בדיקה שנעשתה (ב 2007 אמנם) מצאה שיפור מירבי של 5% בביצועים. כלומר: אפשר לשים זיכרונות בזוגות - אך ממש לא חייבים. היום פשוט מאוד לא מוכרים sticks של זיכרונות בבודדים (בגלל בעיות התזמונים שציינתי קודם לכן).
כאשר יש לוח-אם שתומך במספר מעבדים (לא cores) - יש חובה לשים כמה זיכרונות כי כל קבוצת DIMMs (מה שנקרא NUMA node) משרתת מעבד אחר (NUMA הוא שם הארכיטקטורה לתמיכה בכמה מעבדים). אלו לוחות אם ייעודיים לשרתים או תחנות עבודה "Workstation" והם עולים משמעותית יותר מלוחות אם התומכים במעבד אחד.

לוח אם התומך ב-2 מעבדים. ה slots לזכרונות מאורגנים בצורה שמבהירה בקלות אלו זכרונות משרתים כל מעבד. הזכרונות הם Quad Channel  (המקבילה הכפולה של dual channel) ולכן צבועים ברביעיות. מקור: Newegg




תזמוני זכרון (ידוע כ "CAS")

עד עכשיו עסקנו ב Bandwidth של הזיכרון. באיזה קצב ניתן להעתיק מידע בזיכרון אל המעבד (או מאיץ גרפי) ברגע שביקשנו את הנתונים. לא הזכרנו שיישנו דיליי (latency) מרגע שאנו מבקשים את הנתונים ועד הרגע שהם מתחילים לזרום אלינו (בקצב כזה או אחר). כאשר אנו מעבדים כמות גדולה של נתונים בזיכרון - ה bandwidth הוא זה שמשנה. כאשר אנו מעבדים הרבה פיסות קטנות של נתונים - ה latency הוא זה שישנה.

Latency של זכרון DDR מתואר ע"י 4 מספרים: tCAS, tRCD, tRP ו tRAS, למשל 9-9-9-28. ההסבר המדויק מה כל תזמון פחות חשוב. בסופו של דבר גישה לנתונים בזיכרון דורשת שרכיב הזיכרון ייבחר / "יתחבר" לשורה הנכונה ולטור הנכון בו נמצאים הנתונים ברכיבי הזיכרון. המדד tCAS, למשל, מתאר כמה cycles של שעון לוקח לבחור טור בזיכרון. גם לאחר שבחרנו את הטור והשורה הנכונים (בהנחה שהם לא היו selected קודם לכן) - יש להמתין זמן מה עד שאפשר להתחיל בהעברת הנתונים בפועל.
התיאור של זכרון כ "Random Access" או "גישה ב (O(1" היא הפשטה על המציאות המורכבת יותר. גם אם מתעלמים מה Caches שבאמצע.

כאשר המדדים הנ"ל נמוכים יותר - הזיכרון הוא בעל latency נמוך יותר. יש לזכור שהמספרים תלויים ב cycles של השעון, אז לא נכון להשוות מספרים של שני זיכרונות שרצים במהירות שעון גבוהה יותר. מהירות שעון גבוהה יותר = יותר cycles בשנייה. כלומר: tCAS של 9 בזכרון DDR4-2400 הוא טוב מעט יותר מ tCAS של 7 בזיכרון DDR4-1800.


אמינות של זיכרונות

רכיבי זכרון הם אמינים למדי -אך גם הם יכולים להיכשל. כאשר רכיב זכרון לא יודע לספק תשובה מה ערך ה bit בתא מסוים בזיכרון - הדבר יכול להוביל לקריסת המערכת והצורך לעשות restart למכונה. הסיכוי לכך קטן מאוד - אך הנזק גדול.
עניין האמינות הוא לא רלוונטי למחשב ביתי או אפילו workstation, אך כאשר מדובר בשרתים שעובדים 24/7 ומשתמשים באינטנסיביות בזיכרון - הסיכון לתקלה הנדירה הזו הולך וגובר.

ישנם זיכרונות מסוג ECC (קיצור של Error Correction Code). לזיכרונות הללו יהיה רכיב זכרון נוסף (תשעה במקום שמונה) על ה stick שמשמש כסוג של parity (שכפול נתונים). בתוספת של 1/8 מהזיכרון לא רק שניתן לדעת אם הייתה תקלה בזכרון - אלא גם להשלים את הנתון בתא שלא ידע לענות.

זיכרונות ECC הם יקרים יותר. יש שאומרים שאטיים מעט יותר (אני לא יכול לאשר) ונמצאים בד"כ רק בשרתים.

כשהארכיטקטורה שלנו מתבססת על ההנחה שיש הרבה nodes והם כושלים כל הזמן, האם יש עדיין הצדקה כלכלית לשימוש בזיכרונות ECC? האם אמזון AWS, למשל, משתמשים ב ECC?
בדקתי, והתשובה הייתה שכן - כל המכונות באמזון (שהן בהגדרה "commodity hardware") מצוידות בזיכרונות ECC. מעניין!

למערכות Ultra Mission Critical משתמשים במנגנונים של Memory Mirroring (קיצור שלי: MM).
MM עובד ממש כמו RAID 1: כל נתון שנכתב לזיכרון נכתב פעמיים, כך שאנו בעצם משתמשים בחצי מכמות הזיכרון הפנויה, ואנו צורכים פי-2 מה BUS - לכתיבה כפולה לזיכרון. אם רכיב זכרון (ביט או stick שלם) כושל - השרת ממשיך לעבוד כרגיל כאילו שום דבר לא קרה. איש operations יחליף את ה stick המקולקל - והכל יחזור להיות כפי שהיה. אם לוח האם תומך גם ביכולת בשם Memory Sparing, אז ניתן להתקין על לוח-האם כמה sticks של זכרון שלא יהיו בשימוש שוטף - אך יכנסו לשימוש אוטומטית ויחליפו sticks של זכרון שכשלו, וכך יאריכו את הזמנים ביניהם יש לעשות maintenance לשרת, כלומר: החלפה של sticks זיכרון תקולים. יכולות ה MM וה Memory Sparing הן יכולות של לוח האם, והן זמינות רק בעולם ה High-End של השרתים.

האם אמזון משתמשים גם ב MM? מה אתם אומרים?
בדקתי - ולא. אמזון לא משתמשים ב MM. אתם מוזמנים לבדוק לגבי Memory Sparing ולהגיב :)


סיכום


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

נכון: יש עוד הרבה עניינים: אחסון (דיסקים, ממשקים, וכו'), יציאות (USB למשל), לוח האם עצמו, ועוד רכיבים. (מישהו יודע מה זה G-Sync? בפירוש לא טכנולוגיה של שרתים.... חחח).

מי יודע, אולי בפעם אחרת - אמשיך לכסות עוד מהנושא.

שיהיה בהצלחה!





לינקים רלוונטיים

ניתח הארכיטקטורה של Skylake באתר AnandTech

אם אתם רוצים המלצות על רכיבי חומרה ספציפיים, באתר Tomshardware, יש בעמוד הראשי section של Best Picks של רכיבים שנבחנו ע"י האתר ונמצאו כטובים במיוחד. הרשימות מתעדכנות כמעט על בסיס חודשי, אם כי לא תמיד יהיה קל למצוא כל את הדגמים שהם ממליצים עליהם בחנויות בארץ.



15 תגובות:

  1. אחלה של פוסט! תודה רבה! שבוע טוב!

    השבמחק
  2. פוסט מעולה!
    תרבות הארדואינו והPi גרמה לרבים לחזור גם לתחומי העניין האלו
    אגב, 80806 זה 8086 האהוב :)

    השבמחק
  3. אחד מהפוסטים החשובים שנכתבו. תודה!

    השבמחק
  4. אחלה תקציר! עבדתי עם רוב הדברים בפועל, אבל אף פעם לא קראתי סיכום כזה - זה מאוד עוזר לחבר בין הדברים ולראות את התמונה הכוללת. מומלץ לקרוא! :)

    השבמחק
  5. פוסט מצויין, תודה!
    יתכן ונפלה טעות במשפט הזה לגבי ה cache:
    "כאשר ה Cache הוא גדול יותר, ניתן לאחסן בו יותר נתונים אך החיפוש אחר ערכים (latency) - פוחת."
    ה latency לא קטן אלא גדל, זמן החיפש גדל ככל שנפח המטמון עולה.

    השבמחק
  6. אאל״ט יש סטנדרט בשם ATCA לבליידים של שרתים.
    וב-rack אפשר למצוא גם מתגים בתצורה של שאסי, לא רק storage.

    השבמחק
    תשובות
    1. מעניין, תודה רבה על התוספת!

      הנה קישור לתקן (https://goo.gl/3RfYU1).
      ידעתי שיהיו תוספות מהקוראים :)

      שוב תודה!

      מחק
  7. אחלה פוסט כרגיל כתוב טוב מעמיק ומסקרן

    השבמחק
  8. פוסט מעולה
    אוהב מאוד את הכתיבה שלך

    השבמחק
  9. הערה קטנה בנוגע למגבלת התדירות של המעבד: למיטב זכרוני, יש מגבלה פיסיקלית שקשורה לסיליקון, שלא מאפשרת לנו לעבור תדירות מסויימת. אני חושב שמדובר על 5.25 GHz, אבל אין לי סימוכין בנוגע למספר המדוייק.
    בעתיד, שבבים מחומרים אחרים יאפשרו לנו להגיע לתדירות עבודה גבוהה הרבה יותר, אבל העולם עוד "לא שם" (כיום הייצרנים מתרכזים בעיקר בהגדלת כמות הליבות).

    השבמחק
    תשובות
    1. תודה על ההערה.

      אני חושב שהעניין הוא בעיקר שמעבר ל 4 ומשהו Ghz צריכת החשמל עולה מאוד.
      אמעצי קירור אגרסיבים - מעלים עוד יותר את צריכת החשמל.

      אני לא מכיר את המגבלות הפיסיות המדוייקות, אך הנה מישהו שהגיע ל 5.7GHz בעזרת חנקן נוזלי - http://goo.gl/o4CMEE

      מחק