การลบไฟล์ที่มีขนาดใหญ่มากโดยไม่ต้องแช่แข็งเว็บเซิร์ฟเวอร์


11

ในเว็บเซิร์ฟเวอร์ของฉัน (apache กำลังทำงาน, Linux CentOS) มีไฟล์บันทึกขนาดใหญ่มาก ( 50 Gbyte ) เว็บเซิร์ฟเวอร์นี้มีบริการเว็บบางอย่างในการผลิต

เมื่อฉันพยายามลบไฟล์บันทึกเว็บเซิร์ฟเวอร์ไม่ตอบสนองประมาณ 10 วินาที (บริการหมดเวลา)

rm -f monthly.log

มีวิธีการลบไฟล์ขนาดใหญ่นี้โดยไม่ต้องแช่แข็ง Apache หรือไม่

คำตอบ:


23

หมุนครั้งแรกผ่านทางlogrotateโดยใช้การกำหนดค่าเช่นนี้:

/path/to/the/log {
    missingok
    notifempty
    sharedscripts
    daily   
    rotate 7
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
    compress
}

จากนั้นสร้างงาน cron ตอนเที่ยงคืนเพื่อลบไฟล์ที่หมุนแล้ว:

30 2 * * * nice -n 19 ionice -c2 -n7 rm -f /path/to/the/log/file.1

คุณช่วยอธิบายสิ่งนี้ได้หรือไม่?
mowwwalker

1
คุณกำลัง 'ลบเลือน' และ 'ลบล้าง' การลบ Nice เคยเป็นเนื้อหาที่ป้องกันการใช้งาน CPU มากเกินไป แต่ที่สำคัญที่สุดคือ ionice ที่คุณบอกให้ตัวกำหนดตารางเวลาลบไฟล์ด้วยลำดับความสำคัญต่ำกว่า -c สำหรับชั้นเรียนที่ 1 คือเวลาจริง 2 ปกติและ 3 ไม่ได้ใช้งาน ภายในคลาส 2 คุณมีค่าตั้งแต่ 0 ถึง 7 (IRRC) โดยที่ 7 คือค่าต่ำสุด หากยังคงสร้างปัญหาให้เรียกใช้ด้วย 'ionice -c3' และควรจะใช้ได้
โกลัน

5

สำหรับการลบไฟล์ขนาดใหญ่ที่เร็วขึ้นคุณสามารถใช้truncateคำสั่ง - พูดเพื่อย่อขนาดเป็นศูนย์แล้วลบออก:

 truncate -s 0  monthly.log && rm -f monthly.log

ตามปริมาณที่แนะนำคุณต้องทำการ logrotate ก่อน


เป็นวิธีการที่truncateแตกต่างจาก>?
kojiro

อืมคำถามที่ดี ผลลัพธ์เหมือนกัน แต่ฉันไม่มีคำตอบว่าพวกเขาต่างกันในการนำไปใช้
แดเนียลที

truncateเป็นเรื่องง่ายที่จะใช้กับกว่าsudo นอกจากนี้ยังง่ายขึ้นด้วย> find -exec
kubanczyk


3

ฉันจะตัดทอน / ศูนย์ไฟล์ด้วยการ: > /path/to/monthly.logดำเนินการ จากนั้นอาจเริ่มกระบวนการ Apache ใหม่และตั้งค่าการหมุนเวียนบันทึกเพื่อป้องกันไม่ให้เกิดเหตุการณ์นี้อีกในอนาคต ...

สิ่งนี้เกิดขึ้นบ่อยครั้งแม้ว่า:

ดู: มีวิธีลบไฟล์ 100GB บน Linux โดยไม่ต้องกด IO / load หรือไม่

ในยูนิกซ์วิธีที่ดีที่สุดในการลดขนาดของไฟล์บันทึกขนาดใหญ่ที่ถูกเขียนลงไปคืออะไร?

เซิร์ฟเวอร์ Linux ออกจากพื้นที่


:ไม่มีความจำเป็นในการ คุณสามารถทำได้> /path/to/monthly.log
โคจิโร่

ฉันรู้ว่ามันเป็นnoopแต่มันก็สมเหตุสมผลดีกว่าจากมุมมองของการสอน
ewwhite

... แต่แล้วบางส่วนอาจารย์ผู้สอนในอนาคตมีการแก้ไขที่เข้าใจผิด โอ้ดีฉันเดาว่ามันเป็นงานรักษาความปลอดภัย
kojiro

จะไม่true > /path/to/monthly.logทำแบบเดียวกันและจะน้อยกว่าในสมัยโบราณ:?
Stefan Lasiewski

อาจเป็นจริง ...
ewwhite

3

หากคุณไม่ต้องการข้อมูลให้ตัดทอนโดยใช้ / dev / null:

cat /dev/null > monthly.log

เว็บเซิร์ฟเวอร์จะเขียนข้อมูลไปยังไฟล์ต่อไปหลังจากการตัดทอนซึ่งจะช่วยให้ไม่ต้องรีสตาร์ทเว็บเซิร์ฟเวอร์ (ไม่เหมือนrm monthly.logซึ่งจะเป็นการลบไฟล์)

หลังจากแก้วิกฤตทันทีให้พิจารณาการล๊อคชั่นตามที่ Quanta แนะนำ คุณไม่ต้องการให้สิ่งนี้เกิดขึ้นอีก โปรดทราบว่า Apache logfiles จะถูกหมุนโดยค่าเริ่มต้นบน CentOS

พิจารณาการส่งบันทึกการใช้เว็บผ่าน syslog ด้วย ( /usr/bin/loggerเช่นใช้) บันทึกที่สร้างขึ้นโดยใช้ syslog มักจะมีการตั้งค่าการบันทึกไว้แล้ว


5
คุณสามารถทำได้โดย>logfileไม่จำเป็นต้องใช้ cat
user9517

2

หากคุณใช้ระบบไฟล์ ext3 ให้พิจารณาเปลี่ยนเป็น ext4

Ext3 อาจจะช้าในการลบไฟล์ขนาดใหญ่เพราะมันเก็บตำแหน่งของทุก ๆ 4k บล็อก: ไฟล์ 50GiB (50 * 1024 ^ 3 ไบต์) ครอบครอง 13107200 บล็อกซึ่งแต่ละไฟล์จะถูกบันทึกในตารางไอโหนดเป็นหมายเลขบล็อก 32 บิต สำหรับข้อมูลการทำบัญชีทั้งหมด 50MiB เพียงเพื่อติดตามว่าเนื้อหาของไฟล์อยู่ที่ใดในดิสก์ รายการบล็อกขนาดใหญ่นั้นอาจกระจัดกระจายไปทั่วบล็อกหลาย ๆทางซึ่งทั้งหมดจะต้องได้รับการอัพเดตเมื่อไฟล์ถูกลบ ดิสก์ที่ค้นหาการเข้าถึงบล็อกทางอ้อมทั้งหมดอาจเป็นสาเหตุของความล่าช้า

Ext4 จะจัดสรรไฟล์เป็น "extents" สูงสุด 128MiB ไฟล์ 50GiB นั้นสามารถบันทึกในตาราง inode โดยใช้เร็กคอร์ด 400 ขอบเขตเท่านั้นมากกว่า 13107200 บล็อกหมายเลขแต่ละบล็อกซึ่งจะช่วยลดจำนวนของดิสก์ I / O ที่จำเป็นเมื่อทำการลบไฟล์

โปรดทราบว่าหากคุณแปลงระบบไฟล์ ext3 ที่มีอยู่ให้เป็น ext4 ไฟล์ใหม่จะถูกจัดสรรโดยใช้ extents แต่ไฟล์ที่มีอยู่จะยังคงใช้รายการบล็อก คุณสามารถใช้chattr +eคำสั่งเพื่อจัดสรรไฟล์ที่มีอยู่ใหม่โดยใช้ extents; ประสิทธิภาพที่ชาญฉลาดนี้เปรียบได้กับการทำสำเนาของไฟล์แล้วลบต้นฉบับ


1

สิ่งนี้ทำให้ปัญหาประสิทธิภาพของระบบไฟล์ลดลง มีคำตอบที่น่าสนใจสำหรับคำถาม SOนี้ แต่สิ่งนี้จะขึ้นอยู่กับระบบไฟล์ที่คุณใช้ ฉันใช้ XFS เมื่อสร้างระบบไฟล์เพื่อเก็บไฟล์ MPEG2 หลายร้อยกิกะไบต์สำหรับMythTVเพราะในขณะนั้นประสิทธิภาพการลบของ XFS นั้นเหนือกว่า ext3 สิ่งต่าง ๆ อาจมีการเปลี่ยนแปลงอย่างมากในช่วงหลายปีที่ผ่านมา

ฉันชอบคำตอบของ @ quanta การแบ่งไฟล์ออกเป็นส่วนเล็ก ๆ จะทำให้การลบเร็วขึ้น


1

ปัญหามาจากสมมุติว่าคุณกำลังลบไฟล์จากผู้ใช้ที่มีสิทธิพิเศษซึ่งมีความสำคัญต่อการดำเนินงานของดิสก์มากกว่าผู้ใช้เว็บเซิร์ฟเวอร์ apache ไม่ว่าคุณจะเลือกที่จะลบไฟล์บันทึก (rm -f หรือ truncate by>) คุณควรลดการทำงานของดิสก์ที่มีความสำคัญเป็น minumum:

  ionice -c3 rm -f filename.log
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.