Tại sao hầu hết mọi người đề nghị giảm swappiness xuống 10-20?


65

Tôi đã thấy trong một số trang web khuyến nghị giảm swappiness xuống 10-20 để có hiệu suất tốt hơn.

Có phải là một huyền thoại hay không? Đây có phải là một quy tắc chung? Tôi có một máy tính xách tay với 4GB Ram và SSD 128 GB cứng, bạn đề nghị giá trị gì cho sự nhanh nhẹn của tôi?

Cảm ơn.


5
Những trang web bạn liệt kê không giải thích lý do tại sao họ khuyên bạn nên thay đổi mặc định. Các câu trả lời ở đây tốt hơn nhiều, cho sự lựa chọn khó khăn này về một vấn đề phức tạp.
nealmcb

Câu trả lời:


88

Bởi vì hầu hết đều tin rằng trao đổi = xấu và nếu bạn không giảm bớt sự thay đổi, hệ thống sẽ trao đổi khi thực sự không cần thiết. Cả hai điều đó đều không đúng. Mọi người liên kết trao đổi với thời gian mà hệ thống của họ bị sa lầy - tuy nhiên, chủ yếu là hoán đổi hệ thống bị sa lầy, không phải là cách khác. Khi hệ thống hoán đổi, nó sẽ cân nhắc chi phí hiệu năng trong quyết định hoán đổi của nó và quyết định rằng không làm như vậy sẽ có một hình phạt tổng thể lớn hơn về hiệu suất hoặc tính ổn định của hệ thống.

Nhìn chung, các thiết lập mặc định dẫn đến hiệu suất tổng thể tốt và ổn định. Tôi khuyên bạn nên để nó ở mặc định. Có nhiều cách để Linux cải thiện việc quản lý bộ nhớ của mình để giải quyết một số trường hợp khó khăn, nhưng nói chung, kiểm soát swappiness không phải là một cách giải quyết tốt - điều chỉnh theo một hướng và bạn có thể khắc phục một vấn đề và tạo ra các vấn đề khác. Nếu có thể, chỉ cần cài đặt thêm RAM vật lý (và để lại một mình swappiness) làm lu mờ tất cả các biện pháp khắc phục khác.

Linux sử dụng RAM như thế nào

Bất kỳ RAM nào không được sử dụng bởi các ứng dụng có thể được sử dụng làm "bộ đệm". Bộ nhớ cache rất quan trọng đối với một hệ thống chạy nhanh, mượt mà, tăng tốc cả đọc và ghi vào đĩa.

Nếu các ứng dụng của bạn tăng mức sử dụng bộ nhớ đến mức chúng đang sử dụng gần như toàn bộ RAM, bộ nhớ cache của bạn sẽ bị thu hẹp và kết quả là các hoạt động trên đĩa trung bình sẽ chậm lại. Ngày nay, không đủ để có hàng chục megabyte hoặc ít hơn cho bộ nhớ cache.

Nếu các ứng dụng tăng bộ nhớ sử dụng hơn nữa - giả sử bạn không có không gian hoán đổi - bạn sẽ không chỉ không có không gian cho bộ nhớ cache mà cuối cùng bạn sẽ hết bộ nhớ và hệ thống của bạn sẽ phải giết các tiến trình đang chạy. Giết quá trình tồi tệ hơn là chậm lại vì nó cung cấp cho bạn một hệ thống không ổn định, không thể đoán trước.

Cách Linux sử dụng trao đổi

Để chống lại cả hai vấn đề này, hệ thống của bạn có thể phân bổ lại một số bộ nhớ ứng dụng ít được sử dụng vào không gian trao đổi trên đĩa của bạn, giải phóng RAM. RAM bổ sung có thể ngăn chặn các quá trình chết do hết bộ nhớ và có thể lấy lại một ít bộ đệm để các hoạt động của đĩa có thể hoạt động trơn tru hơn.

Việc phân bổ lại này không được thực hiện theo một mức cắt nhất định. Bạn không đạt được một tỷ lệ phân bổ nhất định sau đó Linux bắt đầu hoán đổi. Nó có một thuật toán "mờ". Phải mất rất nhiều thứ, điều này có thể được mô tả tốt nhất bằng "có bao nhiêu áp lực để phân bổ bộ nhớ". Nếu có nhiều "áp lực" để phân bổ bộ nhớ mới, thì nó sẽ tăng khả năng một số người sẽ bị tráo đổi để tạo thêm phòng. Nếu có ít "áp lực" hơn thì sẽ giảm những cơ hội này.

Hệ thống của bạn có cài đặt "swappiness" giúp bạn điều chỉnh cách tính "áp lực" này. Nó thường được biểu thị sai là "phần trăm RAM" nhưng thực tế không phải vậy, nó chỉ là một giá trị được sử dụng như một phần của công thức. Các giá trị khoảng 40 đến 60 là các giá trị lành mạnh được đề xuất, 60 được mặc định ngày nay.

Để hệ thống của bạn hoán đổi khi nó phải là một điều rất tốt, ngay cả khi bạn có nhiều RAM. Để hệ thống của bạn hoán đổi nếu nó cần giúp bạn yên tâm rằng nếu bạn từng gặp tình huống bộ nhớ thấp dù chỉ là tạm thời (trong khi chạy một quy trình ngắn sử dụng nhiều bộ nhớ), hệ thống của bạn có cơ hội thứ hai để giữ mọi thứ hoạt động. Nếu bạn đi xa đến mức vô hiệu hóa hoàn toàn việc hoán đổi, thì bạn có nguy cơ bị giết do không thể phân bổ bộ nhớ.

Điều gì đang xảy ra khi hệ thống bị sa lầy và hoán đổi nặng nề?

Hoán đổi là một hoạt động chậm và tốn kém, vì vậy hệ thống sẽ tránh được nó trừ khi nó tính toán rằng sự đánh đổi trong hiệu năng bộ đệm sẽ bù cho tổng thể, hoặc nếu cần thiết để tránh các quá trình tiêu diệt.

Rất nhiều thời gian mọi người sẽ nhìn vào hệ thống của họ đang đập đĩa rất nhiều và sử dụng nhiều không gian hoán đổi và đổ lỗi cho việc hoán đổi cho nó. Đó là cách tiếp cận sai. Nếu việc hoán đổi đã đạt đến mức cực đoan này, điều đó có nghĩa là việc hoán đổi là nỗ lực của hệ thống của bạn để xử lý các vấn đề bộ nhớ thấp, không phải là nguyên nhân của vấn đề và nếu không trao đổi thì quá trình chạy của bạn sẽ chết một cách ngẫu nhiên.

Còn hệ thống máy tính để bàn thì sao? Họ không yêu cầu một cách tiếp cận khác?

Người dùng hệ thống máy tính để bàn thực sự mong muốn hệ thống "cảm thấy phản hồi" để đáp ứng với các hành động do người dùng khởi tạo, chẳng hạn như mở một ứng dụng, đây là loại hành động đôi khi có thể kích hoạt trao đổi do tăng bộ nhớ cần thiết.

Một cách mà một số người cố gắng điều chỉnh điều này là giảm tham số swappiness có thể tăng khả năng chịu đựng của hệ thống đối với các ứng dụng sử dụng hết bộ nhớ và hết dung lượng bộ nhớ cache.

Tuy nhiên, đây chỉ là thay đổi mục tiêu. Ứng dụng đầu tiên bây giờ có thể tải mà không cần thao tác trao đổi, nhưng nó sẽ để lại ít bị chậm hơn cho ứng dụng tiếp theo tải. Việc hoán đổi tương tự có thể chỉ xảy ra sau đó, khi bạn mở ứng dụng tiếp theo. Trong khi đó, hiệu năng hệ thống thấp hơn do kích thước bộ đệm giảm. Do đó, bất kỳ lợi ích nào từ cài đặt swappiness giảm có thể khó đo lường, giảm độ trễ tráo đổi tại một số thời điểm nhưng gây ra hiệu suất chậm khác vào các thời điểm khác. Giảm bớt sự thay đổi một chút có thể là hợp lý nếu bạn biết bạn đang làm gì, nhưng việc giảm nó xuống mức 10% có thể khiến hệ thống chịu đựng được kích thước bộ đệm rất thấp và khiến hệ thống dễ bị trao đổi trong thời gian ngắn.

Vô hiệu hóa hoàn toàn trao đổi nên tránh khi bạn mất bảo vệ bổ sung chống lại các điều kiện hết bộ nhớ có thể khiến các quá trình bị sập hoặc bị giết.

Biện pháp khắc phục hiệu quả nhất cho đến nay là cài đặt thêm RAM nếu bạn có đủ khả năng.

Trao đổi có thể bị vô hiệu hóa trên một hệ thống có nhiều RAM không?

Nếu bạn có nhiều RAM hơn khả năng bạn cần cho các ứng dụng, thì bạn sẽ hiếm khi cần trao đổi. Vô hiệu hóa trao đổi có lẽ sẽ không tạo ra sự khác biệt trong phần lớn thời gian. Nhưng nếu bạn có nhiều RAM, việc bật tính năng trao đổi cũng sẽ không bị phạt vì hệ thống không trao đổi khi không cần thiết.

Các tình huống duy nhất sẽ tạo ra sự khác biệt là trong tình huống khó xảy ra, hệ thống sẽ hết bộ nhớ và do đó hệ thống bộ đệm bị cản trở, và trong tình huống này bạn muốn trao đổi nhiều nhất. Vì vậy, bạn có thể an toàn để trao đổi trên các cài đặt bình thường của nó để yên tâm hơn mà không gây ảnh hưởng xấu khi bạn có nhiều bộ nhớ.

Nhưng làm thế nào có thể trao đổi tăng tốc hệ thống của tôi? Không trao đổi những thứ chậm lại?

Hành động chuyển dữ liệu từ RAM sang trao đổi là một hoạt động chậm, nhưng nó chỉ được thực hiện khi hạt nhân khá chắc chắn lợi ích tổng thể do việc giữ kích thước bộ đệm hợp lý sẽ vượt xa điều này.

Một khi dữ liệu được trao đổi, khi nào nó xuất hiện trở lại?

Bất kỳ phần nào của bộ nhớ sẽ quay trở lại khi trao đổi ngay khi được sử dụng - đọc từ hoặc viết vào. Tuy nhiên, thông thường bộ nhớ được hoán đổi là bộ nhớ không được truy cập trong một thời gian dài và dự kiến ​​sẽ không cần sớm.

Chuyển dữ liệu ra khỏi trao đổi là tốn thời gian như đưa nó vào đó. Nhân của bạn sẽ không xóa dữ liệu khỏi nó nếu không cần thiết. Mặc dù dữ liệu được trao đổi và không được sử dụng, nó để lại nhiều bộ nhớ hơn cho những thứ khác đang được sử dụng và bộ đệm hệ thống nhiều hơn.

Có bất kỳ trường hợp mà giảm swappiness là thích hợp?

Đúng. Nếu bạn đang chạy một máy chủ dành riêng cho một ứng dụng máy chủ cụ thể không được hưởng lợi từ bộ đệm hệ thống. Một số máy chủ cơ sở dữ liệu như máy chủ Oracle, MySQL / MariaDB khuyến nghị trong một số trường hợp giảm độ swappness xuống còn 1 đến 10 vì các công cụ cơ sở dữ liệu này sử dụng bộ nhớ đệm riêng.

Lưu ý rằng điều này chỉ đúng nếu hệ thống của bạn dành riêng cho một tác vụ đó và trong trường hợp MySQL / MariaDB chỉ khi bạn đang sử dụng hoàn toàn InnoDB hoặc XtraDB chứ không phải MyISAM hoặc Aria, v.v.


Cảm ơn bạn đã mô tả kỹ lưỡng của bạn. Tôi nghĩ trong trường hợp của tôi (4GB Ram và 128GB SSD cứng) và với cách sử dụng của tôi (phát triển Java EE và một số os in vitual box), swappiness = 20 là phù hợp. Bạn nghĩ sao?
Saeed Zarinfam

Tôi nghĩ rằng mặc định của 60 sẽ là tốt nhất, theo ý kiến ​​của tôi.
thomasrutter

4
@BlancaHiggins bạn đã đọc bài đăng mà bạn nhận xét chưa? Nhận xét của bạn dường như không mô tả những gì swappiness thực sự làm.
thomasrutter

1
Đây là một câu trả lời tuyệt vời. Cảm ơn bạn rất nhiều vì một lời giải thích tuyệt vời như vậy.
Dan Barron

2
Một phần thông tin trong đó SwapFaq theo quan điểm của tôi là sai lệch: việc đặt nó thành 100 sẽ "tích cực" trao đổi. Tôi nghĩ chính xác hơn khi nói rằng đó là một cài đặt rất chủ động, chủ động, hoán đổi ở dấu hiệu đầu tiên rằng bộ nhớ hoặc bộ nhớ cache khả dụng đang trở nên thấp hơn một chút. Trong khi các cài đặt thấp như 10 là nhiều cài đặt mạo hiểm, hồi hộp, tránh thực hiện bất kỳ hoán đổi nào cho đến khi bộ nhớ khả dụng rất thấp và bộ nhớ cache bị mất hoàn toàn, khiến hệ thống không có nhiều chỗ trống.
thomasrutter

14

Trên máy tính để bàn thông thường, bạn có 4-5 tác vụ đang hoạt động tiêu tốn 50-60% bộ nhớ. Nếu bạn đặt swappiness thành 60, thì khoảng 1 / 4-1 / 3 trong số các trang tác vụ HOẠT ĐỘNG sẽ bị tráo đổi. Điều đó có nghĩa là, đối với mỗi thay đổi tác vụ, đối với mọi tab mới bạn đã mở, đối với mỗi lần thực thi JS, sẽ có một quy trình hoán đổi.

Giải pháp là đặt swappiness thành 10. Bằng các quan sát thực tế, điều này khiến hệ thống từ bỏ bộ đệm io (không đóng vai trò gì trên máy tính để bàn, vì bộ đệm đọc / ghi hầu như không được sử dụng. Trừ khi bạn liên tục sao chép LARGE tập tin) thay vì đẩy bất cứ điều gì vào trao đổi. Trong thực tế, điều đó có nghĩa là hệ thống sẽ từ chối trao đổi các trang, thay vào đó là cắt bộ nhớ cache io, trừ khi nó đạt 90% bộ nhớ đã sử dụng. Và điều đó có nghĩa là một trải nghiệm máy tính để bàn mượt mà, không hoán đổi, nhanh chóng.

Tuy nhiên, trên máy chủ tệp, tôi sẽ đặt swappiness thành 60 hoặc thậm chí hơn, bởi vì máy chủ không có các tác vụ nền trước hoạt động rất lớn phải được giữ trong toàn bộ bộ nhớ, mà là nhiều quá trình nhỏ hơn đang hoạt động hoặc ngủ, và không thực sự thay đổi trạng thái của họ ngay lập tức. Thay vào đó, máy chủ thường phục vụ (ân xá) cùng một dữ liệu cho khách hàng, làm cho bộ đệm io có giá trị hơn nhiều. Vì vậy, trên máy chủ, sẽ tốt hơn nhiều khi trao đổi các quá trình ngủ, giải phóng không gian bộ nhớ cho các yêu cầu bộ đệm đĩa.

Tuy nhiên, trên máy tính để bàn, cài đặt chính xác này dẫn đến việc hoán đổi các khối bộ nhớ của các ứng dụng REAL, gần như liên tục sửa đổi hoặc truy cập dữ liệu này.

Thật kỳ lạ, các trình duyệt thường dành phần lớn bộ nhớ mà chúng liên tục sửa đổi. Khi các đoạn như vậy được hoán đổi, phải mất một thời gian nếu chúng được yêu cầu quay lại - và đồng thời, trình duyệt sẽ tiếp tục cập nhật bộ đệm của nó. Mà gây ra độ trễ rất lớn. Trong thực tế, bạn sẽ ngồi 2 phút để chờ một trang web trong một tab mới để tải.

Máy tính để bàn không thực sự quan tâm đến đĩa io, vì máy tính để bàn hiếm khi đọc và ghi bộ nhớ cache lặp lại các phần dữ liệu lớn. Việc cắt trên đĩa io để ngăn chặn việc thay đổi càng nhiều càng tốt cho máy tính để bàn, hơn là có 30% bộ nhớ dành cho bộ nhớ cache của đĩa với 30% RAM (có đầy đủ các khối thuộc các ứng dụng được sử dụng tích cực).

Chỉ cần khởi chạy htop, mở trình duyệt, GIMP, LibreOffice - tải vài tài liệu ở đó và sau đó duyệt trong vài giờ. Nó thực sự dễ dàng.


3
+1 cho mô tả sự khác biệt giữa máy chủ và máy tính để bàn. Bộ nhớ cache của máy chủ có thể được thực hiện trên một trường đĩa.
Dee

Nếu đây là trường hợp, tại sao cả phiên bản Ubuntu của máy chủ và máy tính để bàn đều mặc định là 60? Nếu những gì bạn nêu là đúng, thì sẽ có ý nghĩa hơn đối với phiên bản máy tính để bàn được cung cấp mặc định là 20 hoặc thậm chí 10, nhưng thực tế không phải vậy.
JAB

1
Tham khảo cho hàm ý rằng swappiness là một tỷ lệ phần trăm trực tiếp của ram được hoán đổi? Tôi không nghĩ rằng nó hoạt động như vậy.
Xen2050

1
Nó không. Swappiness không liên quan đến phần trăm RAM. Đó là một núm điều chỉnh thuật toán mờ theo hướng ít nhiều có khả năng trao đổi trong một tình huống có vấn đề nhất định. Tôi cũng nghĩ rằng việc mô tả khối lượng công việc của máy chủ và máy tính để bàn trong câu trả lời này tạo ra một loạt các giả định không phải lúc nào cũng giữ được.
thomasrutter

9

Nếu bạn chạy một máy chủ Java trên hệ thống Linux của mình, bạn thực sự nên xem xét việc giảm sự biến đổi nhiều so với giá trị mặc định là 60. Vì vậy, 20 thực sự là một khởi đầu tốt. Trao đổi là một kẻ giết người cho một quy trình thu gom rác bởi vì các bộ sưu tập mỗi lần cần phải chạm vào phần lớn của bộ nhớ quy trình. HĐH không có phương tiện để phát hiện các quy trình như vậy và làm mọi thứ phù hợp với chúng. Cách tốt nhất là tránh trao đổi càng nhiều càng tốt cho các máy chủ ứng dụng hiệu quả.


Đúng là nếu bạn dành một máy chủ cho một khối lượng công việc chuyên biệt mà bạn biết sẽ không được hưởng lợi từ bộ đệm hệ thống (như máy chủ cơ sở dữ liệu) thì việc giảm bớt sự lộn xộn có thể có ý nghĩa. Tôi không nghĩ rằng bộ sưu tập rác là một trường hợp đủ chuyên biệt. Nếu bộ nhớ được chạm thường xuyên, nó sẽ không bị tráo đổi, nó sẽ được giữ trong RAM vật lý. Lần duy nhất không phải là trường hợp này nếu bạn có tình trạng bộ nhớ thấp nghiêm trọng - và trao đổi không chịu trách nhiệm.
thomasrutter

4

Tôi sẽ khuyên bạn nên thực hiện một số thử nghiệm trong khi mở màn hình hệ thống để xem chính xác máy của bạn đang tải bao nhiêu, tôi cũng đang chạy với bộ nhớ 4GB và ổ SSD 128 GB để thay đổi giá trị trao đổi thành 10, không chỉ cải thiện hiệu suất trong khi tải mà vì một phần thưởng cũng sẽ tăng tuổi thọ của ổ SSD vì nó sẽ ít bị ghi hơn.

Để xem hướng dẫn bằng video đơn giản về cách thực hiện việc này với lời giải thích đầy đủ, hãy xem video YouTube bên dưới

http://youtu.be/i6WihsFKJ7Q


1
Video tuyệt vời mà bạn đã thực hiện, nhưng video không thực sự trả lời trực tiếp câu hỏi, đó là cách để thay đổi sự thay đổi.
jmunsch

+1 cho gợi ý về tuổi thọ của SSD, đối với SSD là tốt nhất nếu hệ thống càng nhiều càng tốt chỉ đọc, phần còn lại sẽ nằm trong bộ nhớ và ngày nay, bộ nhớ thường không phải là vấn đề lớn trên các máy tính để bàn hiện tại.
Dee

3

Tôi muốn thêm một số quan điểm từ một kỹ sư Hiệu suất Dữ liệu lớn để cung cấp cho những người khác nền tảng hơn về công nghệ 2017.

Kinh nghiệm cá nhân của tôi là trong khi tôi thường vô hiệu hóa việc hoán đổi để đảm bảo rằng các hệ thống của tôi đang chạy ở tốc độ tối đa, trên máy trạm của tôi cho một vấn đề cụ thể, tôi đã thấy rằng sự thay đổi của 1 và 10 dẫn đến đóng băng (mãi mãi) và tạm dừng lâu. Swappiness 80 cho ứng dụng cụ thể này dẫn đến hiệu suất tốt hơn nhiều và tạm dừng ngắn hơn so với mặc định (60). Lưu ý rằng tôi có RAM 8GB và 4x 256GB trao đổi được hỗ trợ bởi 1 ổ cứng. Tôi thường sẽ nêu các số liệu thống kê chính xác được thấy trong các điểm chuẩn của tôi và thông số kỹ thuật phần cứng đầy đủ, nhưng tôi chưa thực hiện được và đó là một máy tính để bàn cấp thấp gần đây không quan trọng ở đây.

Quay trở lại công ty cũ của tôi, lý do chúng tôi không kích hoạt tính năng swappiness trên các máy chủ Spark với các nút [500GB đến 4TB] x [10-100] là vì chúng tôi thấy hiệu suất kém là dấu hiệu để thiết kế lại đường ống dữ liệu và cấu trúc dữ liệu hiệu quả hơn cách thức. Chúng tôi cũng không muốn điểm chuẩn ổ cứng / SSD. Ngoài ra, việc hoán đổi nhiều RAM sẽ cần 10-30 đĩa cho mỗi nút bằng cách ghi song song để giảm thiểu thời gian truy cập đĩa.

Ngày nay, 20 năm trước và 20 năm trong tương lai, trường hợp vẫn sẽ là một số vấn đề quá lớn đối với RAM. Với thời gian và tiền bạc vô hạn, chúng ta có thể mua / thuê thêm phần cứng hoặc thiết kế lại bất kỳ quy trình nào để đạt hiệu suất đến mức mong muốn. Trao đổi chỉ là một hack để cho phép chúng tôi bỏ qua vấn đề thực sự (chúng tôi không có đủ ram và chúng tôi không muốn chi nhiều tiền hơn).

Đối với những người nghĩ rằng swappiness cao hơn là một lời khuyên tồi, đây là một quan điểm nhỏ. Trước đây, HD chỉ có vài kb bộ nhớ cache nếu có. Giao diện là IDE / Parallel ATA. Bus CPU cũng chậm hơn nhiều cùng với RAM và nhiều thứ khác. Nói tóm lại, các hệ thống rất chậm (so với ngày nay) theo mọi cách. Một vài năm trước, ổ cứng đã sử dụng SATA3. Ngày nay, họ sử dụng giao thức NVMe, có những cải tiến đáng kể về độ trễ. HD có nhiều MB bộ nhớ cache. Và phần thú vị nhất là khi bạn sử dụng ổ SSD hiện đại (độ bền đọc / ghi ổn định và hoàn hảo hơn nhiều) với NVMe hoặc PCIe làm bộ lưu trữ trao đổi của bạn. Đó là sự thỏa hiệp tốt nhất giữa chi phí và hiệu suất. Vui lòng không thử điều này với SSD giá rẻ hoặc cũ.

Trao đổi + SSD! Với lưu trữ dễ bay hơi hiệu suất cao, tôi rất khuyên bạn nên thử nghiệm với giá trị trao đổi cao. Nó chủ yếu phụ thuộc vào các mẫu truy cập bộ nhớ (truy cập ngẫu nhiên tất cả bộ nhớ so với hiếm khi truy cập nhiều nhất), sử dụng bộ nhớ, nếu băng thông đĩa đã bão hòa và chi phí đập thực tế.


1

Có thể là rất nhiều hành vi hoán đổi cảm nhận khi khởi động hoặc khi mở chương trình là linux đọc các tệp cấu hình, v.v. từ đĩa. Vì vậy, có lẽ tốt nhất để xem xét bằng cách sử dụng chương trình giám sát hệ thống trước khi cho rằng việc truy cập ổ cứng là do hoán đổi.

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.