เมื่อตัวแปรสภาพแวดล้อมเร่งกระบวนการให้เร็วขึ้น 40 เท่า

วันนี้เราอยากจะพูดถึงการอัปเดตล่าสุดบางส่วนของระบบ Sherlock [นี่คือคลัสเตอร์ประสิทธิภาพสูงที่มหาวิทยาลัยสแตนฟอร์ด - ประมาณ XNUMX น. trans.] ซึ่งช่วยเพิ่มความเร็วในการแสดงรายการไฟล์ในไดเร็กทอรีที่มีรายการจำนวนมาก

แตกต่างจากบทความทั่วๆ ไป นี่เป็นรายงานจากวงในเกี่ยวกับวิธีที่เราทำงานกับ Sherlock เป็นประจำ เพื่อให้มันทำงานได้อย่างดีที่สุดสำหรับผู้ใช้ของเรา เราหวังว่าจะเผยแพร่บทความประเภทนี้เพิ่มเติมอีกในอนาคต

การแสดงไฟล์จำนวนมากต้องใช้เวลา

ทุกอย่างเริ่มต้นด้วยคำถามสนับสนุนทางเทคนิคจากผู้ใช้ ทรงแจ้งปัญหาการประหารชีวิตว่า ls ใช้เวลาไม่กี่นาทีในไดเร็กทอรีที่มีรายการมากกว่า 15 รายการ $SCRATCH [ไดเร็กทอรีสำหรับไฟล์ชั่วคราว - ประมาณ. เลน]

ไฟล์หลายพันไฟล์ในไดเร็กทอรีเดียวมักจะสร้างภาระให้กับระบบไฟล์ และไม่แนะนำอย่างแน่นอน ผู้ใช้รู้เรื่องนี้และยอมรับว่ามันไม่ดี แต่บอกว่ารายการบนแล็ปท็อปของเขาเร็วกว่า Sherlock ถึง 1000 เท่า แน่นอนว่าสิ่งนี้ทำให้เราเจ็บ ดังนั้นเราจึงมองลึกลงไป

เพราะพี่ก็ดูดี.

เราดูว่ามันทำอะไรจริงๆ ls เมื่อแสดงรายการไดเร็กทอรี และเหตุใดกระบวนการจึงใช้เวลานานมาก เกี่ยวกับการแจกแจงที่ทันสมัยที่สุด ls โดยค่าเริ่มต้นมันจะทำงานเป็น ls --color=autoเพราะใครๆ ก็ชอบสีสัน

แต่สีที่สวยงามย่อมมีราคา: สำหรับทุกไฟล์ ls ต้องได้รับข้อมูลเกี่ยวกับประเภทไฟล์ การอนุญาต แฟล็ก คุณลักษณะเพิ่มเติม และอื่นๆ เพื่อเลือกสีที่เหมาะสม

วิธีแก้ไขปัญหาง่ายๆ วิธีหนึ่งคือการปิดการใช้งานสีใน ls โดยสิ้นเชิง แต่ลองจินตนาการถึงความไม่พอใจของผู้ใช้ คุณไม่ควรนำเอาท์พุตสีออกไปไม่ว่าในกรณีใด เราไม่ใช่สัตว์ประหลาด

ดังนั้นเราจึงมองลึกลงไป ls รายการสีผ่านตัวแปรสภาพแวดล้อม LS_COLORSซึ่งถูกกำหนดไว้ dircolors(1) ขึ้นอยู่กับไฟล์การกำหนดค่า dir_colors(5)... ใช่, ไฟล์ปฏิบัติการจะอ่านไฟล์กำหนดค่าเพื่อสร้างตัวแปรสภาพแวดล้อมซึ่งจะใช้ (และหากคุณไม่ทราบเกี่ยวกับไฟล์ ประตู (ทำ) จากนั้น 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 และไฟล์ปฏิบัติการที่มีสี ไม่ใช่การสูญเสียครั้งใหญ่

แน่นอนว่าตอนนี้ได้รับการกำหนดค่าใน Sherlock สำหรับผู้ใช้แต่ละคนแล้ว

แต่ถ้าคุณต้องการคืนสี คุณสามารถกลับไปสู่การตั้งค่าเริ่มต้นได้:

$ unset LS_COLORS

แต่ในไดเร็กทอรีที่มีไฟล์จำนวนมาก อย่าลืมชงกาแฟในขณะที่มันทำงานอยู่ ls.

ที่มา: will.com

เพิ่มความคิดเห็น