Linux: cần bao nhiêu đĩa I / O để đọc một tệp? Làm thế nào để giảm thiểu nó? [bản sao]


10

Theo bài viết này trên Haystack của Facebook:

" Do cách các thiết bị NAS quản lý siêu dữ liệu thư mục, việc đặt hàng ngàn tệp trong thư mục là vô cùng hiệu quả vì sơ đồ khối của thư mục quá lớn để thiết bị được lưu trữ hiệu quả trong bộ nhớ cache. Do đó, thông thường phải chịu hơn 10 thao tác đĩa để truy xuất Sau khi giảm kích thước thư mục xuống hàng trăm hình ảnh trên mỗi thư mục, hệ thống kết quả vẫn sẽ phải chịu 3 thao tác đĩa để tìm nạp hình ảnh: một để đọc siêu dữ liệu thư mục vào bộ nhớ, một giây để tải inode vào bộ nhớ và thứ ba để đọc nội dung. le. "

Tôi đã giả định rằng siêu dữ liệu & inode của thư mục hệ thống tập tin sẽ luôn được lưu trữ trong RAM bởi HĐH và một tệp đọc thường chỉ cần 1 đĩa IO.

Đây có phải là vấn đề "nhiều đĩa IO để đọc một tệp" được nêu trong bài báo đó là duy nhất cho các thiết bị NAS hay Linux cũng có vấn đề tương tự?

Tôi đang dự định chạy một máy chủ Linux để phục vụ hình ảnh. Bất kỳ cách nào tôi có thể giảm thiểu số lượng IO của đĩa - lý tưởng nhất là đảm bảo HĐH lưu trữ tất cả dữ liệu thư mục & inode trong RAM và mỗi lần đọc tệp sẽ chỉ yêu cầu không quá 1 đĩa IO?


1
Không phải là một câu trả lời cho câu hỏi, nhưng bạn luôn có thể sử dụng Varnish (Facebook sử dụng nó) để duy trì các tệp trong bộ nhớ. Theo cách này nếu một hình ảnh trở nên nóng (rất nhiều yêu cầu cho cùng một tệp), thì IO sẽ hoàn toàn không được sử dụng để phục vụ nó

Darhazer - Varnish sẽ không trợ giúp ở đây vì bộ đệm của tệp Linux (mà Varnish dựa vào) đã lưu trữ các tệp nóng trong bộ nhớ. Đặt Varnish trước Nginx để phục vụ tệp tĩnh không thực sự thêm bất cứ điều gì. Câu hỏi của tôi là về khi các tệp quá lớn / quá nhiều để được lưu trong bộ nhớ. Tôi vẫn muốn đảm bảo ít nhất dữ liệu thư mục & inodes được lưu vào bộ đệm để giảm IO đĩa xuống chỉ còn 1 mỗi lần đọc.

Nhiều hệ thống tập tin lưu trữ inode bên trong thư mục, giảm số lượng yêu cầu xuống một và tăng đáng kể khả năng xảy ra lỗi bộ đệm. Nhưng đây không phải là một câu hỏi lập trình.
Ben Voigt

Bạn có thể thay đổi kích thước khối của hệ thống tệp khi tạo nó, ví dụ như mke2fs -b 32768để làm cho nó 32k. Tuy nhiên, điều này chỉ hữu ích nếu bạn không có các tệp nhỏ trên hệ thống tệp đó.

Câu trả lời:


5

Linux có cùng "vấn đề". Đây là một bài báo của một sinh viên của tôi được xuất bản hai năm trước, trong đó hiệu ứng được hiển thị trên Linux. Nhiều IO có thể đến từ nhiều nguồn:

  • Tra cứu thư mục trên mỗi cấp độ thư mục của đường dẫn tệp. Có thể cần phải đọc thư mục inode và một hoặc nhiều khối mục nhập thư mục
  • Inode của tập tin

Trong mẫu IO bình thường, bộ nhớ đệm thực sự hiệu quả và các nút, thư mục và khối dữ liệu được phân bổ theo cách làm giảm tìm kiếm. Tuy nhiên, phương pháp tra cứu thông thường, thực sự được chia sẻ bởi tất cả các hệ thống tệp, rất tệ cho lưu lượng ngẫu nhiên cao.

Dưới đây là một vài ý tưởng:

1) Bộ nhớ cache liên quan đến hệ thống tập tin giúp. Một bộ đệm lớn sẽ hấp thụ hầu hết các lần đọc. Tuy nhiên, nếu bạn muốn đặt một số đĩa vào một máy, tỷ lệ Đĩa-RAM sẽ giới hạn số lượng được lưu trong bộ nhớ cache.

2) Không sử dụng hàng triệu tệp nhỏ. Tổng hợp chúng thành các tệp lớn hơn và lưu trữ tên tệp và phần bù trong tệp.

3) Đặt hoặc lưu trữ siêu dữ liệu trên ổ SSD.

4) Và tất nhiên sử dụng một hệ thống tập tin không có định dạng thư mục trên đĩa hoàn toàn vô chính phủ. Một readdir không nên mất nhiều hơn thời gian tuyến tính và truy cập tệp trực tiếp lý tưởng chỉ là thời gian logarit.

Giữ các thư mục nhỏ (dưới 1000 hoặc hơn) không nên giúp nhiều vì bạn sẽ cần nhiều thư mục hơn cần được lưu trữ.


Và tất nhiên là sử dụng một hệ thống tập tin không có định dạng thư mục trên đĩa hoàn toàn cổ xưa. Một readdir không nên mất nhiều hơn thời gian tuyến tính và truy cập tệp trực tiếp lý tưởng chỉ là thời gian logarit.
jørgensen

Tôi đã thêm nó vào câu trả lời là điểm thứ 4
dmeister

@dmeister Thứ tốt. +1
Magellan

@dmeister Liên kết của bạn đã chết.
Don Scott

1

Điều này phụ thuộc vào hệ thống tập tin bạn dự định sử dụng. Trước khi đọc hệ thống dữ liệu tệp:

  • Đọc tập tin thư mục.
  • Đọc inode của tập tin của bạn
  • Đọc các lĩnh vực của tập tin của bạn

Nếu thư mục chứa số lượng lớn tệp, đây là sự đảm bảo lớn về bộ đệm.


Nếu bạn đang liệt kê các truy cập I / O, có thể thú vị hơn khi tách những truy cập được thực hiện bởi open()những truy cập được thực hiện bởi read(). Trang win.tue.nl/~aeb/linux/vfs/trail.html cho thấy một lối đi tốt đẹp của các khái niệm Kernel khác nhau có liên quan. (Có lẽ nó đã lỗi thời? Tôi sẽ không thể nói được.)
adl

0

Bạn có thể sẽ không thể giữ tất cả dữ liệu thư mục và inode trong RAM, vì bạn có thể có nhiều thư mục và dữ liệu inode hơn RAM. Bạn cũng có thể không muốn, vì RAM có thể được sử dụng tốt hơn cho các mục đích khác; trong ví dụ hình ảnh của bạn, bạn có muốn dữ liệu của hình ảnh được truy cập thường xuyên được lưu trong RAM hơn mục nhập thư mục cho hình ảnh được truy cập không thường xuyên không?

Điều đó nói rằng, tôi nghĩ rằng núm vfs_cache_pressure được sử dụng để kiểm soát điều này. "Khi vfs_cache_pressure = 0, hạt nhân sẽ không bao giờ lấy lại được răng và inodes do áp lực bộ nhớ và điều này có thể dễ dàng dẫn đến tình trạng hết bộ nhớ."

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.