زمانی که یک متغیر محیطی فرآیند را 40 برابر سرعت می بخشد

امروز می‌خواهیم در مورد برخی از آخرین به‌روزرسانی‌های سیستم شرلوک صحبت کنیم [این یک خوشه با عملکرد بالا در دانشگاه استنفورد است - تقریباً. trans.]، که به طور قابل توجهی سرعت فهرست بندی فایل ها را در فهرست های با تعداد ورودی زیاد می کند.

برخلاف مقاله‌های معمولی، این بیشتر یک گزارش خودی است در مورد اینکه چگونه ما به طور منظم روی Sherlock کار می‌کنیم تا آن را در بهترین حالت برای کاربران خود نگه داریم. امیدواریم در آینده مقالات بیشتری از این دست منتشر کنیم.

فهرست کردن بسیاری از فایل ها زمان می برد

همه چیز با یک سوال پشتیبانی فنی از یک کاربر شروع شد. او مشکل را که اعدام گزارش کرد ls در دایرکتوری با بیش از 15 ورودی چند دقیقه طول می کشد $SCRATCH [دایرکتوری برای فایل های موقت - تقریبا. مسیر].

هزاران فایل در یک دایرکتوری معمولاً برای سیستم فایل مشکل ایجاد می کند و قطعاً توصیه نمی شود. کاربر این را می دانست و اعتراف کرد که خوب نیست، اما اشاره کرد که این لیست 1000 برابر سریعتر از شرلوک در لپ تاپ او بود. البته این به ما آسیب زد. بنابراین عمیق تر نگاه کردیم.

چون ls زیبا به نظر می رسد

ما به آنچه در واقع انجام می دهد نگاه کردیم ls هنگام فهرست کردن یک دایرکتوری، و اینکه چرا این فرآیند اینقدر طول می کشد. در اکثر توزیع های مدرن ls به طور پیش فرض به صورت اجرا می شود ls --color=auto، زیرا همه رنگ ها را دوست دارند.

اما رنگ های زیبا قیمتی دارند: برای هر فایل ls برای انتخاب رنگ مناسب باید اطلاعاتی در مورد نوع فایل، مجوزهای آن، پرچم ها، ویژگی های توسعه یافته و موارد مشابه به دست آورد.

یک راه حل ساده برای این مشکل غیرفعال کردن رنگ در ls است، اما خشم کاربران را تصور کنید. تحت هیچ شرایطی نباید خروجی رنگ را بردارید، ما هیولا نیستیم.

بنابراین عمیق تر نگاه کردیم. ls رنگ ها از طریق متغیر محیطی وارد می شوند LS_COLORS، که تنظیم شده است dircolors(1) بر اساس فایل پیکربندی dir_colors(5)... آره، فایل اجرایی فایل پیکربندی را می خواند تا یک متغیر محیطی ایجاد کند که سپس ls از آن استفاده می کند (و اگر از فایل ها اطلاعی ندارید درب (do)، سپس dir_colors کار خواهد کرد، با وجود همه چیز).

بیایید نگاه دقیق تری بیندازیم

برای تعیین اینکه کدام طرح رنگی باعث کاهش سرعت می شود، یک محیط آزمایشی ایجاد کردیم:

$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # don't try this at home!
$ time ls --color=always $SCRATCH/dont | wc -l
10000

real    0m12.758s
user    0m0.104s
sys     0m0.699s

12,7 ثانیه برای 10 فایل، خیلی خوب نیست.

به هر حال، ما به یک پرچم نیاز داریم --color=always: اگر چه او به ls --color=autoاما ls تشخیص می دهد که چه زمانی به ترمینال متصل نیست (مثلاً با لوله یا با تغییر جهت خروجی) و رنگ آمیزی را در صورت تنظیم غیرفعال می کند. auto. پسر باهوش

پس چه چیزی اینقدر طول می کشد؟ نگاه کردیم با strace:

$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 44.21    0.186617          19     10000           lstat
 42.60    0.179807          18     10000     10000 getxattr
 12.19    0.051438           5     10000           capget
  0.71    0.003002          38        80           getdents
  0.07    0.000305          10        30           mmap
  0.05    0.000217          12        18           mprotect
  0.03    0.000135          14        10           read
  0.03    0.000123          11        11           open
  0.02    0.000082           6        14           close
[...]

وای: 10 تماس lstat()، 10 تماس getxattr() (که همه شکست می خورند زیرا محیط ما ویژگی های مورد نظر ls را ندارد)، 10 تماس capget().

مطمئناً می توان این را بهینه کرد.

ویژگی قابلیت ها؟ جواب منفی

پیروی از توصیه اشکال مربوط به 10 سال پیش، ما سعی کردیم بررسی ویژگی را غیرفعال کنیم قابلیت های:

$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:/)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 98.95    0.423443          42     10000           lstat
  0.78    0.003353          42        80           getdents
  0.04    0.000188          10        18           mprotect
  0.04    0.000181           6        30           mmap
  0.02    0.000085           9        10           read
  0.02    0.000084          28         3           mremap
  0.02    0.000077           7        11           open
  0.02    0.000066           5        14           close
[...]
------ ----------- ----------- --------- --------- ----------------
100.00    0.427920                 10221         6 total

real    0m8.160s
user    0m0.115s
sys     0m0.961s

وای، تا 8 ثانیه شتاب! ما از شر آن همه تماس های گران قیمت خلاص شدیم getxattr()، و چالش ها capget() ناپدید شد، عالی

اما هنوز این تماس های مزاحم وجود دارد lstat()، با اينكه…

چند گل نیاز دارید؟

بنابراین، ما نگاه دقیق تری داشتیم LS_COLORS.

ابتدا به سادگی این متغیر را غیرفعال کردیم:

$ echo $LS_COLORS
rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
$ unset LS_COLORS
$ echo $LS_COLORS

$  time ls --color=always $SCRATCH/dont | wc -l
10000

real    0m13.037s
user    0m0.077s
sys     0m1.092s

چی!؟! هنوز 13 ثانیه؟

به نظر می رسد که زمانی که متغیر محیطی LS_COLORS فقط یکی از عناصر آن تعریف نشده یا گم شده است <type>=color:، به طور پیش فرض از پایگاه داده داخلی استفاده می کند و همچنان از رنگ ها استفاده می کند. بنابراین اگر می‌خواهید رنگ‌سازی را برای یک نوع فایل خاص غیرفعال کنید، باید آن را لغو کنید <type>=: یا <type> 00 در پرونده DIR_COLORS.

پس از آزمون و خطای فراوان، جستجوی خود را به این محدود کردیم:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

که به صورت نوشته شده است

LS_COLORS='ex=00:su=00:sg=00:ca=00:'

این به این معنی است: فایل ها را با ویژگی رنگ نکنید. قابلیت های، اما ذره ذره setuid/setgid، نه توسط پرچم اجرایی.

سرعت می دهیم ls

و اگر هیچ یک از این بررسی ها را انجام ندادید، تماس بگیرید lstat() ناپدید می شوند، و اکنون موضوع کاملاً متفاوت است:

$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 63.02    0.002865          36        80           getdents
  8.10    0.000368          12        30           mmap
  5.72    0.000260          14        18           mprotect
  3.72    0.000169          15        11           open
  2.79    0.000127          13        10           read
[...]
------ ----------- ----------- --------- --------- ----------------
100.00    0.004546                   221         6 total

real    0m0.337s
user    0m0.032s
sys     0m0.029s

0,3 ثانیه در لیستی از 10 فایل، یک رکورد.

راه اندازی شرلوک

از 13 ثانیه با تنظیمات پیش فرض تا 0,3 ثانیه با تنظیمات جزئی LS_COLORS یعنی شتاب 40 برابری به دلیل غیبت setuid / setgid و فایل های اجرایی رنگی ضرر آنچنان بزرگی نیست.

البته این اکنون در شرلوک برای هر کاربر پیکربندی شده است.

اما اگر می خواهید رنگ آمیزی را برگردانید، می توانید به سادگی به تنظیمات پیش فرض برگردید:

$ unset LS_COLORS

اما در دایرکتوری‌هایی که فایل‌های زیادی دارند، حتماً در حین کار قهوه دم کنید ls.

منبع: www.habr.com

اضافه کردن نظر