اگر با سیستمهای آسینک (asynchronous) کار کرده باشین، میدونین که یه گلوگاهی که در این سیستمها وجود داره طولانی شدن پردازش تسکهاست و حتی ممکنه نتیجهای برای اون تسک برنگرده؛ مثالش فریز شدن مموری موقع کار با ماژول multiprocessing پایتون(باگ معروف)
توی تجربهای که من داشتم لازم بود همهی پروسهها از نظر زمان اجرا، مصرف رم و سیپییو مانیتور بشه. درمورد اون مسئلهی خاص فریز شدن مموری که بالا اشاره کردم چیزی نمیگم چون موارد اینچنینی رو میشه راهحلهای دیگهای براش پیاده کرد.
ابزارهای لازم:
خب فرض کنین پایپلاینی داریم که تعدادی جاب درش اجرا میشه. جابها رو سینگلترد در نظر میگیریم؛ مثلا اگه در عمل پروسه مالتیترد دارین، بچههای ایجاد شده داخل پروسه رو در نظر میگیریم. هر جاب رو با توجه به کاری که میکنه یک اسم(key string) براش کنار میذاریم.
گفتیم که میزان مصرف رم و سیپییو رو میخواهیم دربیاریم. من به جز کامند ps (در سیستم عامل لینوکس) روشی ندیدم که اطلاعات لحظهای یه پروسه رو بده. شناسهی یک پروسه، آیدی اون پروسه هست؛ پس وقتی برنامه وارد یه پروسه میشه، آیدی(pid) اون پروسه رو میگیم ذخیره کنه. در کجا؟
جواب: هش ردیس. به ازای key اون جاب، مقدار pid رو براش ذخیره میکنیم.
در ادامه برای حفظ ترتیب جابهای انجام شده، از sorted set ردیس استفاده میکنیم و اسم اون جاب(key) رو به ست اضافه میکنیم. کد زیر گویاست:
def stash_job(job: str, pid: int): redis_connector = RedisConnector() redis_connector.set_value(job, pid) redis_connector.push_job(job) # adds job to sorted set with current timestamp
پس اتفاقی که در شروع یه پروسه میافته، ذخیره کردن اسم و شناسهی اون پروسهست.
حالا چطوری اطلاعات مربوط به پروسهها رو درمیاریم؟ با یه اسکریپت که همیشه در حال خوندن صف جابهاست و با استفاده از شناسهی اون جاب، اطلاعات مربوط بهش رو از سیستم عامل میگیره؛ میده به متریک Gauge که در اداپتر پرومتیوس قبلا تعریف شده. بقیهی کارها برای خوندن این اطلاعات توسط گرافانا، با node exporterای که روی ماشین نصب شده انجام میشه. فقط حواستون به درستی کد اون اسکریپت باشه که بعدا نخواد point of failure سیستم بشه و بیمانیتور بشید :))