Swappiness trên Linux là gì? (và cách thay đổi nó)

Tác giả sysadmin, T.Một 30, 2024, 09:06:32 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Swappiness trên Linux là gì? (và cách thay đổi nó)


Đừng nhầm lẫn với một tập tin trao đổi. Giá trị hoán đổi của Linux không liên quan gì đến lượng RAM được sử dụng trước khi bắt đầu hoán đổi. Đó là một sai lầm được báo cáo rộng rãi và được tin tưởng rộng rãi. Chúng tôi giải thích nó thực sự là gì.

1. Phá vỡ những lầm tưởng về Swapiness

Hoán đổi là một kỹ thuật trong đó dữ liệu trong Bộ nhớ truy cập ngẫu nhiên (RAM) được ghi vào một vị trí đặc biệt trên đĩa cứng của bạn---phân vùng trao đổi hoặc tệp hoán đổi---để giải phóng RAM.

Linux có một cài đặt gọi là giá trị trao đổi. Có rất nhiều nhầm lẫn về những gì cài đặt này kiểm soát. Mô tả không chính xác phổ biến nhất về khả năng hoán đổi là nó đặt ngưỡng sử dụng RAM và khi lượng RAM đã sử dụng đạt đến ngưỡng đó, quá trình hoán đổi sẽ bắt đầu.

Đây là một quan niệm sai lầm đã được lặp đi lặp lại thường xuyên đến nỗi bây giờ nó đã được thừa nhận là sự khôn ngoan. Nếu (gần như) mọi người khác nói với bạn rằng đó chính xác là cách hoạt động của tính thích thay đổi, tại sao bạn nên tin chúng tôi khi chúng tôi nói rằng không phải vậy?

Đơn giản. Chúng tôi sẽ chứng minh điều đó.

2. RAM của bạn được chia thành các vùng

Linux không coi RAM của bạn là một bộ nhớ lớn đồng nhất. Nó coi nó được chia thành một số khu vực khác nhau được gọi là khu vực. Những vùng nào hiện diện trên máy tính của bạn tùy thuộc vào đó là 32-bit hay 64-bit. Đây là mô tả đơn giản về các vùng có thể có trên máy tính kiến trúc x86.

  • Truy cập bộ nhớ trực tiếp (DMA) : Đây là mức bộ nhớ thấp 16 MB. Vùng này có tên như vậy bởi vì cách đây rất lâu, đã có những máy tính chỉ có thể truy cập bộ nhớ trực tiếp vào vùng bộ nhớ vật lý này.
  • Truy cập bộ nhớ trực tiếp 32 : Mặc dù có tên như vậy nhưng Truy cập bộ nhớ trực tiếp 32 (DMA32) là vùng chỉ có trong Linux 64-bit. Đó là bộ nhớ 4 GB thấp. Linux chạy trên máy tính 32 bit chỉ có thể thực hiện DMA với lượng RAM này (trừ khi chúng đang sử dụng nhân phần mở rộng địa chỉ vật lý (PAE)), đó là lý do vùng này có tên như vậy. Mặc dù trên máy tính 32 bit, nó được gọi là HighMem.
  • Bình thường : Trên máy tính 64-bit, bộ nhớ bình thường là tất cả những RAM trên 4GB (đại khái). Trên máy 32 bit, RAM nằm trong khoảng từ 16 MB đến 896 MB.
  • HighMem : Điều này chỉ tồn tại trên máy tính Linux 32-bit. Đó là tất cả RAM trên 896 MB, bao gồm cả RAM trên 4 GB trên các máy đủ lớn.

3. Giá trị PAGESIZE

RAM được phân bổ trong các trang có kích thước cố định. Kích thước đó được xác định bởi kernel khi khởi động bằng cách phát hiện kiến trúc của máy tính. Thông thường kích thước trang trên máy tính Linux là 4 Kbyte.

Bạn có thể xem kích thước trang của mình bằng lệnh: getconf

Mã nguồn [Chọn]
getconf PAGESIZE

4. Các vùng được gắn vào các nút

Các vùng được gắn vào các nút. Các nút được liên kết với Bộ xử lý trung tâm (CPU). Hạt nhân sẽ cố gắng phân bổ bộ nhớ cho một tiến trình chạy trên CPU từ nút được liên kết với CPU đó.

Khái niệm các nút được gắn với CPU cho phép các loại bộ nhớ hỗn hợp được cài đặt trong các máy tính nhiều CPU chuyên dụng, sử dụng kiến trúc Truy cập bộ nhớ không đồng nhất.

Đó là tất cả rất cao cấp. Máy tính Linux thông thường sẽ có một nút duy nhất, được gọi là nút số 0. Tất cả các vùng sẽ thuộc về nút đó. Để xem các nút và vùng trong máy tính của bạn, hãy nhìn vào bên trong /proc/buddyinfotệp. Chúng tôi sẽ sử dụng lessđể làm như vậy:

Mã nguồn [Chọn]
less /proc/buddyinfo
Đây là đầu ra từ máy tính 64-bit mà bài viết này đã nghiên cứu:

Mã nguồn [Chọn]
Node 0, zone DMA 1 1 1 0 2 1 1 0 1 1 3

Node 0, zone DMA32 2 67 58 19 8 3 3 1 1 1 17

Có một nút duy nhất, nút số 0. Máy tính này chỉ có 2 GB RAM nên không có vùng "Bình thường". Chỉ có hai vùng, DMA và DMA32.

Mỗi cột đại diện cho số lượng trang có sẵn ở một kích thước nhất định. Ví dụ: đối với vùng DMA32, đọc từ bên trái:

  • 2 : Có 2 trong số 2^( 0 *PAGESIZE) khối bộ nhớ.
  • 67 : Có 67 trong số 2^( 1 *PAGE_SIZE) khối bộ nhớ.
  • 58 : Có 58 trong số 2^( 2 *PAGESIZE) khối bộ nhớ khả dụng.
  • Và cứ thế, cho đến...
  • 17 : Có 17 trong số 2^( 512 *PAGESIZE) khối.

Nhưng thực sự, lý do duy nhất chúng ta xem xét thông tin này là để xem mối quan hệ giữa các nút và vùng.

5. Trang tệp và trang ẩn danh

Ánh xạ bộ nhớ sử dụng tập hợp các mục trong bảng trang để ghi lại trang bộ nhớ nào được sử dụng và để làm gì.

Ánh xạ bộ nhớ có thể là:

  • Tệp được sao lưu : Ánh xạ được sao lưu tệp chứa dữ liệu đã được đọc từ một tệp. Nó có thể là bất kỳ loại tập tin nào. Điều quan trọng cần lưu ý là nếu hệ thống giải phóng bộ nhớ này và cần lấy lại dữ liệu đó thì nó có thể được đọc lại từ tệp. Tuy nhiên, nếu dữ liệu đã được thay đổi trong bộ nhớ, những thay đổi đó sẽ cần được ghi vào tệp trên ổ cứng trước khi bộ nhớ có thể được giải phóng. Nếu điều đó không xảy ra, những thay đổi sẽ bị mất.
  • Ẩn danh : Bộ nhớ ẩn danh là ánh xạ bộ nhớ không có tệp hoặc thiết bị hỗ trợ. Các trang này có thể chứa bộ nhớ được các chương trình yêu cầu nhanh chóng để lưu giữ dữ liệu hoặc cho những thứ như ngăn xếp và vùng heap. Vì không có tệp nào đằng sau loại dữ liệu này nên phải dành một vị trí đặc biệt để lưu trữ dữ liệu ẩn danh. Nơi đó là phân vùng trao đổi hoặc tập tin trao đổi. Dữ liệu ẩn danh được ghi để trao đổi trước khi các trang ẩn danh được giải phóng.
  • Hỗ trợ thiết bị : Các thiết bị được đánh địa chỉ thông qua các tập tin thiết bị khối có thể được xử lý như thể chúng là các tập tin. Dữ liệu có thể được đọc từ chúng và ghi vào chúng. Ánh xạ bộ nhớ được hỗ trợ bởi thiết bị có dữ liệu từ một thiết bị được lưu trữ trong đó.
  • Chia sẻ : Nhiều mục trong bảng trang có thể ánh xạ tới cùng một trang RAM. Việc truy cập các vị trí bộ nhớ thông qua bất kỳ ánh xạ nào sẽ hiển thị cùng một dữ liệu. Các quy trình khác nhau có thể giao tiếp với nhau một cách rất hiệu quả bằng cách thay đổi dữ liệu trong các vị trí bộ nhớ được theo dõi chung này. Ánh xạ có thể ghi được chia sẻ là một phương tiện phổ biến để đạt được thông tin liên lạc giữa các quá trình hiệu suất cao.
  • Sao chép trên ghi : Sao chép trên ghi là một kỹ thuật phân bổ lười biếng. Nếu yêu cầu bản sao của tài nguyên đã có trong bộ nhớ thì yêu cầu sẽ được đáp ứng bằng cách trả lại ánh xạ tới tài nguyên ban đầu. Nếu một trong các quá trình "chia sẻ" tài nguyên cố gắng ghi vào nó, thì tài nguyên đó phải được sao chép thực sự trong bộ nhớ để cho phép thực hiện các thay đổi đối với bản sao mới. Vì vậy việc cấp phát bộ nhớ chỉ diễn ra ở lệnh ghi đầu tiên.

Để dễ dàng thay đổi, chúng ta chỉ cần quan tâm đến hai trang đầu tiên trong danh sách: trang tệp và trang ẩn danh.

6. Swappiness

Đây là mô tả về tính dễ thay đổi từ tài liệu Linux trên GitHub :

" Điều khiển này được sử dụng để xác định mức độ tích cực (sic) của kernel sẽ trao đổi các trang bộ nhớ. Giá trị cao hơn sẽ tăng mức độ tích cực, giá trị thấp hơn làm giảm lượng trao đổi. Giá trị 0 hướng dẫn kernel không bắt đầu trao đổi cho đến khi lượng còn trống và các trang được hỗ trợ bằng tệp nhỏ hơn vạch nước cao trong một vùng. Giá trị mặc định là 60. "

Nghe có vẻ giống như sự hoán đổi tăng hoặc giảm cường độ. Thật thú vị, nó nói rằng việc đặt tính dễ thay đổi thành 0 sẽ không tắt tính năng trao đổi. Nó hướng dẫn kernel không được trao đổi cho đến khi đáp ứng được một số điều kiện nhất định. Nhưng việc hoán đổi vẫn có thể xảy ra.

Hãy đào sâu hơn. Đây là định nghĩa và giá trị mặc định của vm_swappiness tệp mã nguồn kernel vmscan.c :

Mã nguồn [Chọn]
/*
* From 0.. 100. Higher means more swappy.
*/
int vm_swappiness = 60;

Giá trị hoán đổi có thể nằm trong khoảng từ 0 đến 100. Một lần nữa, nhận xét này chắc chắn có vẻ như giá trị hoán đổi có ảnh hưởng đến mức độ hoán đổi diễn ra, với con số cao hơn sẽ dẫn đến nhiều hoán đổi hơn.

Hơn nữa trong tệp mã nguồn, chúng ta có thể thấy rằng một biến mới có tên swappinessđược gán một giá trị được hàm trả về mem_cgroup_swappiness(). Một số dấu vết khác thông qua mã nguồn sẽ cho thấy giá trị được hàm này trả về là vm_swappiness. Vì vậy, bây giờ, biến swappinessđược đặt bằng bất kỳ giá trị nào vm_swappiness được đặt thành.

Mã nguồn [Chọn]
int swappiness = mem_cgroup_swappiness(memcg);
Và xa hơn một chút trong cùng một tệp mã nguồn, chúng ta thấy điều này:

Mã nguồn [Chọn]
/*
* With swappiness at 100, anonymous and file have the same priority.
* This scanning priority is essentially the inverse of IO cost.
*/ anon_prio = swappiness;
file_prio = 200 - anon_prio;

Nó thật thú vị. Hai giá trị riêng biệt có nguồn gốc từ swappiness. Các biến anon_priovà file_priogiữ các giá trị này. Cái này tăng thì cái kia giảm và ngược lại. Giá trị hoán đổi của Linux thực sự đặt tỷ lệ giữa hai giá trị.

7. Tỷ lệ vàng

Các trang tệp chứa dữ liệu có thể dễ dàng truy xuất nếu bộ nhớ đó được giải phóng. Linux chỉ có thể đọc lại tập tin. Như chúng ta đã thấy, nếu dữ liệu tệp đã bị thay đổi trong RAM thì những thay đổi đó phải được ghi vào tệp trước khi trang tệp có thể được giải phóng. Tuy nhiên, dù bằng cách nào, trang tệp trong RAM có thể được phục hồi lại bằng cách đọc dữ liệu từ tệp. Vậy tại sao phải thêm các trang này vào phân vùng trao đổi hoặc tập tin trao đổi? Nếu bạn cần lại dữ liệu đó, bạn cũng có thể đọc lại dữ liệu đó từ tệp gốc thay vì bản sao dự phòng trong vùng trao đổi. Vì vậy, các trang tập tin không được lưu trữ trong trao đổi. Chúng được "lưu trữ" trở lại trong tập tin gốc. Với các trang ẩn danh, không có tệp cơ bản nào được liên kết với các giá trị trong bộ nhớ. Các giá trị trong các trang đó đã được đưa đến một cách linh hoạt. Bạn không thể đơn giản đọc lại chúng từ một tập tin. Cách duy nhất có thể khôi phục các giá trị bộ nhớ trang ẩn danh là lưu trữ dữ liệu ở đâu đó trước khi giải phóng bộ nhớ. Và đó là những gì trao đổi giữ. Các trang ẩn danh mà bạn sẽ cần tham khảo lại. Nhưng lưu ý rằng đối với cả trang tệp và trang ẩn danh, việc giải phóng bộ nhớ có thể yêu cầu ghi vào ổ cứng. Nếu dữ liệu trang tệp hoặc dữ liệu trang ẩn danh đã thay đổi kể từ lần cuối nó được ghi vào tệp hoặc để trao đổi, thì cần phải ghi vào hệ thống tệp. Để lấy dữ liệu sẽ yêu cầu đọc hệ thống tập tin. Cả hai loại thu hồi trang đều tốn kém. Cố gắng giảm đầu vào và đầu ra của ổ cứng bằng cách giảm thiểu việc hoán đổi các trang ẩn danh chỉ làm tăng lượng đầu vào và đầu ra của ổ cứng cần thiết để xử lý các trang tệp được ghi vào và đọc từ các tệp. Như bạn có thể thấy từ đoạn mã cuối cùng, có hai biến. Một người kêu gọi file_prio "ưu tiên tập tin" và một người kêu gọi anon_prio "ưu tiên ẩn danh".

  • Biến anon_prio được đặt thành giá trị hoán đổi Linux.
  • Giá trị file_prio được đặt thành 200 trừ đi anon_prio giá trị.

Các biến này giữ các giá trị hoạt động song song. Nếu cả hai đều được đặt thành 100 thì chúng bằng nhau. Đối với bất kỳ giá trị nào khác, anon_prio sẽ giảm từ 100 xuống 0 và file_prio sẽ tăng từ 100 lên 200. Hai giá trị này đưa vào một thuật toán phức tạp xác định xem nhân Linux chạy với ưu tiên thu hồi (giải phóng) các trang tệp hay các trang ẩn danh. Bạn có thể coi đó file_priolà sự sẵn lòng của hệ thống trong việc giải phóng các trang tệp và anon_prio là sự sẵn lòng của hệ thống trong việc giải phóng các trang ẩn danh. Những giá trị này không làm gì là đặt bất kỳ loại kích hoạt hoặc ngưỡng nào khi sử dụng trao đổi. Điều đó đã được quyết định ở nơi khác. Tuy nhiên, khi bộ nhớ cần được giải phóng, hai biến này---và tỷ lệ giữa chúng---sẽ được xem xét bởi các thuật toán thu hồi và hoán đổi để xác định loại trang nào được ưu tiên xem xét để giải phóng. Và điều đó quyết định liệu hoạt động liên quan đến ổ cứng sẽ xử lý tệp cho các trang tệp hay hoán đổi không gian cho các trang ẩn danh. Khi nào Swap thực sự có tác dụng? Chúng tôi đã xác định rằng giá trị khả năng hoán đổi của Linux đặt tùy chọn cho loại trang bộ nhớ sẽ được quét để tìm khả năng thu hồi. Điều đó không sao cả, nhưng phải có thứ gì đó quyết định khi nào việc hoán đổi sẽ được thực hiện. Mỗi vùng bộ nhớ có dấu nước cao và dấu nước thấp. Đây là những giá trị bắt nguồn từ hệ thống. Chúng là tỷ lệ phần trăm của RAM trong mỗi vùng. Chính những giá trị này được sử dụng làm ngưỡng kích hoạt hoán đổi. Để kiểm tra xem dấu nước cao và thấp của bạn là gì, hãy xem bên trong tệp /proc/zoneinfo bằng lệnh này: less /proc/zoneinfo Mỗi vùng sẽ có một tập hợp các giá trị bộ nhớ được đo bằng trang. Dưới đây là các giá trị cho vùng DMA32 trên máy thử nghiệm. Dấu nước thấp là 13966 trang và dấu nước cao là 16759 trang:

  • Trong điều kiện hoạt động bình thường, khi bộ nhớ trống trong một vùng giảm xuống dưới mức thấp nhất của vùng đó, thuật toán hoán đổi sẽ bắt đầu quét các trang bộ nhớ để tìm kiếm bộ nhớ mà nó có thể lấy lại, có tính đến các giá trị tương đối của anon_prio và file_prio.
  • Nếu giá trị hoán đổi Linux được đặt thành 0, hoán đổi sẽ xảy ra khi giá trị kết hợp của các trang tệp và trang miễn phí nhỏ hơn vạch nước cao.

Vì vậy, bạn có thể thấy rằng bạn không thể sử dụng giá trị swappiness của Linux để tác động đến hành vi của trao đổi liên quan đến việc sử dụng RAM. Nó không hoạt động như vậy.

8. Swapiness nên được đặt thành gì?

Điều này phụ thuộc vào phần cứng, khối lượng công việc, loại ổ cứng và máy tính của bạn là máy tính để bàn hay máy chủ. Rõ ràng, đây sẽ không phải là một kích thước phù hợp với tất cả các loại cài đặt. Và bạn phải nhớ rằng trao đổi không chỉ được sử dụng như một cơ chế để giải phóng RAM khi bạn sắp hết dung lượng bộ nhớ. Hoán đổi là một phần quan trọng của một hệ thống hoạt động tốt và nếu không có nó, Linux sẽ rất khó đạt được việc quản lý bộ nhớ lành mạnh. Việc thay đổi giá trị swappiness của Linux có tác dụng ngay lập tức; bạn không cần phải khởi động lại. Vì vậy, bạn có thể thực hiện những điều chỉnh nhỏ và theo dõi hiệu ứng. Lý tưởng nhất là bạn thực hiện việc này trong khoảng thời gian nhiều ngày, với các loại hoạt động khác nhau trên máy tính của mình, để cố gắng tìm ra cài đặt gần nhất với cài đặt lý tưởng nhất mà bạn có thể. Đây là một số điểm cần xem xét:

  • Cố gắng "vô hiệu hóa trao đổi" bằng cách đặt giá trị khả năng trao đổi của Linux về 0 chỉ đơn giản là chuyển hoạt động của ổ cứng liên quan đến trao đổi sang hoạt động của ổ cứng liên quan đến tệp.
  • Nếu bạn có ổ cứng cơ học đã cũ, bạn có thể thử giảm giá trị khả năng hoán đổi của Linux để tránh xa việc cải tạo trang ẩn danh và giảm tình trạng xáo trộn phân vùng trao đổi. Tất nhiên, khi bạn giảm một cài đặt, cài đặt kia sẽ tăng lên. Việc giảm tỷ lệ xáo trộn trao đổi có thể làm tăng tỷ lệ xáo trộn hệ thống tập tin. Nhưng máy tính của bạn có thể sẽ vui hơn khi ưu tiên phương pháp này hơn phương pháp kia. Thực sự, cách duy nhất để biết chắc chắn là thử và xem.
  • Đối với các máy chủ đơn mục đích, chẳng hạn như máy chủ cơ sở dữ liệu, bạn có thể nhận được hướng dẫn từ nhà cung cấp phần mềm cơ sở dữ liệu. Thông thường, các ứng dụng này có quy trình quản lý bộ nhớ và bộ đệm tệp được thiết kế theo mục đích riêng mà bạn nên dựa vào. Các nhà cung cấp phần mềm có thể đề xuất giá trị khả năng hoán đổi của Linux tùy theo thông số kỹ thuật và khối lượng công việc của máy.
  • Dành cho người dùng máy tính để bàn trung bình có phần cứng gần đây hợp lý? Để lại nó như nó là.

Cách đặt giá trị Swappiness của Linux Trước khi thay đổi giá trị Swappiness của mình, bạn cần biết giá trị hiện tại của nó là gì. Nếu muốn giảm bớt một chút thì câu hỏi là ít hơn một chút là sao? Bạn có thể tìm hiểu bằng lệnh này:

Mã nguồn [Chọn]
cat /proc/sys/vm/swappiness
Để định cấu hình giá trị swappiness, hãy sử dụng sysctl lệnh:

Mã nguồn [Chọn]
sudo sysctl vm.swappiness=45
Giá trị mới được sử dụng ngay lập tức, không cần khởi động lại. Trên thực tế, nếu bạn khởi động lại, giá trị swappiness sẽ trở về giá trị mặc định là 60. Khi bạn đã thử nghiệm xong và quyết định giá trị mới mà bạn muốn sử dụng, bạn có thể duy trì giá trị đó trong các lần khởi động lại bằng cách thêm nó vào /etc/sysctl.conftệp. Bạn có thể sử dụng bất kỳ trình soạn thảo nào bạn thích. Sử dụng lệnh sau để chỉnh sửa tệp bằng nanotrình chỉnh sửa: sudo nano /etc/sysctl.conf Khi nanomở, hãy cuộn xuống cuối tệp và thêm dòng này. Chúng tôi đang sử dụng 35 làm giá trị hoán đổi vĩnh viễn. Bạn nên thay thế giá trị bạn muốn sử dụng.

Mã nguồn [Chọn]
vm.swappiness=35
Để lưu các thay đổi của bạn và thoát khỏi nano, nhấn "Ctrl+O", nhấn "Enter" và nhấn "Ctrl+Z." Quản lý bộ nhớ rất phức tạp Quản lý bộ nhớ rất phức tạp. Và đó là lý do tại sao, đối với người dùng bình thường, tốt hơn hết là cứ để nó cho kernel. Thật dễ dàng để nghĩ rằng bạn đang sử dụng nhiều RAM hơn mức hiện tại. Những tiện ích như thế top và free có thể gây ấn tượng sai lầm. Linux sẽ sử dụng RAM trống cho nhiều mục đích riêng của nó, chẳng hạn như bộ nhớ đệm trên đĩa. Điều này làm tăng con số bộ nhớ "đã sử dụng" một cách giả tạo và giảm con số bộ nhớ "miễn phí". Trên thực tế, RAM được sử dụng làm bộ nhớ đệm trên ổ đĩa được gắn cờ là "đã sử dụng" và "có sẵn" vì nó có thể được lấy lại bất kỳ lúc nào, rất nhanh chóng. Đối với những người chưa quen, có vẻ như trao đổi không hoạt động hoặc giá trị hoán đổi cần thay đổi. Như mọi khi, ma quỷ nằm ở chi tiết. Hoặc, trong trường hợp này là daemon. Daemon trao đổi nhân.