گنجه
۰۷ ۱۷م, ۱۳۸۸
همون طور که احتمالاً میدونید dpkg توساخت0 مدیریت بستهها1 در Debian است. یعنی APT و Synaptic و Aptitude و … همه روی dpkg بنا شده اند.
dpkg برای نگهداری بعضی اطلاعات بستههای نصبشده، از تعداد زیادی (برای من حدود ۹۰۰۰ تا) پروندهٔ2 کوچک توی مسیر /var/lib/dpkg/info استفاده میکنه. هر بار که بستهای رو نصب یا حذف میکنید dpkg همهٔ اون پروندهها رو از روی لوح3 میخونه. این کار روی سامانهٔ پروندهٔ4 مورد استفادهٔ من، که Ext4 هست، اولین بار بیست-سی ثانیهای طول میکشه، که برای من مدت زیادی هست. این کار در دفعات بعدی به علت قرار گرفتن همهٔ اون پروندهها در نهانگاه5 سامانهٔ پرونده در حافظهٔ اصلی، بسیار سریعتر انجام میشه، تا وقتی که دوباره از نهانگاه خارج بشند.
این مشکل هر از گاهی یک سیخی بهم میزد و روی اعصابم راه میرفت. فکرهای مختلفی برای حلش به ذهنم رسید. از بسیار پیچیده، مثل طراحی و پیادهسازی مجدد dpkg روی Tokyo Cabinet یا SQLite، تا بسیار ساده:
شاید بدونید که سامانهٔ پروندهٔ ReiserFS در کار با پروندههای کوچک بسیار عالی عمل میکنه. علتش هم استفاده از فن «تهچِپانی»6 است.7 فکر کردم شاید اگر پوشهٔ /var/lib/dpkg/info رو توی ReiserFS نگه دارم، مشکل حل بشه. این کار رو کردم، ولی به خاطر کارکرد8 داخلی dpkg روی کل /var/lib/dpkg:
$ sudo su - # cd /var/lib # tar cpzf dpkg.tar.gz dpkg # dd if=/dev/zero of=dpkg.reiserfs bs=$((256*1024*1024)) count=1 # mkreiserfs -f dpkg.reiserfs # mount -oloop dpkg.reiserfs dpkg # tar xpf dpkg.tar.gz
و بعد آزمودن و دائمی کردن با افزودن به fstab:
# echo 3 >/proc/sys/vm/drop_caches # apt-get install hello # apt-get purge hello # echo /var/lib/dpkg.reiserfs /var/lib/dpkg reiserfs loop,noatime 0 1 >>/etc/fstab
فکره جواب داد و سرعت dpkg بسیار بهتر شد. حالا حتی اولین بار هم dpkg اون کار رو در دو-سه ثانیه انجام میده.
علاوه بر مهارت ReiserFS در کار با پروندههای کوچک، چند نکتهٔ دیگه هم قابل ذکر هست. یکی این که Ext4 به علت فن «حوزه»9 در کار با پروندههای نسبتاً بزرگی که یکجا تخصیص10 مییابند بسیار سریع هست. برای همین به dd گفتم که کل پرونده رو یکجا بسازه.
از طرفی چون، در نتیجهٔ نکتهٔ قبل، کل پروندههای مربوط به dpkg روی لوح نزدیک به هم قرار میگیرند و پراکنده نیستند، با خونده شدن یک پرونده از اون حوالی، تعداد زیادی از بقیهشون هم توی نهانگاه لوح و تعدادی هم توی نهانگاه سامانهٔ پرونده قرار میگیرند. همین امر باعث میشه کلی زمان جویش11 که قبلاً برای رسیدن به پرندههای پراکنده در اطراف و اکناف لوح هدر میرفت، صرفهجویی بشه.
به گزینهٔ12 noatime در fstab هم دقت کنید. رفتار معمولی سامانههای پرونده این هست که در هر دسترسی (اعم از خواندن یا نوشتن) به یک پرونده، زمان دسترسی رو ذخیره میکنند. این خیلی بده! هر دسترسی = حداقل یک عمل نوشتن روی لوح، و عمل نوشتن هم معمولاً کندتر از خوندن هست. نکته این جاست که برنامههای رایج امروزی معمولاً روی اون زمان ثبتشده برای آخرین دسترسی حساب نمیکنند و عملاً اون عدد بیاستفاده است! گزینهٔ noatime به سامانهٔ پرونده میگه که کلاً قید ثبت اون زمان رو بزنه و به این ترتیب کلی عمل نوشتن صرفهجویی کنه.
۱۲ ۱۳م, ۱۳۸۷
یکی از روشهای نسبتاً متفاوت همگردان0ها برای بهینهسازی1، روش «بهینهسازی هدایتشده با سابقه»2 است که گاهی اون رو کوتاهانه3 PGO هم میگویند.
مؤثر بودن این روش رو میشه به چشم دید. مثلاً اگر از مرورگر Firefox هم در لینوکس4 و هم در ویندوز5 استفاده کرده باشید، حتماً تفاوت فاحش کارآیی6 رو حس کردهاید. دلیل این تفاوت فاحش، استفاده از PGO در ساخت7 پروندهٔ8 اجرایی9 ویندوز و عدم استفاده ازش در ساخت اجرایی لینوکس بیان شده.
خوب، حالا که به اندازهٔ کافی انگیزوندمتون (!)، ببینیم این روش اصلاً چی هست و چهجوری میتونیم ازش استفاده کنیم.
اساس این روش، استفاده از اطلاعات کسبشده در زمان اجرا10ی برنامه، برای بهینهسازی در زمان همگردانی11 هست. پس همگردانی با این روش، سه مرحله خواهد داشت:
۱. همگردانی برای تولید اجرایی مخصوص جمعآوری اطلاعات مورد نیاز برای بهینهسازی
۲. اجرای برنامهٔ تولیدشده در مرحلهٔ ۱ و استفاده از موارد کاربرد12 مورد نظر برای بهینهسازی
۳. همگردانی با بهینهسازی به کمک اطلاعات جمعآوریشده در مرحلهٔ ۲
همگردانها برای مراحل ۱ و ۳ گزینههای مخصوصی دارند که اینجا فقط GCC رو میبینیم.
درGCC برای مرحلهٔ ۱ از گزینهٔ -fprofile-generate و برای مرحلهٔ ۳ از گزینهٔ -fprofile-use استفاده میکنیم. دقت کنید که گزینهٔ -fprofile-generate رو هم باید برای همگردانی13 بدید، و هم برای پیوند14.
من که معمولاً از CMake به عنوان سامانهٔ ساخت15 استفاده میکنم، برای به کارگیری این روش، این چند خط رو به CMakeLists.txt اضافه میکنم:
# profile::generate
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --profile-generate")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --profile-generate")
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --profile-generate")
# profile::use
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --profile-use")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --profile-use")
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --profile-use")برای مرحلهٔ ۱، سه تا set اول و برای مرحلهٔ ۳، سه تا set دوم رو فعال میکنم. راستی دقت کردید که به جای -fprofile-folan میشه از -profile-folan- استفاده کرد؟!
۱۱ ۱۰م, ۱۳۸۷
دبیَن0 سامانهٔ عامل1 محبوب من هست.
موج زدن روح آزادی نرمافزار رو توی دبین حس میکنم.
بخش عظیمی از همهٔ نرمافزارهای آزاد دنیا رو میشه توی مخزن2های دبین، آمادهٔ نصب پیدا کرد؛ الان حدود ۲۰۰۰۰ تا بسته3 در مخازن رسمی4 هست.
سامانهٔ مدیریت بستههاش5، به نام APT (مخفف «ابزار بستهبندی پیشرفته»6)، بسیار تمیز و خوشدست هست.
اگر سامانهای حقیقتاً پایدار7 بخوام، دبین stable رو نصب میکنم. اگر پایداری برام کمتر از بهروز8 بودن نرمافزارها مهم باشه (مثلاً برای رایانهٔ منزل)، دبین unstable + experimental رو نصب میکنم. اگر روی سامانهٔ پایدارم آخرین نسخهٔ بستههای خاصی رو بخوام هم به سادگی میتونم بستههای deb رو جدا بگیرم و نصب کنم، یا با تنظیم /etc/apt/preferences کار رو به دست استاد APT بسپارم (به man apt_preferences مراجعه کنید).
قبل از این که خبر انتشار KDE 4.2 توی پایگاه رسمی KDE اعلام بشه، بستههای KDE 4.2 توی مخزن دبین experimental بود و داشتم نصبش میکردم!
نرمافزارهای دوستداشتنیای مثل VirtualBox رو که هم ویرایش آزاد دارند، و هم ویرایش غیرآزاد، و البته گاهی در پایگاه9 رسمیشون ایران عزیز رو تحریم کردهاند، از مخازن دبین به راحتی نصب میکنم بدون این که نگران تحریم و یا آلوده شدن رایانهام به نسخهٔ غیرآزادشون باشم. همهٔ نرمافزارهای بخش10 main، آزاد هستند و به هیچ نرمافزار غیرآزادی وابستگی11 ندارند.
بعضی نرمافزارهای غیرآزاد مثل افزونهٔ12 Flash، که ناچار از استفادهشون هستم رو میتونم بدون به هم زدن یکپارچگی سامانهام نصب کنم. بخشهای contrib و non-free حاوی بعضی از نرمافزارهای غیرآزاد پراستفاده هستند.
یادم نره بگم که دبین برای تعداد زیادی معماری13 مختلف رایانه وجود داره. از x86 و AMD64 بگیر تا MIPS و ARM و PowerPC و SPARC و Alpha و … (برای فهرست کاملش http://www.debian.org/ports/ رو ببینید)
با دبین به هستهٔ لینوکس14 محدود نیستم؛ میشه دبین رو با هستهٔ15 FreeBSD16 یا NetBSD17 یا Hurd18 یا OpenSolaris19 یا حتی20 Darwin/XNU (هستهٔ Mac OS X) استفاده کرد! شما رو نمیدونم، ولی این برای من خیلی مهم و همچنین خیلی هیجانانگیزه! مثلاً به این فکر کنید که میتونید توی محیط آشنا و دوستداشتنی دبین، به کاملترین پیادهسازی سامانهٔ پروندهٔ21 قدرتمند ZFS که توی OpenSolaris هست دسترسی داشته باشید.
راستی یادمون نره که اوبونتو22 بچهٔ دبین هست.
اینجوریهاست که بهش میگم حضرت دبین!
- Debian [↩]
- Operating System [↩]
- Repository [↩]
- Package [↩]
- Official [↩]
- Package Management [↩]
- Advanced Packaging Tool [↩]
- Stable [↩]
- Up-to-date [↩]
- Site [↩]
- Section [↩]
- Dependency [↩]
- Plugin [↩]
- Architecture [↩]
- Linux [↩]
- Kernel [↩]
- Debian GNU/kFreeBSD [↩]
- Debian GNU/NetBSD [↩]
- Debian GNU/Hurd [↩]
- Nexenta [↩]
- GNU-Darwin [↩]
- File System [↩]
- Ubuntu [↩]
۰۸ ۲۵م, ۱۳۸۷
مدیر0 یک خادم1 رایانامه2 هستم به نام «شهاب». بعد از مدتها که داشت به خوبی و خوشی کارش رو میکرد، یک روز دیدم حدود بیست هزار تا رایانامه توی صفش گیر کرده. معمولاً این عدد برای شهاب حدود یکی دو هزار تاست. از اون طرف یکییکی رایانامهها و پیامک3های دوستان میرسید که «شهاب میل نمیفرسته» و «دوباره دانلود گذاشتی رو شهاب؟! کار نمیکنه!». همون طور که حتماً فهمیدهاید وضعیت شهاب وخیم بود.
چون علائم شهاب شبیه تجربهای نهچندانقدیمی بود، قبل از هر چیز، فضای خالی بخش4های لوح5 رو بررسی کردم. دیدم که بعله، بخش /var پر شده. با استفاده از
du -s * | sort -nr | less
دیدم که کار، کار نگاره6هاست7. از اونجا که بخش /var دیگه جا نداشت، باید شاخهٔ8 /var/log رو به بخش دیگری منتقل میکردم. پس بعد از متوقف کردن [تقریباً] همهٔ خدمت9ها، از جمله apache2 و postfix و klogd و غیره، زدم:
mv /var/log /home ln -s /home/log /var
خدمتها رو آغاز10 کردم و همه چیز خوب به نظر میرسید.
خارج شدم، اما ته دلم هنوز نگران بودم. چون نمیدونستم چرا این همه نگاره تولید شده. با این حال راه راحتتر رو انتخاب کردم(!): به خودم گفتم «حالا بذار تا فردا کار کنه ببینیم چی میشه».
… ادامه دارد …