چارچوب زمانبندی کیفیت خدمات (QoS) SDV، تخصیص قطعی منابع CPU را برای بستههای خدماتی که توسط مدیر چرخه عمر (LM) مدیریت میشوند، فراهم میکند. این پلتفرم با خلاصه کردن ویژگیهای زمانبندی سطح پایین لینوکس (سیاست، اولویت، خوب) به پیشفرضهای منطقی، امکان جداسازی دقیق بین توسعه خدمات و تنظیم سیستم در سطح خودرو را فراهم میکند. این امر به تأمین پهنای باند محاسباتی لازم برای بارهای کاری حساس به ایمنی و حساس به زمان کمک میکند، در حالی که سیستم وظایف پسزمینه را برای جلوگیری از بیثباتی محدود میکند.
نقشها و مسئولیتها
مدل زمانبندی SDV از یک الگوی تفویض مسئولیت پیروی میکند تا اطمینان حاصل شود که سرویسها قابل حمل باقی میمانند و در عین حال به OEM اجازه میدهد سیستم را تنظیم کند.
| نقش | مسئولیت | کلید قابل تحویل |
|---|---|---|
| پلتفرم SDV (گوگل) | طرحواره sdv_service_bundles_scheduling.proto را تعریف میکند، منطق اجرای LM را پیادهسازی میکند و کتابخانه کلاینت sdv_service_bundles_scheduling ارائه میدهد. | تعاریف Protobuf و کتابخانههای پلتفرم |
| OEM (یکپارچهساز سیستم) | مقادیر مشخص برای هر پیشتنظیم، مانند معنای ELEVATED در سختافزار خاص، را تعریف میکند و پیکربندی کل سیستم را کنترل میکند. | /product/etc/lifecycle_config.textproto |
| توسعهدهنده خدمات | نام منطقی از پیش تعیینشدهی مناسب را انتخاب میکند و مسیر scheduling_config.textproto را در فایل مانیفست بستهی سرویس ثبت میکند. | scheduling_config.textproto و sdv_service_bundles_manifest.textproto |
گردش کار فنی
- یکپارچهسازی پلتفرم: تولیدکننده اصلی (OEM) فایل
lifecycle_config.textprotoمختص خودرو را تعریف میکند. این فایل، پروفایلهای زمانبندی (از پیش تنظیم شدهها) در سطح سیستم را ایجاد کرده و آنها را بر اساس سختافزار هدف، به ویژگیهای زمانبندی لینوکس نگاشت میکند. - توسعه بسته سرویس: توسعهدهنده یک
scheduling_config.textprotoرا در بسته APEX خود قرار میدهد، یک پیشتنظیم منطقی (مثلاًELEVATED) را پیشنهاد میدهد و نامهای نخ داخلی را تعریف میکند. - ادغام بسته خدمات: در طول مرحله ادغام خودرو، OEM تنظیمات از پیش تعیینشده پیشنهادی توسعهدهنده را بررسی میکند. OEM میتواند پروفایل پیشنهادی را حفظ کند یا آن را لغو کند، مانند کاهش سطح یک سرویس
ELEVATEDبهNORMAL، تا پایداری کلی سیستم را قبل از امضای APEX بهبود بخشد. - تفکیک ویژگی زمان اجرا: هنگامی که یک سرویس آغاز میشود، LM از پیش تعیینشدهی مجاز را از مانیفست سرویس شناسایی کرده و ویژگیهای لینوکس مربوطه را از پیکربندی سیستم OEM بازیابی میکند.
- همگامسازی و اجرای راهاندازی: LM ویژگیهای تعیینشده را قبل از ارسال سیگنال برای ادامه اجرا با استفاده از پروتکل signal-and-continue، به فرآیند سرویس اعمال میکند.
مفاهیم اصلی
مفاهیم زیر در چارچوب زمانبندی SDV نقش اساسی دارند.
زمانبندی از پیش تعیینشده
تنظیمات از پیش تعیینشدهی زمانبندی، سازوکار اصلی مدیریت QoS در SDV هستند. توسعهدهندگان به جای تعریف پارامترهای خام زمانبندی لینوکس، به تنظیمات از پیش تعریفشده با نام ارجاع میدهند. در زمان اجرا، LM این نامهای منطقی را به ویژگیهای زمانبندی لینوکس نگاشت میکند.
تنظیمات پیشفرض زیر به عنوان مثال در lifecycle_config.textproto پیکربندی شدهاند:
| نام از پیش تعیین شده | سیاست زمانبندی | ارزش خوب معمولی | مورد استفاده معمول |
|---|---|---|---|
NORMAL | SCHED_OTHER | 0 | خدمات استاندارد (سیستم تهویه مطبوع، رسانه، تنظیمات) |
ELEVATED | SCHED_OTHER | -10 | اجزای اصلی سیستم و زیرساخت |
IDLE | SCHED_IDLE | 19 | تجزیه و تحلیل پسزمینه و ثبت وقایع غیر بحرانی |
CUSTOM | تعریف شده توسط کاربر | -20 (اولیه) | خدماتی که نیاز به سیاستها یا وابستگی بلادرنگ دارند |
هنگام اعمال یک پیشتنظیم، LM از فراخوانی سیستمی setpriority برای تنظیم مقدار nice در کل فرآیند استفاده میکند. این امر بر سهم نسبی CPU که فرآیند در طول رقابت تحت زمانبند کاملاً منصفانه لینوکس (CFS) دریافت میکند، تأثیر میگذارد.
امتیاز و امنیت
برای جلوگیری از افزایش اولویت غیرمجاز، پلتفرم SDV از یک مدل امنیتی لایهای مبتنی بر دامنههای SELinux و قابلیتهای لینوکس استفاده میکند.
دامنههای امنیتی
-
untrusted_service_bundle: دامنه پیشفرض برای تنظیمات پیشفرض استاندارد (NORMAL،ELEVATED،IDLE). هسته، پردازشهای این دامنه را محدود میکند و مانع از تغییر پارامترهای زمانبندی آنها میشود. -
priority_service_bundle: به هر بسته سرویسی که از پیش تعیین شده باشد اعطا میشود، که در آنis_privileged: trueدرlifecycle_config.textprotoدر سطح سیستم تنظیم شده است. انتقال به این دامنه، قابلیتCAP_SYS_NICEرا به فرآیند اعطا میکند و به آن اجازه میدهد تخصیص منابع خود را مدیریت کند.
قابلیت CAP_SYS_NICE
این پلتفرم قابلیت CAP_SYS_NICE را به فرآیندهای موجود در دامنه priority_service_bundle اعطا میکند. این مجوز به یک فرآیند اجازه میدهد تا موارد زیر را انجام دهد:
- ارزش
niceخودش را فراتر از وظیفه اولیهاش ارتقا دهد. - سیاست زمانبندی آن را به کلاسهای بلادرنگ مانند
SCHED_FIFOیاSCHED_RRتغییر دهید. - با استفاده از
sched_setaffinityوابستگی CPU را تنظیم کنید. - پارامترهای مهلت ویژه برای
SCHED_DEADLINEرا پیکربندی کنید.
محدود کردن این قابلیت به یک دامنه اختصاصی، با محدود کردن اختلالات در سرویسهای دارای مجوز صریح، از تعادل زمانبندی در کل سیستم محافظت میکند.
راهنمای پیکربندی
این بخش، راهنماییهای پیکربندی را برای تولیدکنندگان اصلی تجهیزات (OEM) و توسعهدهندگان خدمات ارائه میدهد.
راهنمای OEM: تنظیمات از پیش تعیینشده در کل سیستم
تولیدکننده اصلی (OEM) پروفایلهای زمانبندی را در /product/etc/lifecycle_config.textproto تعریف میکند. این پلتفرم مثالی را در lifecycle_management/config/lifecycle_config.textproto ارائه میدهد که انتظار میرود تولیدکنندگان اصلی (OEM) آن را بر اساس سختافزار خودرو تنظیم کنند.
مثال: تعریف یک پیشتنظیم بلادرنگ
یک تولیدکننده تجهیزات اصلی (OEM) ممکن است یک پیشتنظیم CRITICAL برای سرویسهای مرتبط با ایمنی تعریف کند که هرگز نباید توسط برنامههای استاندارد نادیده گرفته شوند:
# lifecycle_config.textproto
scheduling_presets {
name: "CRITICAL"
is_privileged: true
thread_scheduling_configuration {
policy: 1 # SCHED_FIFO
priority: 80 # High real-time priority
}
}
راهنمای توسعهدهنده: پیکربندی بسته سرویس
توسعهدهندگان سرویس، نامهای رشتهای منطقی از پیش تعیینشده و اختیاری را در فایل scheduling_config.textproto توصیه میکنند. برای اینکه این فایل توسط پلتفرم شناسایی شود، مسیر آن باید در sdv_service_bundles_manifest.textproto ثبت شود.
مثال: ثبت مانیفست
# sdv_service_bundles_manifest.textproto
service_bundle_entries {
name: "SensorService"
scheduling_config_path: "configs/scheduling_config.textproto"
}
مثال: از یک پیشتنظیم استاندارد استفاده کنید
برای اکثر سرویسها، ارجاع به یک نام از پیش تعیینشده در scheduling_config.textproto کافی است:
# configs/scheduling_config.textproto
scheduling_preset_name: "ELEVATED"
مثال: زمانبندی برای نخهای کارگر تولید شده توسط سرویس
یک توسعهدهنده سرویس ممکن است رشتههای کاری اضافی را در کد خود ایجاد کند تا وظایف تخصصی مانند یک حلقه داده حسگر با تأخیر کم را مدیریت کند. توسعهدهنده میتواند ویژگیهای زمانبندی نامگذاریشده را برای این رشتههای داخلی در فایل پیکربندی تعریف کند.
فقط در سرویسهای ممتازی که از این فراداده برای تنظیم ویژگیهای نخهای کارگر داخلی خود استفاده میکنند، از اعمال دستی استفاده کنید:
# configs/scheduling_config.textproto
scheduling_preset_name: "CUSTOM"
# Map of logical thread names to their attributes (propagated as metadata)
thread_scheduling_configuration {
key: "sensor-processing-thread"
value {
policy: 1 # SCHED_FIFO
priority: 50
cpu_affinity_ids: [2, 3] # Pin to specific cores
}
}
رفتار سیستم و اجرای آن
پلتفرم SDV از یک مدل اجرایی سختگیرانه برای فعال کردن پیکربندیهای زمانبندی قبل از اجرای هرگونه کد مختص سرویس استفاده میکند.
همگامسازی راهاندازی
برای جلوگیری از اجرای یک سرویس با اولویت نادرست (حتی در مرحله مقداردهی اولیه)، LM و Service Bundle Runner (SBR) از یک پروتکل همگامسازی signal-and-continue استفاده میکنند:
- ایجاد فرآیند: LM فرآیند SBR را منشعب میکند. در این مرحله، فرآیند فرزند SBR در حال اجرا است اما بلافاصله وارد حالت مسدود شده میشود و منتظر سیگنالی از
stdinخود میماند. - کاربرد ویژگی: در حالی که فرزند مسدود شده است، LM از فراخوانی سیستمی
setpriorityبرای اعمال مقدارniceدرخواستی استفاده میکند و سیاست زمانبندی (برای مثال،SCHED_IDLE) را پیکربندی میکند. - انتقال امنیتی: LM انتقال دامنه SELinux را انجام میدهد و فرزند را به دامنه
untrusted_service_bundleیاpriority_service_bundleمنتقل میکند. - سیگنال: تنها پس از اعمال موفقیتآمیز همه پارامترها، LM یک سیگنال تکبایتی به
stdinفرزند ارسال میکند. - اجرا: SBR سیگنال را دریافت میکند و شروع به بارگذاری کتابخانههای سرویس و فراخوانی متدهای چرخه حیات میکند.
تأثیر بر نخ اصلی و چرخه حیات
با همگامسازی قبل از بارگذاری کتابخانههای سرویس، پلتفرم اولویت درخواستی برای نخ اجرایی اصلی را در تمام فراخوانیهای چرخه عمر حفظ میکند:
-
onCreate: تمام تزریق وابستگیها و تخصیص اولیه منابع با اولویت صحیح انجام میشوند. -
onStart: این پیشتنظیم، انتقال به حالت فعال و هرگونه حلقه کاری اولیه را کنترل میکند. -
onStopوonDestroy: این پلتفرم عملیات پاکسازی را با اولویت یکسان انجام میدهد تا از اتلاف فعالیتهای حیاتی سیستم در هنگام خاموش شدن جلوگیری کند.
مخزن نخهای اتصالدهنده و وراثت اولویتدار
نخهای موجود در مخزن نخهای Binder که توسط پلتفرم مدیریت میشوند، کار را با اولویت نخی که مخزن را ایجاد کرده است، اجرا نمیکنند. در عوض، برای تراکنشهای همزمان، نخ سرور اولویت فراخواننده را به ارث میبرد. درایور هسته Binder این مکانیسم ارثبری اولویت را کنترل میکند.
تنظیم دقیق در سطح نخ
بستههای خدماتی که نیاز به کنترل جزئی دارند (برای مثال، حلقههای پردازش بلادرنگ) باید پیکربندیها را به صورت دستی روی نخهای کارگر خود اعمال کنند. برای اعمال پیکربندیهای سطح نخ، از مراحل زیر استفاده کنید:
- درخواست یک پیشتنظیم ممتاز (که در آن
is_privileged: trueتنظیم شده است). - برای خواندن
thread_scheduling_configurationاز تابعget_scheduling_configurationاز کتابخانهsdv_service_bundles_schedulingاستفاده کنید. - با استفاده از
sched_setattrویژگیها را به نخهای کارگر اعمال کنید.
SELinux و اجرای قابلیتها
این پلتفرم از SELinux و قابلیت CAP_SYS_NICE لینوکس برای اعمال تنظیمات از پیش تعیینشدهی زمانبندی استفاده میکند:
- برای سرویسهایی که از تنظیمات پیشفرض مانند
NORMALیاIDLEاستفاده میکنند، زمانبندی توسط LM در هنگام راهاندازی پیکربندی میشود. این سرویسها قابلیتCAP_SYS_NICEرا ندارند و نمیتوانند اولویت یا سیاست خود را تغییر دهند. - سرویسهایی که از یک پیشتنظیم ممتاز (
is_privileged: true) استفاده میکنند، قابلیتCAP_SYS_NICEرا دریافت میکنند. این قابلیت به آنها اجازه میدهد تا زمانبندی نخهای داخلی خود را، همانطور که برای وظایف بلادرنگ مورد نیاز است، به صورت دستی کنترل کنند.
تأیید و نمونهها
تأیید رفتار زمانبندی نیازمند ترکیبی از تحلیل لاگ و اندازهگیری عملکرد در سطح سیستم است. پلتفرم SDV یک نمونه اختصاصی برای نمایش این تکنیکها ارائه میدهد.
نمونه زمانبندی QoS
این نمونه که در samples/qos_scheduling قرار دارد، شامل چندین سرویس تست عملکرد است که برای اجرا به صورت موازی و گزارش پیشرفت خود طراحی شدهاند.
-
PerformanceTesterNormal: با تنظیمات پیشفرضNORMALاجرا میشود. -
PerformanceTesterElevated: با تنظیمات پیشفرضELEVATEDاجرا میشود. -
PerformanceTesterRealtime: از تنظیمات پیشفرضCUSTOMبرای اعمالSCHED_FIFOبه نخهای کارگر داخلی خود استفاده میکند. -
PolicyOffender: یک سرویس تشخیصی که تلاش میکند با استفاده از یک پیشفرضNORMALاولویت بلادرنگ را تعیین کند. این سرویس برای تأیید اینکه پلتفرم با موفقیت افزایش غیرمجاز را مسدود میکند، استفاده میشود.
مجموعه تأیید را اجرا کنید
پیکربندی هماهنگسازی مختص QoS را فعال کنید:
adb shell setprop persist.sdv.orchestrator_config_path /etc/orch/vm_qos_scheduling_orch_config.textprotoدستگاه را مجدداً راهاندازی کنید تا سرویسها در دامنههای زمانبندی مربوطه شروع به کار کنند:
adb rebootبرای مشاهده نتایج مقایسهای عملکرد، لاگها را فیلتر کنید:
adb logcat | grep sdv_sample_qos_commonسرویس
PerformanceTesterElevatedدر مقایسه باPerformanceTesterNormalواحدهای کاری تکمیلشدهی بهطور قابلتوجهی بیشتری را گزارش میدهد. خطاهای انکارEPERMیا SELinux در گزارشهای سرویسPolicyOffenderگنجانده شدهاند.
سازگاری با نسخههای قبلی
- برای سازگاری با نسخههای قبلی، هر بسته سرویس قدیمی که در مانیفست خود
scheduling_config_pathمشخص میکند اما در فایل پیکربندیscheduling_preset_nameمشخص نمیکند ، به طور خودکار به عنوان یک سرویس ممتاز در نظر گرفته میشود. این امر قابلیتهای لازم (به عنوان مثال،CAP_SYS_NICE) را برای سرویسهای قدیمیتر که به تنظیم دستی نخ متکی هستند، حفظ میکند. - پیام پیکربندی ریشه با عنوان
DeadlineSchedulingConfigurationis scheduled to change in a future release» در نسخه آینده تغییر نام خواهد داد. نام فعلی قدیمی است و دیگر به طور دقیق نشان نمیدهد که این پیام همه انواع زمانبندی، و نه فقط زمانبندی مهلت، را مدیریت میکند.