Vm.min_free_kbytes là gì và làm thế nào để điều chỉnh nó?

What Is Vm Min_free_kbytes



Vm.min_free_kbytes sysctl tunable cho nhân linux là gì và nó nên được đặt thành giá trị nào? Chúng ta sẽ nghiên cứu tham số này và cách nó tác động đến hệ thống linux đang chạy trong bài viết này. Chúng tôi sẽ kiểm tra tác động của nó đối với bộ nhớ cache của trang hệ điều hành và trên các mallocs và lệnh hệ thống miễn phí hiển thị khi tham số này được đặt. Chúng tôi sẽ đưa ra một số phỏng đoán đã được giáo dục về các giá trị lý tưởng cho điều chỉnh này và chúng tôi sẽ hướng dẫn cách đặt vm.min_free_kbytes vĩnh viễn để tồn tại khi khởi động lại. Vì vậy, chúng ta hãy đi.

Cách hoạt động của vm.min_free_kbytes

Hệ thống có thể cần cấp phát bộ nhớ để đảm bảo hệ thống hoạt động bình thường. Nếu hạt nhân cho phép cấp phát tất cả bộ nhớ, nó có thể gặp khó khăn khi cần bộ nhớ cho các hoạt động thường xuyên để giữ cho hệ điều hành hoạt động trơn tru. Đó là lý do tại sao hạt nhân cung cấp vm.min_free_kbytes có thể điều chỉnh được. Bộ có thể điều chỉnh sẽ buộc trình quản lý bộ nhớ của nhân phải giữ ít nhất X lượng bộ nhớ trống. Đây là định nghĩa chính thức từ tài liệu nhân linux : Điều này được sử dụng để buộc Linux VM giữ trống số kilobyte tối thiểu. Máy ảo sử dụng số này để tính giá trị [WMARK_MIN] hình mờ cho mỗi vùng lowmem trong hệ thống. Mỗi vùng lowmem nhận được một số trang miễn phí được đặt trước tương ứng với kích thước của nó. Cần một số lượng bộ nhớ tối thiểu để đáp ứng phân bổ PF_MEMALLOC; nếu bạn đặt mức này thấp hơn 1024KB, hệ thống của bạn sẽ bị hỏng một cách tinh vi và dễ bị bế tắc khi tải cao. Đặt quá cao này sẽ OOM máy của bạn ngay lập tức.







Xác thực vm.min_free_kbytes Works

Để kiểm tra xem cài đặt min_free_kbytes có hoạt động như thiết kế hay không, tôi đã tạo một phiên bản ảo linux chỉ với 3,75 GB RAM. Sử dụng lệnh miễn phí dưới đây để phân tích hệ thống:



#miễn phí -NS



Nhìn vào tiện ích bộ nhớ trống ở trên bằng cách sử dụng cờ -m để có các giá trị được in bằng MB. Tổng bộ nhớ là 3,5 đến 3,75 GB bộ nhớ. 121 MB bộ nhớ được sử dụng, 3,3 GB bộ nhớ trống, 251 MB được sử dụng bởi bộ đệm đệm. Và có sẵn bộ nhớ 3,3 GB.





Bây giờ chúng ta sẽ thay đổi giá trị của vm.min_free_kbytes và xem tác động của nó lên bộ nhớ hệ thống là gì. Chúng tôi sẽ lặp lại giá trị mới tới hệ thống tệp ảo proc để thay đổi giá trị tham số hạt nhân như sau:

# echo 1500000> / proc / sys / vm / min_free_kbytes
# sysctl vm.min_free_kbytes



Bạn có thể thấy rằng thông số đã được thay đổi khoảng 1,5 GB và đã có hiệu lực. Bây giờ chúng ta hãy sử dụng miễn phí lệnh một lần nữa để xem bất kỳ thay đổi nào được hệ thống công nhận.

#miễn phí -NS

Bộ nhớ trống và bộ đệm đệm không thay đổi theo lệnh, nhưng lượng bộ nhớ được hiển thị là có sẵn đã được giảm từ 3327 xuống 1222 MB. Đây là mức giảm gần đúng của sự thay đổi trong thông số xuống bộ nhớ trống tối thiểu 1,5 GB.

Bây giờ, chúng ta hãy tạo một tệp dữ liệu 2GB và sau đó xem việc đọc tệp đó vào bộ nhớ đệm đệm có tác dụng gì đối với các giá trị. Đây là cách tạo một tệp dữ liệu 2GB trong 2 dòng bash script bên dưới. Tập lệnh sẽ tạo một tệp ngẫu nhiên 35MB bằng lệnh dd và sau đó sao chép nó 70 lần vào một tệp mới tập tin dữ liệu đầu ra:

# dd if = / dev / random of = / root / d1.txt count = 1000000
# cho tôi trong `seq 1 70`; làm echo $ i; cat /root/d1.txt >> / root / data_file; xong

Hãy đọc tệp và bỏ qua nội dung bằng cách đọc và chuyển hướng tệp đến / dev / null như sau:

#con mèotập tin dữ liệu> /nhà phát triển/vô giá trị

Được rồi, điều gì đã xảy ra với bộ nhớ hệ thống của chúng tôi với tập hợp các thao tác này, hãy kiểm tra ngay bây giờ:

#miễn phí -NS

Phân tích kết quả trên. Chúng tôi vẫn còn 1,8 GB bộ nhớ trống nên hạt nhân đã bảo vệ một phần lớn bộ nhớ được dự trữ do cài đặt min_free_kbytes của chúng tôi. Bộ nhớ đệm đệm đã sử dụng 1691 MB, nhỏ hơn tổng kích thước tệp dữ liệu của chúng tôi là 2,3 GB. Rõ ràng là toàn bộ tập tin dữ liệu không thể được lưu trữ trong bộ đệm do thiếu bộ nhớ khả dụng để sử dụng cho bộ đệm đệm. Chúng tôi có thể xác nhận rằng toàn bộ tệp không được lưu trữ trong bộ nhớ cache nhưng định thời gian lặp lại các lần cố gắng đọc tệp. Nếu nó đã được lưu vào bộ nhớ cache, sẽ mất một phần giây để đọc tệp. Hãy thử nó.

# time cat data_file> / dev / null
# time cat data_file> / dev / null

Quá trình đọc tệp mất gần 20 giây, có nghĩa là gần như chắc chắn không phải tất cả đều được lưu vào bộ nhớ đệm.

Sau khi xác thực cuối cùng, hãy giảm vm.min_free_kbytes để cho phép bộ nhớ cache của trang có nhiều chỗ hơn để hoạt động và chúng ta có thể mong đợi bộ nhớ cache hoạt động và việc đọc tệp nhanh hơn nhiều.

# echo 67584> / proc / sys / vm / min_free_kbytes
# time cat data_file> / dev / null
# time cat data_file> / dev / null

Với bộ nhớ bổ sung có sẵn để lưu vào bộ nhớ đệm, thời gian đọc tệp đã giảm từ 20 giây trước đây xuống còn 0,364 giây với tất cả trong bộ nhớ cache.

Tôi tò mò muốn làm một thử nghiệm khác. Điều gì xảy ra với các cuộc gọi malloc để cấp phát bộ nhớ từ chương trình C khi đối mặt với cài đặt vm.min_free_kbytes thực sự cao này. Nó sẽ hỏng malloc? Hệ thống sẽ chết? Trước tiên, hãy đặt lại cài đặt vm.min_free_kbytes thành giá trị thực sự cao để tiếp tục thử nghiệm của chúng tôi:

#quăng đi 1500000 > /phần trăm/sys/vm/min_free_kbytes

Hãy cùng nhìn lại bộ nhớ trống của chúng ta:

Về mặt lý thuyết, chúng tôi có 1,9 GB miễn phí và 515 MB khả dụng. Hãy sử dụng một chương trình kiểm tra mức độ căng thẳng có tên là stress-ng để sử dụng một số bộ nhớ và xem chúng ta thất bại ở đâu. Chúng tôi sẽ sử dụng trình kiểm tra vm và cố gắng phân bổ 1 GB bộ nhớ. Vì chúng tôi chỉ đặt trước 1,5 GB trên hệ thống 3,75 GB, tôi đoán điều này sẽ hoạt động.

# stress-ng --vm 1 --vm-byte 1G - thời gian chờ 60 giây
căng thẳng: thông tin:[17537]điều động lợn:1vm
căng thẳng: thông tin:[17537]phân bổ bộ nhớ cache: kích thước bộ nhớ cache mặc định: 46080K
căng thẳng: thông tin:[17537]chạy thành công đã hoàn thànhtrong60.09 giây(1tối thiểu,0,09khô)
# stress-ng --vm 2 --vm-byte 1G - thời gian chờ 60 giây
# stress-ng --vm 3 --vm-byte 1G - thời gian chờ 60 giây

Hãy thử lại với nhiều công nhân hơn, chúng ta có thể thử 1, 2, 3, 4 công nhân và đến một lúc nào đó nó sẽ thất bại. Trong thử nghiệm của tôi, nó đã vượt qua với 1 và 2 công nhân nhưng không thành công với 3 công nhân.

Hãy đặt lại vm.min_free_kbytes thành một số thấp và xem liệu điều đó có giúp chúng ta chạy 3 bộ kích thích bộ nhớ với mỗi bộ nhớ 1GB trên hệ thống 3,75GB hay không.

# echo 67584> / proc / sys / vm / min_free_kbytes
# stress-ng --vm 3 --vm-byte 1G - thời gian chờ 60 giây

Lần này nó chạy thành công mà không có lỗi, tôi đã thử nó hai lần mà không có vấn đề gì. Vì vậy, tôi có thể kết luận rằng có một sự khác biệt về hành vi của việc có nhiều bộ nhớ hơn cho malloc, khi giá trị vm.min_free_kbytes được đặt thành giá trị thấp hơn.

Cài đặt mặc định cho vm.min_free_kbytes

Giá trị mặc định cho cài đặt trên hệ thống của tôi là 67584, chiếm khoảng 1,8% RAM trên hệ thống hoặc 64 MB. Vì lý do an toàn trên một hệ thống bị tấn công mạnh, tôi sẽ có xu hướng tăng nó lên một chút có lẽ lên 128MB để cho phép bộ nhớ trống được dự trữ nhiều hơn, tuy nhiên đối với mức sử dụng trung bình, giá trị mặc định có vẻ đủ hợp lý. Tài liệu chính thức cảnh báo về việc làm cho giá trị quá cao. Đặt nó thành 5 hoặc 10% RAM hệ thống có thể không phải là mục đích sử dụng của cài đặt này và quá cao.

Đặt vm.min_free_kbytes để tồn tại khi khởi động lại

Để đảm bảo cài đặt có thể tồn tại khi khởi động lại và không được khôi phục về giá trị mặc định khi khởi động lại, hãy đảm bảo cài đặt sysctl ổn định bằng cách đặt giá trị mới mong muốn vào tệp /etc/sysctl.conf.

Phần kết luận

Chúng tôi đã thấy rằng có thể điều chỉnh nhân vm.min_free_kbytes linux và có thể dự trữ bộ nhớ trên hệ thống để đảm bảo hệ thống ổn định hơn, đặc biệt là trong quá trình sử dụng nhiều và phân bổ nhiều bộ nhớ. Cài đặt mặc định có thể hơi quá thấp, đặc biệt là trên hệ thống bộ nhớ cao và cần được xem xét tăng một cách cẩn thận. Chúng tôi đã thấy rằng bộ nhớ được dành riêng bởi bộ điều chỉnh này ngăn bộ nhớ cache của hệ điều hành sử dụng tất cả bộ nhớ và cũng ngăn một số hoạt động sai lệch sử dụng tất cả bộ nhớ.