امروز میخواهیم در مورد برخی از آخرین بهروزرسانیهای سیستم شرلوک صحبت کنیم [این یک خوشه با عملکرد بالا در دانشگاه استنفورد است - تقریباً. trans.]، که به طور قابل توجهی سرعت فهرست بندی فایل ها را در فهرست های با تعداد ورودی زیاد می کند.
برخلاف مقالههای معمولی، این بیشتر یک گزارش خودی است در مورد اینکه چگونه ما به طور منظم روی Sherlock کار میکنیم تا آن را در بهترین حالت برای کاربران خود نگه داریم. امیدواریم در آینده مقالات بیشتری از این دست منتشر کنیم.
فهرست کردن بسیاری از فایل ها زمان می برد
همه چیز با یک سوال پشتیبانی فنی از یک کاربر شروع شد. او مشکل را که اعدام گزارش کرد ls
در دایرکتوری با بیش از 15 ورودی چند دقیقه طول می کشد $SCRATCH
[دایرکتوری برای فایل های موقت - تقریبا. مسیر].
هزاران فایل در یک دایرکتوری معمولاً برای سیستم فایل مشکل ایجاد می کند و قطعاً توصیه نمی شود. کاربر این را می دانست و اعتراف کرد که خوب نیست، اما اشاره کرد که این لیست 1000 برابر سریعتر از شرلوک در لپ تاپ او بود. البته این به ما آسیب زد. بنابراین عمیق تر نگاه کردیم.
چون ls زیبا به نظر می رسد
ما به آنچه در واقع انجام می دهد نگاه کردیم ls
هنگام فهرست کردن یک دایرکتوری، و اینکه چرا این فرآیند اینقدر طول می کشد. در اکثر توزیع های مدرن ls
به طور پیش فرض به صورت اجرا می شود ls --color=auto
، زیرا همه رنگ ها را دوست دارند.
اما رنگ های زیبا قیمتی دارند: برای هر فایل ls
برای انتخاب رنگ مناسب باید اطلاعاتی در مورد نوع فایل، مجوزهای آن، پرچم ها، ویژگی های توسعه یافته و موارد مشابه به دست آورد.
یک راه حل ساده برای این مشکل غیرفعال کردن رنگ در ls است، اما خشم کاربران را تصور کنید. تحت هیچ شرایطی نباید خروجی رنگ را بردارید، ما هیولا نیستیم.
بنابراین عمیق تر نگاه کردیم. ls
رنگ ها از طریق متغیر محیطی وارد می شوند LS_COLORS
، که تنظیم شده است dircolors(1)
بر اساس فایل پیکربندی dir_colors(5)
... آره،
بیایید نگاه دقیق تری بیندازیم
برای تعیین اینکه کدام طرح رنگی باعث کاهش سرعت می شود، یک محیط آزمایشی ایجاد کردیم:
$ 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()
.
مطمئناً می توان این را بهینه کرد.
ویژگی قابلیت ها؟ جواب منفی
پیروی از توصیه
$ 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:'
این به این معنی است: فایل ها را با ویژگی رنگ نکنید.
، نه توسط
سرعت می دهیم 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