grep ทำอย่างไรเมื่อไม่ได้ใช้งาน CPU


19

เมื่อมองหาการจับคู่กับgrepฉันมักจะพบว่าการค้นหาที่ตามมาใช้เวลาน้อยกว่าครั้งแรกอย่างมาก - เช่น 25s กับ 2s เห็นได้ชัดว่าไม่ใช่การใช้โครงสร้างข้อมูลซ้ำจากการเรียกใช้ครั้งล่าสุด - สิ่งที่ควรได้รับการจัดสรรคืน ใช้timeคำสั่งgrepฉันสังเกตเห็นปรากฏการณ์ที่น่าสนใจ:

real    24m36.561s
user    1m20.080s
sys     0m7.230s

เวลาที่เหลือไปที่ไหน มีอะไรที่ฉันสามารถทำได้เพื่อให้มันวิ่งเร็วทุกครั้งหรือไม่? (เช่นมีกระบวนการอื่นอ่านไฟล์ก่อนgrepค้นหา)

คำตอบ:


34

มันเป็นเรื่องที่ค่อนข้างบ่อยที่เกี่ยวข้องกับการแคชหน้า

ในครั้งแรกข้อมูลจะต้องอ่าน (ทางกายภาพ) จากดิสก์

ครั้งที่สอง (สำหรับไฟล์ที่มีขนาดไม่ใหญ่เกินไป) ดูเหมือนว่าจะมีอยู่ในแคชของหน้า

ดังนั้นคุณสามารถออกคำสั่งแรกเช่นcat (1)เพื่อนำไฟล์ (ไม่ใหญ่เกินไป) ลงในแคชหน้า (เช่นใน RAM) จากนั้นgrep ตัวที่สอง(1) (หรือโปรแกรมใด ๆ ที่อ่านไฟล์) โดยทั่วไปจะทำงานได้เร็วขึ้น .

(อย่างไรก็ตามข้อมูลยังคงต้องอ่านจากดิสก์ในบางครั้ง)

ดูเพิ่มเติม (บางครั้งมีประโยชน์ในโปรแกรมแอปพลิเคชันของคุณ แต่ไม่ค่อยได้อ่าน) (2) & posix_fadvise (2)และบางทีmadvise (2) & sync (2) & fsync (2)ฯลฯ ....

อ่านLinuxAteMyRAMด้วย

BTW นี่คือเหตุผลที่แนะนำให้ทำการเบนช์มาร์กโปรแกรมหลายครั้ง และนี่คือสาเหตุที่อาจเป็นประโยชน์ในการซื้อ RAM เพิ่มขึ้น (แม้ว่าคุณจะไม่ได้รันโปรแกรมโดยใช้ทั้งหมดเพื่อเป็นข้อมูล)

ถ้าคุณต้องการที่จะเข้าใจมากขึ้นอ่านหนังสือเช่นระบบปฏิบัติการ: สามชิ้นง่าย


12
ดังนั้นTL;DRคำตอบคือ "[บล็อกรอ] I / O"
mgarciaisaia

10
@PaulDraper ไม่ได้จริงๆ :) cat+ grepยังคงใช้เวลานานกว่าgrepอยู่คนเดียว
chepner

3
@chepner ยกเว้นว่าคุณสามารถทำมัลติเธรดและใช้catเป็นการดึงข้อมูลล่วงหน้าราคาถูกในขณะที่คุณกำลังทำอย่างอื่นเพื่อเตรียมพร้อมสำหรับความgrepสนใจ
hBy2Py


3
@ G-Man: คุณสามารถแทนที่สองตัวcatด้วยเอtacฟเฟกต์เดียวกันและการใช้ RAM ที่สูงกว่า: D หรือแมวทุกตัวที่มีแทค
Mark K Cowan

-1

ในสภาพแวดล้อมการจัดเก็บข้อมูลเครือข่ายอาจมีความล่าช้าค่อนข้างสำคัญเมื่อคุณเข้าถึงไฟล์ที่อยู่ใน "filer" แยกจากเซิร์ฟเวอร์เป็นครั้งแรก เมื่อไฟล์นั้นถูกเข้าถึงบนเซิร์ฟเวอร์ไฟล์นั้นจะถูกแคชในเครื่องและการเข้าถึงข้อมูลในภายหลังจะเร็วขึ้นมาก

นี่คือการทดลองเพียงคำนวณการตรวจสอบข้อมูลไฟล์ไม่ใช่ grep การเรียกใช้ครั้งแรกช้าและครั้งต่อไปจะเร็ว

> du -Dh file_348m
348M    file_348m

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.60user 0.15system 0:03.02elapsed 25%CPU (0avgtext+0avgdata 1524maxresident)k
708144inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.67user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.65user 0.07system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.66user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

ฉันขอขอบคุณสำหรับความคิดเห็นเกี่ยวกับ downvote เนื่องจากฉันไม่รู้วิธีตีความ ฉันเชื่อว่าคำอธิบายคำตอบของฉันถูกต้อง บางทีตัวอย่างคำสั่งไม่ชัดเจน? หรือคุณไม่ชอบที่ฉันไม่ได้เปรียบเทียบคำสั่ง grep? (ผมจงใจใช้คำสั่งง่าย md5sum เพื่อพยายามที่จะแสดงให้เห็นถึงจุดของฉัน.)
วินสตันสมิ ธ

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

ขอบคุณ @Alex สำหรับการบอกเหตุผล ฉันพยายามแยกความแตกต่างระหว่างเวลาโอเวอร์เฮดเพื่อย้ายข้อมูลจากที่จัดเก็บในตัวเครื่องไปยังหน่วยความจำซึ่งคำตอบแรกที่อธิบายไว้และเวลาในการย้ายข้อมูลจากที่เก็บข้อมูลเครือข่ายไปยังเซิร์ฟเวอร์ภายใน ฉันจะคิดว่าฉันสามารถอธิบายสิ่งนี้ได้ชัดเจนยิ่งขึ้นหรือให้ตัวอย่างคำสั่งที่ดีกว่า
Winston Smith

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

ฉันเห็นฉันกำลังเพิ่มความแตกต่างที่ไม่สำคัญกับสิ่งที่คุณกำลังมองหา ตกลง. โดยวิธีการที่ฉัน upvote ความคิดเห็นของคุณดังนั้นมันไม่ได้แก้ปัญหาของเหตุผล downvoting :-)
Winston Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.