ממשק API של Compute Pressure

מקבלים מידע על עומס העיבוד במערכת.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

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

הסטטוס הנוכחי

שלב סטטוס
1. יצירת הסבר הושלם
2. יצירת טיוטה ראשונית של המפרט הושלם
3. איסוף משוב וביצוע שינויים בעיצוב בתהליך
4. גרסת מקור לניסיון הושלם
5. השקה הושלם (Chrome 125)

התנסות עם Compute Clickure API

כדי להתנסות ב-Compute Pressure API באופן מקומי, אפשר לקרוא את הדף הזה.

הרשמה לגרסת המקור לניסיון

החל מגרסה 115 של Chrome, Compute לחץure API זמין כגרסת מקור לניסיון. התמיכה צפויה להסתיים בגרסה 123 של Chrome (29 במאי 2024). נרשמים לגרסת המקור לניסיון.

תרחישים לדוגמה

תרחישים לדוגמה שבהם אפשר ליהנות מהשיפורים של Compute Pressure API הנוכחי הם שיחות ועידה בווידאו ומשחקי וידאו.

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

המטרה של הגרסה הראשונה של ה-API הזה היא לאפשר את ההחלטות הבאות בנוגע להתאמה.

שיחת ועידה בווידאו

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

משחקי וידאו

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

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

ממשקים

אפשר להריץ את Compute Pressure API בהקשרים הבאים:

  • חלון או thread ראשי
  • עובד ייעודי
  • עובד משותף

ב-Compute Pressure API מוגדרים שני ממשקים חדשים.

PressureObserver: אובייקט למעקב אחרי עומס המחשוב של מספר כלשהו של מקורות במרווח דגימה מוגדר מראש. האיטרציה הראשונה ב-Chromium חושפת את "cpu" בתור source. פרטים נוספים זמינים בקטע פרמטרים. כל משתמש יכול לצפות באופן אסינכרוני במגמות של שינויי לחץ במערכת.

PressureRecord: מתאר את מגמת הלחץ ברגע ספציפי של מעבר. אפשר להשיג אובייקטים מהסוג הזה רק בשתי דרכים: כקלט לקריאה חוזרת (callback) של ClickureObserver, או באמצעות קריאה ל-method takeRecords() במכונה PressureObserver.

PressureObserver

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

יצרן

PressureObserver(callback): יצירת אובייקט PressureObserver חדש שיפעיל פונקציית קריאה חוזרת (callback) מסוימת כשיזהה שינוי בערכים של המקור שנמצא במעקב.

ה-constructor מקבל פונקציית callback חובה.

התקשרות חזרה

callback(): הקריאה החוזרת (callback) מתבצעת עם מערך של אובייקטי PressureRecord שלא נקראו.

שיטות

PressureObserver.observe(source, options): מגדיר ל-PressureObserver איזה מקור צריך לעקוב אחריו, וגם את הפרמטר האופציונלי options.

אפשרויות

PressureObserverOptions: מכיל את מרווח הדגימה, sampleInterval באלפיות שנייה, שבו המשתמש מבקש עדכונים.

PressureObserver.unobserve(source): הפקודה הזו מורה ל-PressureObserver להפסיק לעקוב אחרי מקור.

PressureObserver.disconnect(): מורה ל-'ClickureObserver' להפסיק לצפות בכל המקורות.

PressureObserver.takeRecords(): הפונקציה מחזירה רצף של רשומות, מאז ההפעלה האחרונה של הפונקציה החוזרת.

static PressureObserver.knownSources() (לקריאה בלבד): החזרת סוגי המקור הידועים של סוכן המשתמש בסדר אלפביתי.

פרמטרים

source: המקור שרוצים לבדוק, לדוגמה "cpu". הוא צריך להיות אחד מסוגי המקורות הנתמכים.

בגרסה הנוכחית של Compute Pressure יש תמיכה רק ב-"cpu".

PressureRecord

הממשק PressureRecord של Compute Pressure API מתאר את מגמת הלחץ של מקור מסוים ברגע מעבר ספציפי.

מאפייני המכונה

PressureRecord.source (לקריאה בלבד): מחזירה מחרוזת שמייצגת את מקור המקור שממנו הרשומה מגיעה.

PressureRecord.state (לקריאה בלבד): מחזירה מחרוזת שמייצגת את מצב הלחץ שתועד.

PressureRecord.time (לקריאה בלבד): מחזירה מספר שמייצג חותמת זמן ברזולוציה גבוהה.

דוגמאות

בקטעים הבאים מפורטות דוגמאות לדוגמה לשימוש.

בדיקת התמיכה ב-API

if ('PressureObserver' in globalThis) {
  // The Compute Pressure API is supported.
}

יצירת משתנה למעקב אחרי לחץ

כדי ליצור את הצופה בלחץ, שולחים קריאה ל-constructor שלו עם פונקציית קריאה חוזרת שתרוץ בכל פעם שיש עדכון לחץ:

const observer = new PressureObserver((records) => {
  /* ... */
});

שימוש במעקב אחר לחץ

יש רק דרך אחת להפעיל משבצות מעקב לחץ. לכל מקור, צריך לבצע את הקריאה observer.observe(source).

observer.observe("cpu" { sampleInterval: 2_000 });

בדוגמה הזו, "cpu" הוא מקור הלחץ שאנחנו מתעניינים בו. נכון לעכשיו, זה המקור היחיד שזמין. בעתיד, יכול להיות שיהיו מקורות אחרים, כמו "gpu",‏ "power" או "thermals".

אם מרווח הדגימה, sampleInterval, הוא 2,000 אלפיות השנייה, המשמעות היא שתתבצעו עדכונים כל שתי שניות.

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

כדי להפסיק את המעקב אחרי מקור, משתמשים בשיטה unobserve(), כמו בדוגמה הבאה:

observer.unobserve('cpu');

כדי לבטל את המעקב אחרי כל המקורות בבת אחת, משתמשים בשיטה disconnect(), כמו בדוגמה הבאה:

observer.disconnect();

אחזור של רשומות לחץ

אפשר לאחזר רשומות של לחץ באמצעות פונקציית קריאה חוזרת (callback), שתופעל בכל פעם שמתבצע שינוי במצב הלחץ.

function callback(records) {
  const lastRecord = records[records.length - 1];
  console.log(`Current pressure ${lastRecord.state}`);
  if (lastRecord.state === 'critical') {
    // Reduce workers load by 4.
  } else if (lastRecord.state === 'serious') {
    // Reduce workers load by 2.
  } else {
    // Do not reduce.
  }
}

const observer = new PressureObserver(callback);
await observer.observe('cpu', { sampleInterval: 1_000 });

המשתמש יכול גם לאלץ את הקריאה של PressureRecord על ידי קריאה לשיטה takeRecords().

ה-method takeRecords() בממשק PressureObserver מחזירה מערך של אובייקטים מסוג PressureRecords שמאוחסנים בתצפית הלחץ, ומתרוקנת.

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

קריאה ל-method הזה מנקה את רשימת הרשומות שבהמתנה, כך שהקריאה החוזרת לא תפעל.

const observer = new PressureObserver((records) => {
  /* Do something with records. */
});

await observer.observe('cpu', { sampleInterval: 1_000 });

setTimeout(() => {
  // Forced records reading.
  const records = observer.takeRecords();
  observer.disconnect();
  // Do something with last records if any.
}, 2000);

שיתוף משוב

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

דיווח על בעיה בהטמעה

מצאת באג בהטמעה של Chromium? או שההטמעה שונה מהמפרט? מדווחים על באג בכתובת new.crbug.com. חשוב לכלול כמה שיותר פרטים, הוראות לשחזור, ולהזין Blink>PerformanceAPIs>ComputeInfoure בתיבה רכיבים.

משאבים