بعد از مدتها سلام.
سلام رسول جان، خوش برگشتی. خیلی خوشحال شدم دیدم دوباره تو فروم داری فعالیت می کنی.
با اینکه مشکل حل شده، ولی دوست داشتم در مورد مشکل کندی dpkg یه سری توضیح بدم تا شاید بعداً کسایی که سرچ می زنن بدردشون بخوره.
dpkg بر روی فایل سیستم های جدیدتر، که از ویژگی
Allocate-on-flush بهره می برن یه مقدار کند عمل می کنه. این رو می تونین توی باگ ریپورت هایی که روی فایل سیستم هایی مثل ext4 و btrfs و zfs انجام شده هم پیدا کنین. ولی دلیل این اتفاق اینه که dpkg پیش فرض برای اطمینان از امنیت و پایداری سیستم، روی دیتابیس dpkg و فایل های استخراج شده، fsync می کنه. این عمل، روی فایل سیستم های قدیمی تری مثل ext3 خیلی خوب و بدون مشکل عمل می کرد ولی توی ext4 چون ویژگی Allocate-on-flush اضافه شدش، باعث یه سری مشکلات شد.
این ویژگی ویژگی خوب و مثبتی هست که توی ext4 اضافه شده و توضیحات بیشتر روی می تونین توی
این لینک - قسمت سوم بخونین.
ولی همین قضیه باعث شده که برنامه هایی که از fsync بهره می برن، دچار مشکل بشن و کارایی شون کاهش پیدا کنه. توضیحات بیشتر در مورد این قضیه رو هم می تونین توی
این لینک مطالعه کنین.
همون طور که توی لینک بالا توضیح داده شده، برای حل این مشکل می شه سه کار مختلف رو انجام داد.
** فقط به دوستانی که بعداً ممکنه این تاپیک رو ببینن تاکید می کنم، در حالت عادی، بدون دونستن اینکه دقیقاً چیکار می کنین و صرفاً برای بهبود عملکرد و ...به هیچ عنوان کارای پایین رو انجام ندین و بذارین تنطیمات پیش فرض فایل سیستم و dpkg باقی بمونه.
1. مورد اول اینکه ویژگی Allocate-on-flush رو برای فایل سیستم غیرفعال کنیم. مثلاً در صورتی که ext4 استفاده می کنین، می شه از مانت آپشن nodelalloc استفاده کرد.
در صورتی که فایل سیستم رو با این آپشن، مانت کنین، پرفورمنس dpkg روی اون مشابه ext3 خواهد بود.
2.(برای کسانی که از نسخه ی 1.15.8.6 و بالاتر dpkg استفاده می کنن)
می تونین توی فایل کانفیگ dpkg یعنی /etc/dpkg/dpkg.cfg آپشن force-unsafe-io رو قرار بدین. از طریق این آپشن که از نسخه ی 1.15.8.6 اضافه شد، از fsync بر روی فایل ها جلوگیری می شه ولی همچنان fsync روی دیتابیس dpkg انجام خواهد شد.
3.می شه از eatmydata استفاده کرد تا از fsync هم روی فایل ها و هم روی دیتابیس جلوگیری کرد.
این برنامه باعث می شه، در صورت فراخوانی
sync مثل fsync(), fdatasync(), sync() msync() و ...، هیچ اتفاقی نیوفته.