مهندس خطی، مفیض امجد، گزارش مفصلی از چگونگی بازسازی خط لوله ادغام مداوم این شرکت پس از اینکه عوامل کدگذاری هوش مصنوعی CI را به بدترین گلوگاه خود تبدیل کردند، منتشر کرده است - کاهش زمان انتظار درخواست کشش از بیش از شش دقیقه به کمی بیش از پنج در حالی که مجموعه های آزمایشی آن از ابتدای سال تقریباً چهار برابر شده است.
پستی که در 21 سپتامبر در وبلاگ مهندسی Linear منتشر شد، همانطور که اغلب این کارها انجام می دهند، با یک بلیط کوتاه از بالا شروع شد. اوایل امسال، امجد Linear را باز کرد و متوجه شد که توماس، مدیر ارشد فناوری شرکت، شمارهای را با عنوان «هزینههای CI زیاد است» به او اختصاص داده است - و از او خواست تا زمانی که در این زمینه است، CI را سریعتر بسازد. برای زمینه بیشتر در مورد این داستان، [پوشش صنعت هوش مصنوعی] (https://aibuzzwire.news) را ببینید.
وقتی عامل ها از اعتبارسنجی پیشی می گیرند
مشکل ساختاری است نه تصادفی. امجد نوشت: «نمایندگان ارسال کد را به صورت تصاعدی سریعتر کردهاند، اما اعتبارسنجی این تغییرات به همان میزان ادامه پیدا نکرده است». هر درخواست کششی همچنان باید از طریق CI بگذرد، بنابراین با تسریع توسعه، CI به نقطه اختناق تبدیل میشود - هزینههای زیرساخت را بالا میبرد و توسعهدهندگان و عوامل آنها را برای مدت طولانیتری منتظر بازخورد میگذارند.
بهینهسازی خطی برای دو معیار: مدت زمانی که یک PR در CI منتظر میماند و زمان دونده چقدر مصرف میکند. نتایج پس از ماهها کار: علیرغم اینکه مجموعههای آزمایشی از ژانویه تقریباً چهار برابر شدهاند، زمان انتظار درخواست کشش از بیش از شش دقیقه به کمی بیش از پنج کاهش یافت و زمان دونده در هر آزمون تقریباً به نصف کاهش یافت.
این کار به طور کلی به چهار دسته تقسیم میشود: زیرساختهای ارتقا یافته و ابزارسازی، بهینهسازی مشاغلی که به سایر کارها دسترسی پیدا میکنند، تنظیم مکرر کاهش مییابد، و اجرای آزمایش را کارآمدتر میکند. پایگاه کد Linear در درجه اول TypeScript است، اما بسیاری از بهینه سازی ها در سراسر زبان ها و زنجیره های ابزار اعمال می شود.
ماشین های سریعتر و یک کامپایلر بومی
برخی از اولین دستاوردها تقریباً نیازی به بهینه سازی خود CI نداشتند. انتقال بارهای کاری از GitHub Actions به اجراکنندگان شخص ثالث با پردازندههای سریعتر، فضای ذخیرهسازی با عملکرد بالاتر، و زیرساخت حافظه پنهان بهتر، بلافاصله جواب داد: در مقایسهای مشابه در دو روز دو طرف سوییچ، کارها به طور متوسط 34 درصد سریعتر اجرا شدند و برخی از بارهای کاری مانند «tsc» 52 درصد کاهش یافت.
مدرنسازی زنجیره ابزار، این پیروزی را تشدید کرد. با تغییر به «tsgo»، کامپایلر اصلی TypeScript، میانه هفتگی تایپ چک را 73 درصد کاهش داد - به اندازه ای بزرگ که گلوگاه را به طور کامل از تایپ چک کردن خارج کند.
لینتینگ بدون گراف نوع
لینتینگ یکی دیگر از اهداف اولیه بود. تعداد انگشت شماری از قوانین ESLint سفارشی Linear به اطلاعات نوع TypeScript وابسته بودند، که هر پریز را مجبور میکرد قبل از ارزیابی، نمودار نوع کامل را بسازد – که باعث میشود پردهبندی به یکی از پرحافظهترین کارهای CI تبدیل شود.
این تیم قوانین را برای استفاده از تجزیه و تحلیل ایستا بر روی درخت نحو انتزاعی، شناسایی ساختارهای تابع مانند و الگوهای محافظ بدون هیچ گونه اطلاعات نوع، بازنویسی کردند. این به ESLint اجازه می دهد تا TypeScript را به طور کامل حذف کند و زمان پرز API را تا 68٪ و زمان پر کردن مخزن کامل را تا 55٪ کاهش دهد و مصرف حافظه به میزان قابل توجهی کاهش یابد. همچنین مهاجرت بعدی به Oxlint را کاهش داد، که باعث کاهش بیشتر دقیقههای دونده CI برای پرز زدن شد.
کوچک کردن مسیر بحرانی
با بررسیهای فردی سریعتر، Linear کوچکنمایی کرد و CI را بهعنوان یک سیستم در نظر گرفت. این امر توجه را به کارهای کوچکی که در مقابل هر چیز دیگری قرار دارند جلب کرد - تشخیص تغییر مسیر و کش نتایج آزمایش آن دروازه در سطح کار را بررسی می کند، به این معنی که هیچ یک از هشت قطعه تست API نمی توانند تا زمانی که به پایان برسند شروع شوند.
رفع گرانول اما افزودنی بود. پوشش عمق واکشی کندترین گیت را از 94 ثانیه به 20 ثانیه رساند. حذف کامل پرداخت از مشاغلی که هرگز به درخت کاری نیاز نداشتند، آن ها را از 27 ثانیه به 7 کاهش داد. تسویه حساب پراکنده و بدون لکه با سابقه محدود، 11 ثانیه دیگر را برای رویدادهای فشار و صف ادغام ذخیره کرد. در مجموع، میانگین مدت کار تشخیص تغییر از 26 ثانیه به 8، p90 آن از 31 به 12، و کندترین زمان آن از 138 ثانیه به 37 کاهش یافت.
قابلیت اطمینان تسویه حساب نیز به کار نیاز داشت: از آنجا که رانرهای شخص ثالث خارج از شبکه GitHub می نشینند و به یک پیوند IP مستقیم متکی هستند، تخریب متناوب پیوند گاهی اوقات واکشی را متوقف می کند. Linear «اقدامات/پرداخت» را با کنش ترکیبی خود جایگزین کرد که با بازگشت مجدد دوباره تلاش میکند، «GIT_HTTP_LOW_SPEED_LIMIT» و «GIT_HTTP_LOW_SPEED_TIME» را تنظیم میکند، بنابراین یک اتصال متوقف شده بهجای قطع کردن، پس از حدود 30 ثانیه قطع میشود، و از یک بسته خطای بازپرداخت استفاده میکند.
یک راه حل ظریف زمان تلف شده صف ادغام را حذف کرد: نشانگرهای کش به عنوان بخشی از بررسی نهایی قبل از ادغام نوشته می شدند، بنابراین یک PR می توانست حتی پس از گذراندن آزمایشاتش در صف بنشیند. انتقال آن نوشته به یک کار غیر دروازه ای، 42 ثانیه از مسیر ادغام برای هر درخواست کشش API و ورود به صف ادغام حذف می شود. با هم، این تغییرات تقریباً یک دقیقه از بررسیهای لازم برای API PR در مورد از دست دادن حافظه پنهان در حالی که شروعهای دونده را کاهش میدهند، طول کشید.
ثانیه های تلف شده کمتر در هر کار
هزینه راهاندازی آخرین دسته مورد حمله قرار گرفت که در هر کار تکرار میشود. هر قطعه تست API 7 تا 8 ثانیه را صرف نصب همان سرویس گیرنده Postgres با apt در هر اجرا کرد. انتقال آن به یک تصویر پایه CI کوچک در کنار Node به این معنی بود که خردهها میتوانند آماده اجرا شوند. تیم بعداً پس از اینکه دریافتند که دانلود آنها در حین راهاندازی گاهی اوقات ممکن است هدر پیدا کند، هدرهای ساخت بومی را به تصویر اضافه کردند.
چرا طنین انداز شد
این پست باعث ناراحتی توسعه دهندگان شد: به صفحه اول هکر نیوز رسید و تقریباً 250 امتیاز و حدود 280 نظر در یک روز به خود اختصاص داد. توضیح این واکنش آسان است – تجربه Linear هزینه توسعه به کمک هوش مصنوعی را نام میبرد که اکثر سازمانهای مهندسی اکنون با آن مواجه هستند. عواملی که درخواستهای کشش را در چند دقیقه ایجاد میکنند همچنان در خطوط لوله اعتبارسنجی طراحیشده برای آهنگ انسان منتظر میمانند و هر دقیقه از این انتظار در هر عاملی که به طور موازی کار میکند ضرب میشود.
درسی که از کار مجدد Linear گرفته می شود این است که گلوگاه متحرک است، اما تنها از طریق تجمع غیر جذاب بسیاری از اصلاحات کوچک - به جای هر گلوله نقره ای منفرد - دونده های سریع تر، چک های تایپ ارزان تر، قوانین پرز در سطح نحو، واکشی های درپوش دار، پرداخت های انعطاف پذیر، تصاویر از پیش ساخته شده - به جای هر گلوله نقره ای.
---
از هوش مصنوعی جلوتر بمانیدآخرین اخبار، تحلیل ها و پیشرفت های هوش مصنوعی را دریافت کنید - همه در یک مکان.
بیشتر بخوانید اخبار هوش مصنوعی →