در این صفحه نحوه بررسی میزان ضربه حافظه پنهان و نحوه بررسی عدم دسترسی به حافظه پنهان در زمینه اجرای از راه دور توضیح داده شده است.
این صفحه فرض می کند که شما یک ساخت و/یا آزمایشی دارید که با موفقیت از اجرای از راه دور استفاده می کند، و می خواهید مطمئن شوید که به طور موثر از حافظه پنهان از راه دور استفاده می کنید.
بررسی نرخ ضربه حافظه پنهان
در خروجی استاندارد اجرای Bazel خود، به خط INFO
نگاه کنید که فرآیندها را فهرست می کند، که تقریباً با اقدامات Bazel مطابقت دارد. آن خط جزئیات محل اجرای اکشن را نشان می دهد. به دنبال برچسب remote
بگردید، که یک عمل اجرا شده از راه دور، linux-sandbox
را برای اقدامات اجرا شده در جعبه ایمنی محلی، و مقادیر دیگر را برای سایر استراتژیهای اجرایی نشان میدهد. عملی که نتیجه آن از یک حافظه پنهان از راه دور حاصل شده است به عنوان remote cache hit
نمایش داده می شود.
مثلا:
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
در این مثال 6 ضربه کش از راه دور وجود داشت و 2 اکشن بازدید از حافظه پنهان نداشتند و از راه دور اجرا شدند. 3 قسمت داخلی را می توان نادیده گرفت. این معمولاً اقدامات داخلی کوچکی است، مانند ایجاد پیوندهای نمادین. بازدیدهای حافظه پنهان محلی در این خلاصه گنجانده نشده است. اگر 0 فرآیند دریافت می کنید (یا تعداد کمتر از حد انتظار)، bazel clean
و سپس دستور ساخت/تست خود را اجرا کنید.
عیب یابی بازدیدهای حافظه پنهان
اگر نرخ ضربه کش مورد انتظار را دریافت نمی کنید، موارد زیر را انجام دهید:
اطمینان حاصل کنید که اجرای مجدد همان دستور ساخت/تست باعث ایجاد بازدید در حافظه پنهان می شود
ساخت(ها) و/یا تست(هایی) را که انتظار دارید کش را پر کند اجرا کنید. اولین باری که یک بیلد جدید روی یک پشته خاص اجرا میشود، نمیتوانید انتظار داشته باشید که کش از راه دور مورد بازدید قرار نگیرد. به عنوان بخشی از اجرای از راه دور، نتایج عملیات در حافظه پنهان ذخیره میشوند و اجرای بعدی باید آنها را انتخاب کند.
bazel clean
اجرا کنید. این دستور کش محلی شما را پاک می کند، که به شما امکان می دهد تا بازدیدهای حافظه پنهان از راه دور را بدون اینکه نتایج توسط بازدیدهای حافظه پنهان محلی پوشانده شود، بررسی کنید.ساخت(های) و تست(هایی) که در حال بررسی آن هستید را مجددا اجرا کنید (روی همان ماشین).
خط
INFO
را برای نرخ ضربه حافظه پنهان بررسی کنید. اگر هیچ پردازشی به جزremote cache hit
وinternal
نمی بینید، کش شما به درستی پر شده و به آن دسترسی پیدا می کند. در این صورت به بخش بعدی بروید.یک منبع احتمالی ناسازگاری، چیزی غیرهرماتیک در ساخت است که باعث میشود اکشنها کلیدهای عمل متفاوتی را در دو اجرا دریافت کنند. برای یافتن این اقدامات، موارد زیر را انجام دهید:
آ. برای به دست آوردن گزارش های اجرایی، ساخت(ها) یا تست(های) مورد نظر را مجددا اجرا کنید:
bazel clean
bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
ب گزارش های اجرا را بین دو اجرا مقایسه کنید. اطمینان حاصل کنید که اقدامات در دو فایل گزارش یکسان هستند. اختلافات سرنخی در مورد تغییراتی که بین اجراها رخ داده است ارائه می دهد. برای از بین بردن این اختلافات، ساخت خود را به روز کنید.
اگر میتوانید مشکلات حافظه پنهان را حل کنید و اکنون اجرای مکرر تمام ضربههای کش را ایجاد میکند، به بخش بعدی بروید.
اگر شناسههای اکشن شما یکسان هستند اما هیچ ضربهای به حافظه پنهان وجود ندارد، پس چیزی در پیکربندی شما مانع از ذخیرهسازی میشود. برای بررسی مشکلات رایج، این بخش را ادامه دهید.
اگر نیازی به تفاوت لاگ های اجرا ندارید، می توانید به جای آن از پرچم
--execution_log_json_file
قابل خواندن توسط انسان استفاده کنید. نمی توان از آن برای تغییر پایدار استفاده کرد زیرا دارای زمان اجرا است و سفارش را تضمین نمی کند.بررسی کنید که تمام اقدامات در گزارش اجرا دارای قابلیت ذخیره سازی روی
cacheable
باشد. اگرcacheable
در گزارش اجرا برای یک اکشن داده نمیشود، به این معنی است که قانون مربوطه ممکن است یک برچسبno-cache
در فایلBUILD
داشته باشد. به فیلدprogress_message
قابل خواندن توسط انسان در گزارش اجرا نگاه کنید تا تعیین کنید که این عمل از کجا انجام می شود.اگر اکشنها یکسان و
cacheable
ذخیرهسازی هستند، اما هیچ بازدیدی از حافظه پنهان وجود ندارد، ممکن است خط فرمان شما شامل--noremote_accept_cached
که جستجوهای کش را برای یک ساخت غیرفعال میکند.اگر تشخیص خط فرمان واقعی دشوار است، از خط فرمان متعارف از پروتکل Build Event به صورت زیر استفاده کنید:
آ.
--build_event_text_file=/tmp/bep.txt
را به دستور Bazel خود اضافه کنید تا نسخه متنی گزارش را دریافت کنید.ب نسخه متنی گزارش را باز کنید و پیام
structured_command_line
را باcommand_line_label: "canonical"
جستجو کنید. تمام گزینه ها را پس از گسترش فهرست می کند.ج
remote_accept_cached
را جستجو کنید و بررسی کنید که آیا رویfalse
تنظیم شده است یا خیر.د اگر
remote_accept_cached
false
است، تعیین کنید که کجا رویfalse
تنظیم شده است: در خط فرمان یا در فایل bazelrc .
از ذخیره سازی در دستگاه ها اطمینان حاصل کنید
پس از اینکه بازدیدهای حافظه نهان همانطور که انتظار می رود در یک دستگاه اتفاق افتاد، همان ساخت(ها)/تست(ها) را در دستگاه دیگری اجرا کنید. اگر مشکوک هستید که کش کردن در دستگاهها انجام نمیشود، موارد زیر را انجام دهید:
برای جلوگیری از ضربه زدن به حافظه پنهان موجود، یک اصلاح کوچک در ساخت خود ایجاد کنید.
بیلد را روی اولین ماشین اجرا کنید:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
ساخت را بر روی ماشین دوم اجرا کنید، مطمئن شوید که اصلاحات مرحله 1 گنجانده شده است:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
گزارش های اجرا را برای دو اجرا مقایسه کنید. اگر گزارشها یکسان نیستند، پیکربندیهای ساخت خود را از نظر مغایرتها و همچنین ویژگیهای محیط میزبان که به هر یک از ساختها نشت میکند، بررسی کنید.
مقایسه لاگ های اجرایی
گزارشهای اجرایی حاوی سوابقی از تمام اقدامات اجرا شده در طول ساخت هستند. برای هر عمل یک عنصر SpawnExec وجود دارد که حاوی تمام اطلاعات از کلید اقدام است، بنابراین، اگر گزارش ها یکسان هستند، کلیدهای حافظه پنهان عمل نیز مشابه هستند.
برای مقایسه گزارشها برای دو بیلد که طبق انتظار، بازدیدهای کش را به اشتراک نمیگذارند، موارد زیر را انجام دهید:
گزارش های اجرایی را از هر بیلد دریافت کنید و آنها را به صورت
/tmp/exec1.log
و/tmp/exec2.log
کنید.کد منبع Bazel را دانلود کرده و با استفاده از دستور زیر به پوشه Bazel بروید. برای تجزیه لاگ های اجرا با تجزیه کننده execlog به کد منبع نیاز دارید.
git clone https://github.com/bazelbuild/bazel.git cd bazel
از تجزیه کننده گزارش اجرا برای تبدیل لاگ ها به متن استفاده کنید. فراخوانی زیر نیز برای سهولت مقایسه، اقدامات در گزارش دوم را برای مطابقت با ترتیب عملکرد در گزارش اول مرتب می کند.
bazel build src/tools/execlog:parser bazel-bin/src/tools/execlog/parser \ --log_path=/tmp/exec1.log \ --log_path=/tmp/exec2.log \ --output_path=/tmp/exec1.log.txt \ --output_path=/tmp/exec2.log.txt
از متن دلخواه خود برای تفاوت
/tmp/exec1.log.txt
و/tmp/exec2.log.txt
استفاده کنید.