Nói chung, việc cải thiện hiệu năng bộ đệm đĩa không chỉ là tăng kích thước bộ đệm của hệ thống tệp trừ khi toàn bộ hệ thống của bạn phù hợp với RAM trong trường hợp bạn nên sử dụng ổ RAM ( tmpfs
tốt vì nó cho phép quay lại đĩa nếu bạn cần RAM trong một số trường hợp) để lưu trữ thời gian chạy (và có lẽ là tập lệnh initrd để sao chép hệ thống từ bộ lưu trữ sang ổ RAM khi khởi động).
Bạn không biết thiết bị lưu trữ của mình là SSD hay HDD. Đây là những gì tôi đã tìm thấy để làm việc cho tôi (trong trường hợp của tôi sda
là ổ cứng gắn tại /home
và sdb
ổ SSD được gắn tại /
).
Trước tiên, tối ưu hóa phần tải-Stuff-from-Storage-to-cache:
Đây là thiết lập của tôi cho ổ cứng (đảm bảo AHCI + NCQ được bật trong BIOS nếu bạn phải bật):
echo cfq > /sys/block/sda/queue/scheduler
echo 10000 > /sys/block/sda/queue/iosched/fifo_expire_async
echo 250 > /sys/block/sda/queue/iosched/fifo_expire_sync
echo 80 > /sys/block/sda/queue/iosched/slice_async
echo 1 > /sys/block/sda/queue/iosched/low_latency
echo 6 > /sys/block/sda/queue/iosched/quantum
echo 5 > /sys/block/sda/queue/iosched/slice_async_rq
echo 3 > /sys/block/sda/queue/iosched/slice_idle
echo 100 > /sys/block/sda/queue/iosched/slice_sync
hdparm -q -M 254 /dev/sda
Đáng chú ý cho trường hợp ổ cứng là cao fifo_expire_async
(thường ghi) và dài slice_sync
để cho phép một quá trình duy nhất có được thông lượng cao (được đặt thành slice_sync
số thấp hơn nếu bạn gặp tình huống trong đó nhiều quá trình đang chờ song song một số dữ liệu từ đĩa). Điều slice_idle
này luôn luôn là một sự thỏa hiệp cho các ổ cứng, nhưng đặt nó ở đâu đó trong phạm vi 3-20 sẽ ổn tùy thuộc vào việc sử dụng đĩa và phần sụn. Tôi thích nhắm mục tiêu cho các giá trị thấp nhưng đặt nó quá thấp sẽ phá hủy thông lượng của bạn. Các quantum
thiết lập dường như ảnh hưởng đến thông lượng rất nhiều nhưng cố gắng giữ này càng thấp càng tốt để giữ cho độ trễ về mức hợp lý. Đặt quantum
quá thấp sẽ phá hủy thông lượng. Các giá trị trong phạm vi 3-8 dường như hoạt động tốt với ổ cứng. Độ trễ trường hợp xấu nhất cho một lần đọc là ( quantum
* slice_sync
) + ( slice_async_rq
*slice_async
) ms nếu tôi hiểu chính xác hành vi kernel. Async chủ yếu được sử dụng bằng cách ghi và vì bạn sẵn sàng trì hoãn ghi vào đĩa, đặt cả hai slice_async_rq
và slice_async
số rất thấp. Tuy nhiên, việc đặt slice_async_rq
giá trị quá thấp có thể khiến bạn đọc bị chậm vì việc ghi không thể bị trì hoãn sau khi đọc nữa. Cấu hình của tôi sẽ cố gắng để ghi dữ liệu vào đĩa nhiều nhất sau 10 giây sau khi dữ liệu đã được truyền cho hạt nhân nhưng kể từ khi bạn có thể chịu đựng sự mất mát dữ liệu trên tổn thất điện năng cũng thiết lập fifo_expire_async
để 3600000
nói rằng 1 giờ không quan trọng cho sự chậm trễ vào đĩa. slice_async
Tuy nhiên, chỉ giữ mức thấp, vì nếu không, bạn có thể có độ trễ đọc cao.
Các hdparm
lệnh là cần thiết để ngăn chặn AAM từ giết chết phần lớn hiệu suất mà AHCI + NCQ cho phép. Nếu đĩa của bạn tạo ra quá nhiều tiếng ồn, thì bỏ qua điều này.
Đây là thiết lập của tôi cho SSD (dòng Intel 320):
echo cfq > /sys/block/sdb/queue/scheduler
echo 1 > /sys/block/sdb/queue/iosched/back_seek_penalty
echo 10000 > /sys/block/sdb/queue/iosched/fifo_expire_async
echo 20 > /sys/block/sdb/queue/iosched/fifo_expire_sync
echo 1 > /sys/block/sdb/queue/iosched/low_latency
echo 6 > /sys/block/sdb/queue/iosched/quantum
echo 2 > /sys/block/sdb/queue/iosched/slice_async
echo 10 > /sys/block/sdb/queue/iosched/slice_async_rq
echo 1 > /sys/block/sdb/queue/iosched/slice_idle
echo 20 > /sys/block/sdb/queue/iosched/slice_sync
Ở đây đáng chú ý các giá trị thấp cho các cài đặt lát khác nhau. Cài đặt quan trọng nhất cho SSD là slice_idle
phải được đặt thành 0-1. Đặt nó thành 0 sẽ chuyển tất cả các quyết định đặt hàng sang NCQ gốc trong khi đặt nó thành 1 cho phép kernel đặt hàng yêu cầu (nhưng nếu NCQ đang hoạt động, phần cứng có thể ghi đè một phần thứ tự kernel). Kiểm tra cả hai giá trị để xem nếu bạn có thể thấy sự khác biệt. Đối với dòng Intel 320, có vẻ như cài đặt slide_idle
để 0
cung cấp thông lượng tốt nhất nhưng cài đặt nó để 1
mang lại độ trễ tổng thể tốt nhất (thấp nhất).
Để biết thêm thông tin về các điều chỉnh này, xem http://www.linux-mag.com/id/7572/ .
Bây giờ chúng tôi đã cấu hình kernel để tải nội dung từ đĩa vào bộ đệm với hiệu suất hợp lý, đã đến lúc điều chỉnh hành vi bộ đệm:
Theo điểm chuẩn tôi đã thực hiện, tôi sẽ không bận tâm đến việc đọc trước blockdev
. Cài đặt mặc định kernel là tốt.
Đặt hệ thống để thích hoán đổi dữ liệu tệp qua mã ứng dụng (điều này không quan trọng nếu bạn có đủ RAM để giữ toàn bộ hệ thống tệp và tất cả mã ứng dụng và tất cả bộ nhớ ảo được phân bổ bởi các ứng dụng trong RAM). Điều này giúp giảm độ trễ khi hoán đổi giữa các ứng dụng khác nhau về độ trễ để truy cập các tệp lớn từ một ứng dụng:
echo 15 > /proc/sys/vm/swappiness
Nếu bạn muốn giữ các ứng dụng gần như luôn luôn trong RAM, bạn có thể đặt giá trị này thành 1. Nếu bạn đặt giá trị này thành 0, kernel sẽ không trao đổi gì cả trừ khi thực sự cần thiết để tránh OOM. Nếu bạn bị giới hạn bộ nhớ và làm việc với các tệp lớn (ví dụ: chỉnh sửa video HD), thì có thể có ý nghĩa khi đặt mức này gần 100.
Tôi hiện nay (2017) thích không có trao đổi gì cả nếu bạn có đủ RAM. Không có trao đổi thường sẽ mất 200-1000 MB RAM trên máy tính để bàn chạy dài. Tôi sẵn sàng hy sinh nhiều thứ đó để tránh độ trễ trong trường hợp xấu nhất (đổi mã ứng dụng khi RAM đầy). Trong thực tế, điều này có nghĩa là tôi thích OOM Killer hơn trong việc hoán đổi. Nếu bạn cho phép / cần trao đổi, bạn cũng có thể muốn tăng /proc/sys/vm/watermark_scale_factor
, để tránh một số độ trễ. Tôi sẽ đề xuất các giá trị trong khoảng từ 100 đến 500. Bạn có thể coi cài đặt này là việc sử dụng CPU để có độ trễ trao đổi thấp hơn. Mặc định là 10 và tối đa có thể là 1000. Giá trị cao hơn (theo tài liệu kernel ) dẫn đến việc sử dụng CPU cao hơn cho kswapd
các quy trình và độ trễ hoán đổi tổng thể thấp hơn.
Tiếp theo, yêu cầu kernel thích giữ phân cấp thư mục trong bộ nhớ hơn nội dung tệp trong trường hợp một số RAM cần được giải phóng (một lần nữa, nếu mọi thứ phù hợp với RAM, cài đặt này không làm gì):
echo 10 > /proc/sys/vm/vfs_cache_pressure
Cài đặt vfs_cache_pressure
với giá trị thấp có ý nghĩa bởi vì trong hầu hết các trường hợp, kernel cần biết cấu trúc thư mục trước khi nó có thể sử dụng nội dung tệp từ bộ đệm và xóa bộ đệm thư mục quá sớm sẽ làm cho bộ đệm tệp bên cạnh không có giá trị. Xem xét giảm dần xuống 1 với cài đặt này nếu bạn có nhiều tệp nhỏ (hệ thống của tôi có khoảng 150K ảnh 10 megapixel và được tính là hệ thống "nhiều tệp nhỏ"). Không bao giờ đặt nó về 0 hoặc cấu trúc thư mục luôn được giữ trong bộ nhớ ngay cả khi hệ thống hết bộ nhớ. Đặt giá trị này thành giá trị lớn chỉ hợp lý nếu bạn chỉ có một vài tệp lớn liên tục được đọc lại (một lần nữa, chỉnh sửa video HD mà không có đủ RAM sẽ là một ví dụ). Tài liệu hạt nhân chính thức nói rằng "
Ngoại lệ: nếu bạn có số lượng tệp và thư mục thực sự lớn và bạn hiếm khi chạm / đọc / liệt kê tất cả các tệp cài đặt vfs_cache_pressure
cao hơn 100 có thể là khôn ngoan. Điều này chỉ áp dụng nếu bạn không có đủ RAM và không thể giữ toàn bộ cấu trúc thư mục trong RAM và vẫn có đủ RAM cho các quy trình và bộ đệm của tệp thông thường (ví dụ: máy chủ tệp rộng của công ty có nhiều nội dung lưu trữ). Nếu bạn cảm thấy cần tăng vfs_cache_pressure
hơn 100 thì bạn đang chạy mà không đủ RAM. Tăng vfs_cache_pressure
có thể giúp nhưng cách khắc phục thực sự duy nhất là để có thêm RAM. Đã vfs_cache_pressure
đặt số lượng cao hy sinh hiệu suất trung bình để có hiệu suất tổng thể ổn định hơn (nghĩa là, bạn có thể tránh hành vi xấu thực sự tồi tệ nhất nhưng phải đối phó với hiệu suất tổng thể tồi tệ hơn).
Cuối cùng, bảo kernel sử dụng tới 99% RAM làm bộ đệm để ghi và hướng dẫn kernel sử dụng tới 50% RAM trước khi làm chậm quá trình ghi (mặc định dirty_background_ratio
là 10
). Cảnh báo: Cá nhân tôi sẽ không làm điều này nhưng bạn tuyên bố có đủ RAM và sẵn sàng mất dữ liệu.
echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
Và nói rằng trì hoãn ghi 1h là ổn để thậm chí bắt đầu ghi nội dung vào đĩa (một lần nữa, tôi sẽ không làm điều này):
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
Nếu bạn đặt tất cả những thứ đó vào /etc/rc.local
và bao gồm theo sau ở cuối, mọi thứ sẽ ở trong bộ đệm càng sớm càng tốt sau khi khởi động (chỉ làm điều này nếu hệ thống tệp của bạn thực sự phù hợp với RAM):
(nice find / -type f -and -not -path '/sys/*' -and -not -path '/proc/*' -print0 2>/dev/null | nice ionice -c 3 wc -l --files0-from - > /dev/null)&
Hoặc một chút thay thế đơn giản mà có thể làm việc tốt hơn (bộ nhớ cache chỉ /home
và /usr
, chỉ làm điều này nếu bạn /home
và /usr
thực sự phù hợp trong RAM):
(nice find /home /usr -type f -print0 | nice ionice -c 3 wc -l --files0-from - > /dev/null)&