Bộ nhớ đệm / tải trước các tệp trên Linux vào RAM


74

Tôi có một máy chủ khá cũ có 4GB RAM và nó phục vụ khá nhiều tệp giống nhau cả ngày, nhưng nó đang làm như vậy từ ổ cứng trong khi 3GB RAM là "miễn phí".

Bất cứ ai đã từng thử chạy ram-drive đều có thể chứng kiến ​​rằng nó tuyệt vời về tốc độ. Việc sử dụng bộ nhớ của hệ thống này thường không bao giờ cao hơn 1GB / 4GB, vì vậy tôi muốn biết liệu có cách nào để sử dụng bộ nhớ bổ sung đó cho mục đích tốt hay không.

  • Có thể nói hệ thống tập tin luôn phục vụ một số tập tin nhất định ra khỏi RAM không?
  • Có phương pháp nào khác tôi có thể sử dụng để cải thiện khả năng đọc tệp bằng cách sử dụng RAM không?

Cụ thể hơn, tôi không tìm kiếm một 'hack' ở đây. Tôi muốn các cuộc gọi hệ thống tệp để phục vụ các tệp từ RAM mà không cần phải tạo ổ đĩa ram và sao chép các tệp ở đó theo cách thủ công. Hoặc ít nhất là một kịch bản làm điều này cho tôi.

Các ứng dụng có thể có ở đây là:

  • Các máy chủ web với các tệp tĩnh được đọc rất nhiều
  • Máy chủ ứng dụng có thư viện lớn
  • Máy tính để bàn có quá nhiều RAM

Có ý kiến ​​gì không?

Biên tập:

  • Tìm thấy điều này rất nhiều thông tin: Bộ đệm ẩn trang Linux và pdflush
  • Như Zan đã chỉ ra, bộ nhớ không thực sự miễn phí. Ý tôi là nó không được các ứng dụng sử dụng và tôi muốn kiểm soát những gì nên lưu trong bộ nhớ.

1
Tôi cũng đang tìm kiếm một cái gì đó dọc theo những dòng này. Tôi không nghĩ rằng bộ nhớ đệm khối hệ thống tập tin chung là câu trả lời. Giả sử tôi muốn khối đĩa X luôn được lưu trữ. Một cái gì đó truy cập nó, và kernel lưu trữ nó. Cho đến nay rất tốt, nhưng quá trình tiếp theo muốn khối Y, vì vậy kernel loại bỏ khối X của tôi và thay vào đó lưu trữ Y. Quá trình tiếp theo muốn X sẽ phải đợi nó ra khỏi đĩa; đó là những gì tôi muốn tránh Những gì tôi muốn (và những gì tôi nghĩ rằng poster ban đầu cũng vậy) là phủ lớp bộ đệm ghi lên một hệ thống tệp sẽ đảm bảo các tệp luôn luôn

1
Cho rằng sự đồng thuận dường như là Linux đã lưu trữ các tệp được sử dụng thường xuyên cho bạn, tôi tự hỏi liệu bạn có thực sự quản lý để thực hiện bất kỳ cải tiến nào bằng lời khuyên tìm thấy ở đây không. Dường như với tôi, việc cố gắng kiểm soát bộ nhớ đệm thủ công có thể hữu ích để làm nóng bộ đệm, nhưng với kiểu sử dụng mà bạn mô tả ("phục vụ cùng một tệp cả ngày"), nó sẽ không giúp máy chủ được làm nóng nhiều, nếu có
Nate CK

Bạn nói rằng bạn không tìm kiếm hack, nhưng Linux đã làm những gì bạn muốn làm theo mặc định. Phương trình sau: "phục vụ cùng một tệp cả ngày" + "báo cho hệ thống tệp luôn luôn phục vụ một số tệp nhất định ngoài RAM" bằng "Hack" theo định nghĩa. Bạn đã thực sự nhận thấy bất kỳ cải tiến hiệu suất? Theo kinh nghiệm của tôi, bộ nhớ cache của Linux là sự hiểu biết về hệ thống tập tin của bạn.
Mike S

2
Để làm rõ, linux thực hiện các tệp bộ đệm, nhưng siêu dữ liệu được xác thực cho mỗi tệp cho mỗi yêu cầu. Khi quay gỉ, trên một máy chủ web bận rộn với rất nhiều tệp nhỏ, điều đó vẫn có thể gây ra tranh chấp IO và làm hao mòn ổ đĩa sớm. Nội dung và tập lệnh tĩnh có thể được rsync vào / dev / shm hoặc gắn tmpfs tùy chỉnh khi khởi động ứng dụng. Tôi đã làm điều này trong một vài thập kỷ và các ổ đĩa của tôi không bị hao mòn sớm. Ngoài ra các trang web của tôi chịu được tải nặng nổ tốt hơn nhiều theo cách này. Điều này giúp cho bất cứ điều gì từ phần cứng doanh nghiệp đắt nhất đến phần cứng commmodity.
Aaron

Câu trả lời:


57

vmtouch có vẻ như là một công cụ tốt cho công việc.

Điểm nổi bật:

  • truy vấn bao nhiêu của một thư mục được lưu trữ
  • truy vấn bao nhiêu tệp được lưu trữ (cũng là trang nào, biểu diễn đồ họa)
  • tải tập tin vào bộ nhớ cache
  • xóa tập tin khỏi bộ nhớ cache
  • khóa tập tin trong bộ nhớ cache
  • chạy như daemon

hướng dẫn sử dụng vmtouch

EDIT: Cách sử dụng như đã hỏi trong câu hỏi được liệt kê trong ví dụ 5 trên vmtouch Hompage

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: Như đã lưu ý trong các bình luận, hiện đã có kho git .


5
Đối với người xem trong tương lai, hãy thử sử dụng kho lưu trữ gm vmtouch thay vì làm theo các hướng dẫn trên trang được liên kết. Bằng cách đó bạn có được một tệp thực hiện và có thể kéo các bản cập nhật.
ngẫu nhiên

Có vẻ như có giới hạn về kích thước của tệp (4GB). Có sự thay thế nào khác không?
Alix Axel

Ok, đây là trường hợp sử dụng thực tế của tôi: một RPi1 với thẻ SD cũ, ở đâu đó đang làm Stuff. Trước khi tôi thực hiện một chuyến đi đến đó và thay thế thẻ (và có thể là nguồn điện), tôi muốn HĐH chạm vào thẻ một cách tiết kiệm, tốt nhất là không bao giờ. Bộ nhớ cache FS là tốt nhưng ngoài tầm kiểm soát của tôi; / bin và / sbin đã có trên tmpfs, việc nhận / home / user cũng có những nhược điểm khác. vmtouchrất phù hợp với thị trường ngách này.
Piskvor

vmtouch hoạt động khác với tmpfs như thế nào?
Edward Torvalds

26

Điều này cũng có thể sử dụng tiện ích vmtouch Virtual Memory Toucher .

Công cụ cho phép bạn kiểm soát bộ đệm hệ thống tập tin trên hệ thống Linux. Bạn có thể buộc hoặc khóa một tệp hoặc thư mục cụ thể trong hệ thống con bộ đệm VM hoặc sử dụng nó để kiểm tra xem phần nào của tệp / thư mục được chứa trong VM.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

Hoặc là...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

3
Đây là một tiện ích tuyệt vời và thực hiện chính xác những gì OP yêu cầu. Giá như anh chấp nhận điều này như một câu trả lời.
laebshade

Bạn có biết nếu điều này hoạt động với ZFS?
CMCDragonkai

1
@CMCDragonkai Tôi không nghĩ nó cần thiết với ZFS ... Hãy nghĩ: ARC và L2ARC .
ewwhite

22

Thủ thuật của một người nghèo để đưa nội dung vào bộ đệm của hệ thống tập tin là chỉ đơn giản là chuyển nó và chuyển hướng nó sang / dev / null.


1
Đồng ý. Và nếu bạn muốn đảm bảo một số tệp được lưu trong bộ nhớ cache, hãy tạo một công việc catđịnh kỳ là tệp thành / dev / null theo định kỳ
Josh

18

Linux sẽ lưu trữ càng nhiều đĩa IO trong bộ nhớ càng tốt. Đây là những gì bộ nhớ cache và bộ nhớ thống kê bộ đệm. Nó có thể sẽ làm một công việc tốt hơn bạn sẽ lưu trữ những thứ phù hợp.

Tuy nhiên, nếu bạn khăng khăng lưu trữ dữ liệu của mình trong bộ nhớ, bạn có thể tạo ổ đĩa ram bằng cách sử dụng tmpfs hoặc ramfs. Sự khác biệt là ramfs sẽ phân bổ tất cả bộ nhớ mà bạn yêu cầu, vì tmpfs sẽ chỉ sử dụng bộ nhớ mà thiết bị khối của bạn đang sử dụng. Trí nhớ của tôi hơi rỉ sét, nhưng bạn sẽ có thể làm được:

 # mount -t ramfs ram /mnt/ram 

hoặc là

 # mount -t tmpfs tmp /mnt/tmp

và sau đó sao chép dữ liệu của bạn vào thư mục. Rõ ràng, khi bạn tắt máy hoặc ngắt kết nối phân vùng đó, dữ liệu của bạn sẽ bị mất.


1
Cảm ơn câu trả lời của bạn, nhưng đây rõ ràng là điều tôi muốn tránh. Mặt khác, tôi chỉ viết kịch bản để máy tính tạo ramdrive, sao chép các tệp và liên kết một cách tượng trưng với ramdrive. Nhưng sau đó dữ liệu của tôi không nhất quán. Tôi đã hy vọng một hệ thống tập tin nơi tôi có thể 'gắn thẻ' một số tệp nhất định sẽ được lưu trong bộ nhớ. Nhưng có lẽ tôi hơi quá lạc quan.
Andrioid

3
Bạn "gắn thẻ" các tệp sẽ được lưu vào bộ đệm bằng cách truy cập chúng.
womble

9
Nếu chỉ có một số cách để tự động gắn thẻ các tệp được sử dụng phổ biến nhất.
David Pashley

4
Blimey, mỉa mai không đi du lịch tốt làm điều đó :)
David Pashley

2
Vâng, cảm ơn. Tôi hiểu khái niệm về bộ nhớ đệm IO. Tôi thậm chí đã giải thích nó trong câu trả lời của tôi. Có vẻ như bạn đã không đọc bình luận tinh tế rằng đó là châm biếm.
David Pashley

18

Sau khi đọc nhiều về các tính năng hoán đổi kernel và bộ đệm trang 2.6, tôi đã tìm thấy 'fcoretools'. Trong đó bao gồm hai công cụ;

  • fincore: Sẽ tiết lộ ứng dụng đã lưu trữ bao nhiêu trang trong bộ nhớ lõi
  • fadvise: Cho phép bạn thao tác bộ nhớ lõi (bộ đệm trang).

(Trong trường hợp người khác thấy điều này thú vị, tôi sẽ đăng bài này ở đây)


1
Tôi hình dung có một chương trình để làm điều đó ở đâu đó. +1
Brad Gilbert

7

Có hai cài đặt kernel có thể giúp đáng kể ngay cả khi không sử dụng các công cụ khác:

trao đổi

cho kernel linux biết cách tích cực sử dụng trao đổi. Trích dẫn bài viết Wikipedia:

Swappiness là một thuộc tính cho nhân Linux, thay đổi sự cân bằng giữa việc hoán đổi bộ nhớ thời gian chạy, trái ngược với việc thả các trang khỏi bộ đệm của trang hệ thống. Swappiness có thể được đặt thành các giá trị từ 0 đến 100. Giá trị thấp có nghĩa là hạt nhân sẽ cố gắng tránh trao đổi càng nhiều càng tốt trong đó giá trị cao hơn thay vào đó sẽ khiến hạt nhân tích cực cố gắng sử dụng không gian hoán đổi. Giá trị mặc định là 60 và đối với hầu hết các hệ thống máy tính để bàn, việc đặt nó thành 100 có thể ảnh hưởng đến hiệu suất tổng thể, trong khi đặt giá trị thấp hơn (thậm chí 0) có thể cải thiện khả năng tương tác (giảm độ trễ phản hồi.)

vfs_cache_pressure

Trích dẫn từ vm.txt :

Điều khiển xu hướng của kernel để lấy lại bộ nhớ được sử dụng để lưu vào bộ đệm của các đối tượng thư mục và inode.

Với giá trị mặc định của vfs_cache_pressure = 100, hạt nhân sẽ cố gắng lấy lại các vết lõm và inodes với tốc độ "công bằng" đối với việc lấy lại pagecache và hoán đổi. Giảm vfs_cache_pressure làm cho hạt nhân thích giữ lại bộ đệm răng và inode. ...


Bằng cách đặt swappinessmức cao (như 100), kernel sẽ di chuyển mọi thứ mà nó không cần trao đổi, giải phóng RAM cho các tập tin lưu trữ. Và bằng cách đặt vfs_cache_pressurethấp hơn (giả sử là 50, không phải 0!), Nó sẽ ưu tiên các tệp bộ đệm thay vì giữ dữ liệu ứng dụng trong RAM.

. để giữ các nguồn và đầu ra được biên dịch được lưu trong bộ nhớ cache trong RAM, giúp tăng tốc quá trình đáng kể.)


3

Tôi rất nghi ngờ rằng nó thực sự đang phục vụ các tệp từ đĩa có RAM 3 GB miễn phí. Bộ nhớ đệm tập tin Linux là rất tốt.

Nếu bạn đang nhìn thấy đĩa IO, tôi sẽ xem xét cấu hình ghi nhật ký của bạn. Nhiều nhật ký được đặt là không có bộ đệm, để đảm bảo rằng thông tin nhật ký mới nhất có sẵn trong trường hợp xảy ra sự cố. Trong các hệ thống phải nhanh bất kể, sử dụng IO log được đệm hoặc sử dụng máy chủ nhật ký từ xa.


Đúng vậy, tôi chỉ muốn kiểm soát những gì đang được lưu trữ.
Andrioid

3

Nếu bạn có nhiều bộ nhớ, bạn có thể chỉ cần đọc trong các tệp bạn muốn lưu trữ với mèo hoặc tương tự. Linux sau đó sẽ làm tốt công việc giữ nó xung quanh.


3

Bạn có thể có một chương trình chỉ mmaplà các tệp của bạn sau đó vẫn chạy.


3
Đó là khá nhiều những gì 'fadvise' (fcoretools) làm, theo như tôi có thể nói.
Andrioid

0

Có nhiều hệ thống ramfs khác nhau mà bạn có thể sử dụng (ví dụ: ramfs, tmpfs), nhưng nói chung nếu các tệp thực sự được đọc thường xuyên, chúng sẽ nằm trong bộ đệm của hệ thống tệp của bạn. Nếu bộ tệp làm việc của bạn lớn hơn ram miễn phí, thì các tệp sẽ bị xóa khỏi tệp đó - nhưng nếu bộ làm việc của bạn lớn hơn ram miễn phí, thì bạn cũng sẽ không phù hợp với ramdisk.

Kiểm tra đầu ra của lệnh "miễn phí" trong trình bao - giá trị trong cột cuối cùng, trong "Bộ nhớ cache", là bao nhiêu ram miễn phí của bạn đang được sử dụng cho bộ đệm hệ thống tệp.


0

Đối với câu hỏi sau của bạn, đảm bảo rằng RAM của bạn đang ngồi trên các kênh bộ nhớ khác nhau để bộ xử lý có thể tìm nạp dữ liệu song song.


0

Tôi nghĩ rằng điều này có thể được giải quyết tốt hơn ở cấp độ ứng dụng. Ví dụ, có thể có các máy chủ web chuyên dụng cho việc này hoặc bạn có thể xem xét mod_cache với Apache. Nếu bạn có một mục tiêu cụ thể, chẳng hạn như phục vụ nội dung web nhanh hơn, thì bạn có thể nhận được các cải tiến từ loại điều tôi nghĩ.

Nhưng câu hỏi của bạn là về bản chất, hệ thống con bộ nhớ Linux được thiết kế để cung cấp việc sử dụng RAM tốt nhất. Nếu bạn muốn nhắm mục tiêu một số loại hiệu suất nhất định, hãy xem xét tìm kiếm mọi thứ trong / Proc / sys / vm.

Gói fcoretools rất thú vị, tôi sẽ quan tâm đến bất kỳ bài viết nào về ứng dụng của nó ... Liên kết này nói về các cuộc gọi hệ thống thực tế được sử dụng trong một ứng dụng.


1
tìm / var / lib / mysql | xargs fadvise -willneed (bẩn, nhưng nó sẽ cung cấp quyền truy cập nhanh hơn vào các tệp cơ sở dữ liệu; làm ví dụ)
Andrioid

Hack rất tốt, nhưng hack như vậy không vô hiệu hóa rất nhiều fsyncs chờ đợi từ mysql :( fsyncs là cần thiết để đảm bảo ACID (Nguyên tử, nhất quán, cô lập, độ bền).
osgx

0

Các máy tính để bàn (ví dụ: Ubuntu) đã sử dụng các tệp tải trước (ít nhất là các thư viện dùng chung phổ biến) vào bộ nhớ khi khởi động. Nó được sử dụng để tăng tốc thời gian khởi động và khởi động của các bloarware khác nhau như FF, OO, KDE và Gnome (với trình phát triển bloat-mailer).

Công cụ này có tên là readahead http://packages.ubfox.com/dapper/admin/readahead

Ngoài ra còn có tòa nhà tương ứng: readahead (2) http://linux.die.net/man/2/readahead

Ngoài ra còn có dự án tải trước daemon: http://linux.die.net/man/8/preload



0

tôi vừa thử dd if = / dev / yourrootpartition của = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

nó không cho tôi sự kiểm soát mà bạn mong muốn nhưng ít nhất nó cũng cố sử dụng bộ nhớ lãng phí



0

Không chính xác những gì được hỏi, nhưng tôi sử dụng

tìm BASE_DIRECTORY -type f -exec cat {}> / dev / null \;

để kích hoạt khởi tạo các tệp trong một khối AWS được tạo từ ảnh chụp nhanh. Nó tập trung hơn khuyến nghị chính thức về việc sử dụng dd nếu bạn chỉ muốn đọc một số tệp.


-1

Đôi khi tôi có thể muốn lưu trữ các tập tin trong một thư mục nhất định và các thư mục con của nó. Tôi chỉ cần vào thư mục này và thực hiện như sau:

tìm thấy . -exec cp {} / dev / null \;

Và những tập tin đó được lưu trữ

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.