it-swarm-vi.tech

Lưu trữ / tải trước các tệp trên Linux vào RAM

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ể yêu cầu hệ thống tệp luôn phục vụ một số tệp nhất định ngoà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 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 tập lệnh thực hiện đ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 thông tin 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ớ.
76
Andrioid

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 nhận xét, hiện đã có kho git khả dụng.

60
seeker

Đ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 VM hệ thống con bộ đệm 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
26
ewwhite

Thủ thuật của một người nghèo để lấy 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.

23
cagenut

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

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.

18
David Pashley

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)

18
Andrioid

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:

swappiness

cho kernel linux biết nó nên sử dụng trao đổi như thế nào. 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 swappiness high (như 100), hạt nhân 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 bộ đệm. Và bằng cách đặt vfs_cache_pressure thấ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.

(Tôi làm việc trên một dự án lớn Java và mỗi lần tôi chạy nó, nó đã mất rất nhiều RAM và xóa bộ đệm đĩa, vì vậy lần sau tôi đã biên dịch dự án mọi thứ được đọc lại từ đĩa. Bằng cách điều chỉnh hai cài đặt này, tôi quản lý để giữ các nguồn và đầu ra được biên dịch được lưu trong bộ nhớ cache, giúp tăng tốc quá trình đáng kể.)

7
Petr Pudlák

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

Nếu bạn đang 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ể, hãy sử dụng bộ đệm log IO hoặc sử dụng máy chủ nhật ký từ xa.

3
Zan Lynx

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

3
Brad Gilbert

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

http://www.coker.com.au/memlockd/ thực hiện điều này

mặc dù bạn thực sự không cần nó, linux sẽ làm rất tốt việc lưu trữ các tệp bạn đang sử dụng.

0
Justin

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 Shell - 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
Daniel Lawson

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.

0
Federico

Đối với câu hỏi sau của bạn, hãy đả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
sybreon

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. Chẳng hạn, 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.

0
Kyle Brandt

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
Bogus Name

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 khác nhau bloarware như FF, OO, KDE và Gnome (với trình phát triển bloat-mailer).

Công cụ có tên readahead http://packages.ub Ubuntu.com/dapper/admin/readahead

Ngoài ra còn có tòa nhà chọc trời 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
osgx

tôi sử dụng chuỗi find/-name của ký tự ngẫu nhiên, nó giúp ích rất nhiều

0
user50472