Xóa tệp rất lớn mà không bị đóng băng máy chủ web


11

Trong máy chủ web của tôi (apache đang chạy, Linux CentOS), có một tệp nhật ký rất lớn ( 50 Gbyte ). Máy chủ web này có một số dịch vụ web trong sản xuất.

Khi tôi cố xóa tệp nhật ký, máy chủ web không có phản hồi khoảng 10 giây. (Hết giờ phục vụ.)

rm -f monthly.log

Có cách nào để xóa tập tin lớn này mà không bị đóng băng apache không?

Câu trả lời:


23

Xoay nó đầu tiên thông qua logrotate, sử dụng một cấu hình như thế này:

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

sau đó tạo một công việc định kỳ vào nửa đêm để xóa tệp đã xoay:

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

Bạn có thể giải thích điều này có nghĩa là gì / không?
mowwwalker

1
bạn đang 'quan tâm' và 'ion hóa' việc xóa. Nice được sử dụng để ngăn chặn bất kỳ sự lạm dụng CPU nào, nhưng quan trọng nhất ở đây là ionice, nơi bạn thực sự đang nói với bộ lập lịch để xóa tệp với mức độ ưu tiên thấp hơn. -c dành cho lớp, trong đó 1 là thời gian thực, 2 bình thường và 3 không hoạt động. Trong lớp 2, bạn có từ 0 đến 7 (IRRC) trong đó 7 là thấp nhất. NẾU vẫn tạo ra vấn đề, hãy chạy nó với 'ionice -c3' và nó sẽ ổn.
golan

5

Để xóa nhanh hơn các tệp lớn, bạn có thể sử dụng truncatelệnh - Say để thu nhỏ tệp về kích thước bằng 0 và sau đó xóa tệp:

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

Như lượng tử khuyến nghị, bạn cần phải đăng nhập nó trước.


Làm thế nào truncatekhác với >?
kojiro

hmm câu hỏi hay. Kết quả là như nhau, nhưng tôi không có câu trả lời về cách chúng thực hiện khác nhau.
Daniel t.

Các truncatedễ sử dụng với sudohơn >. Nó cũng dễ dàng hơn với find -exec.
kubanchot


3

Tôi sẽ cắt / không tập tin với các : > /path/to/monthly.loghoạt động. Sau đó, có thể khởi động lại quy trình Apache và thiết lập xoay vòng nhật ký để ngăn điều này xảy ra trong tương lai ...

Điều này xuất hiện thường xuyên, mặc dù:

Xem: Có cách nào để xóa tệp 100 GB trên Linux mà không cần đập IO / load không?

Trong unix, cách tốt nhất để giảm kích thước của tệp nhật ký lớn đang được tích cực ghi vào là gì?

Máy chủ Linux hết dung lượng


Không cần cho :. Bạn chỉ có thể làm> /path/to/monthly.log
kojiro

Tôi biết đó là một noop, nhưng nó có ý nghĩa hơn từ góc độ hướng dẫn.
ewwhite

Sau đó, một số giảng viên tương lai phải sửa chữa quan niệm sai lầm đó . Ồ, tôi đoán đó là bảo mật công việc.
kojiro

Sẽ không true > /path/to/monthly.loglàm điều tương tự, và sau đó nó ít cổ xưa hơn :?
Stefan Lasiewski

Có lẽ đúng ...
ewwhite

3

Nếu bạn không cần dữ liệu, hãy cắt bớt nó bằng / dev / null:

cat /dev/null > monthly.log

Máy chủ web sẽ tiếp tục ghi dữ liệu vào tệp sau khi cắt bớt, điều này tránh mọi nhu cầu khởi động lại máy chủ web (không giống như rm monthly.logloại bỏ tệp).

Sau khi giải quyết cuộc khủng hoảng trước mắt, hãy xem xét logrotation như Quanta đề xuất. Bạn không muốn điều này xảy ra một lần nữa. Lưu ý rằng các tệp nhật ký Apache đã được xoay theo mặc định trên CentOS

Cũng xem xét việc gửi nhật ký web thông qua syslog ( /usr/bin/loggerví dụ sử dụng ). Các nhật ký được tạo bằng syslog cũng thường được thiết lập logrotation.


5
Bạn không thể >logfilekhông cần mèo
user9517

2

Nếu bạn đang sử dụng hệ thống tập tin ext3, hãy xem xét chuyển sang ext4.

Ext3 có thể chậm khi xóa các tệp lớn vì nó lưu trữ vị trí của mỗi khối 4k riêng lẻ: tệp 50GiB (50 * 1024 ^ 3 byte) chiếm 13107200 khối, mỗi khối được ghi trong bảng inode dưới dạng số khối 32 bit , với tổng số 50MiB dữ liệu sổ sách chỉ để theo dõi vị trí của nội dung tệp trên đĩa. Danh sách khối lớn đó có thể nằm rải rác trên nhiều khối gián tiếp , tất cả đều phải được cập nhật khi tệp bị xóa. Đĩa tìm cách truy cập tất cả các khối gián tiếp đó có lẽ là nguyên nhân gây ra sự chậm trễ.

Ext4, mặt khác, phân bổ các tệp trong "phạm vi" lên tới 128MiB. Tệp 50GiB đó có thể được ghi lại trong bảng inode chỉ bằng 400 bản ghi phạm vi, thay vì 13107200 số khối riêng lẻ, giúp giảm đáng kể lượng I / O đĩa cần thiết khi xóa tệp.

Lưu ý rằng nếu bạn chuyển đổi một hệ thống tệp ext3 hiện tại thành ext4, các tệp mới sẽ được phân bổ bằng cách sử dụng, nhưng các tệp hiện tại sẽ vẫn sử dụng danh sách khối. Bạn có thể sử dụng chattr +elệnh để phân bổ lại một tệp hiện có bằng cách sử dụng phạm vi; hiệu suất khôn ngoan, điều này có thể so sánh với việc tạo một bản sao của tệp và sau đó xóa bản gốc.


1

Điều này dẫn đến một vấn đề hiệu năng hệ thống tập tin. Có một câu trả lời thú vị cho câu hỏi SO này nhưng điều này phụ thuộc vào hệ thống tập tin bạn đang sử dụng. Tôi đã sử dụng XFS khi tạo một hệ thống tệp để lưu trữ hàng trăm tệp MPEG2 nhiều gigabyte cho MythTV vì tại thời điểm đó, hiệu suất xóa của XFS vượt trội hơn nhiều so với ext3. Mọi thứ có thể đã thay đổi đáng kể trong những năm qua.

Tôi thích câu trả lời của @ quanta. Việc chia nhỏ tệp thành các phần nhỏ hơn sẽ dẫn đến việc xóa nhanh hơn.


1

Vấn đề xuất phát từ, tôi cho rằng, bạn đang xóa tệp khỏi người dùng đặc quyền được ưu tiên hơn cho các hoạt động của đĩa so với người dùng máy chủ web apache. Bất kể bạn chọn cách nào để xóa tệp nhật ký (rm -f hoặc cắt bớt bởi>), bạn nên hạ thấp các hoạt động ưu tiên đĩa của nó xuống mức tối thiểu:

  ionice -c3 rm -f filename.log
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.