Có phải là một ý tưởng tồi để tạo ra một kịch bản cron làm trống trao đổi mỗi giờ?


26

Trong nhiều năm, tôi đã gặp vấn đề tương tự với các cấu hình Ubuntu nhỏ của mình: không gian hoán đổi được sử dụng tăng theo thời gian. Tôi có ấn tượng rằng điều này chủ yếu là do bộ nhớ được phân bổ không bao giờ quay trở lại RAM mặc dù có đủ dung lượng cho nó, ngoại trừ trong trường hợp hành động của người dùng như vô hiệu hóa trao đổi.

Tôi đã thực hiện một cronlệnh ngắn để tự động hóa việc này và tôi có kết quả tốt:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

Nhưng bởi vì đó là một mánh khóe hơn là một giải pháp thực sự cho vấn đề này, tôi tự hỏi về những lý do tiềm năng có thể là một ý tưởng tồi, hoặc làm thế nào tôi có thể cải thiện kịch bản này để làm cho nó thông minh hơn một chút?


29
Xin tha thứ cho sự thiếu hiểu biết của tôi, nhưng chính xác thì bạn có ý gì khi nói SWAP không gian phát triển theo thời gianlàm trống bộ nhớ RAM của bộ nhớ được phân bổ ? Thông thường bạn phân bổ một số không gian như trao đổi với hệ thống và không bao giờ nghe thấy từ nó một lần nữa. Ai quan tâm bao nhiêu trao đổi thực sự được thực hiện? Có vấn đề gì vậy?
tráng miệng

5
Tại sao bạn thậm chí muốn làm điều này? Tại sao bạn nghĩ rằng một số sử dụng trao đổi là một điều xấu? Chúng ta đang nói về việc sử dụng trao đổi bao nhiêu?
marcelm

25
Tôi hơi hoang mang. Bạn tiếp tục nói về một "vấn đề" nhưng thực sự không mô tả bất kỳ tác động tiêu cực nào. Tại sao bạn coi đây là một vấn đề?
David Schwartz

17
Nếu một cái gì đó được trao đổi và ở đó, đó là vì không có gì được sử dụng nó. Và nếu không có gì sử dụng nó, tốt hơn là để RAM được sử dụng cho thứ gì đó được truy cập, như bộ đệm, hơn là trao đổi dữ liệu trở lại.
hobbs

12
Làm thế nào là tốt hơn so với chỉ để lại trao đổi?
dùng253751

Câu trả lời:


51

Sử dụng nó như thế: có, xấu. Bạn thực sự cần kiểm tra xem có đủ bộ nhớ khả dụng trước khi tắt hoán đổi không. Xem https://askubfox.com/a/90399/15811 để biết phiên bản tốt hơn.

Ngoài ra: bạn có chắc chắn về điều này? Hoán đổi được phân bổ không có nghĩa là trao đổi được sử dụng. Lệnh vmstat, cột si(trao đổi trong) và so(trao đổi ra). Nếu vẫn còn 0, bạn có một vấn đề khác. Theo kinh nghiệm của tôi, trao đổi hầu như không được sử dụng và bạn có thể không sử dụng nó vì nghĩ rằng nó không làm trống nó nhưng không có gì để trống.


3
Đợi cái gì? Nếu không đủ bộ nhớ để trao đổi thành công, trao đổi sẽ bị giết bởi kẻ giết người OOM trước tiên. Vâng, họ thực sự đã mã hóa điều đó (nó kiểm tra bằng cuộc gọi hệ thống).
Joshua

@Joshua chắc chắn nhưng anh ấy muốn nó hoạt động tự động. Không lỗi.
Rinzwind

4
Để giải thích mà không cần viết câu trả lời của riêng tôi, việc sử dụng trao đổi tăng dần theo thời gian không phải là một điều xấu . Điều đó có nghĩa là hạt nhân đang dần tìm ra thứ rác mà bộ nhớ tiêu thụ không bao giờ được sử dụng và chuyển nó ra để trao đổi để bộ nhớ có thể được sử dụng cho những thứ thực sự giúp bạn (như có thể lưu trữ nhiều dữ liệu fs hơn nó không phải tiếp tục loại bỏ nó và đọc lại từ đĩa).
R ..

@Rinzwind cron hoạt động tốt với các công việc bị lỗi và tập lệnh được liên kết cũng không sử dụng vmstat.
jpaugh

41

Tôi muốn nói rằng đó là một ý tưởng tồi. Nếu bạn nghĩ rằng bạn có bộ nhớ trống và một quy trình hoạt động sẽ không được chuyển từ trao đổi sang RAM, thì bạn sẽ không có nhiều bộ nhớ trống như bạn nghĩ, hoặc quá trình không hoạt động như bạn nghĩ Là.

Nếu một quá trình hoạt động tiếp tục được hoán đổi, bạn nên sửa bất cứ điều gì gây áp lực lên bộ nhớ. Nếu nó không phải là một quá trình hoạt động, thì vấn đề lớn là gì?


1
+1: Chuyện lớn là gì? Không bao giờ thay đổi hệ thống đang chạy , tôi không nghĩ người ta nên lộn xộn với các chức năng cốt lõi của hệ thống như vậy, đặc biệt là không có nhu cầu.
tráng miệng

3
Đôi khi tôi gặp vấn đề khi giết chết một tiến trình bị rò rỉ bộ nhớ (khiến mọi thứ khác bị hoán đổi), khiến tôi có ~ 10% RAM được sử dụng ... nhưng tất cả các chương trình đang chạy đều bị hoán đổi cho đến khi tôi truy cập lại chúng. Vì vậy, mỗi khi bạn chạm vào thứ gì đó, sẽ có độ trễ hai giây. Tôi có thể thấy OP đến từ đâu và thật tuyệt khi nó được thực hiện tự động, nhưng đây không phải là cách đúng đắn.
Ai đó ở đâu đó vào

1
@SomeoneSomewhere Nhưng dù sao đó không phải là cách nó hoạt động. Nếu theo quy trình, bộ nhớ bị rò rỉ bộ nhớ thì nó không chủ động sử dụng bộ nhớ đó (nó không đọc và ghi nó); nó chỉ được phân bổ, một cách tình cờ. Nếu có các quá trình hoạt động khác xung quanh, bộ nhớ bị rò rỉ sẽ bị tráo đổi và đó sẽ là trao đổi của bạn chứa đầy rác chứ không phải RAM vật lý.
David Richerby

@DavidR Richby Nếu bạn có một chương trình mở ở chế độ nền, thì chương trình đó vẫn ít hoạt động hơn so với rò rỉ bộ nhớ - và khi bạn chuyển sang quay lại, nó phải thoát ra khỏi trao đổi.
Ai đó ở đâu đó

@SomeoneSomewhere Bạn dường như đã hiểu sai về cách hệ thống bộ nhớ hoạt động. Bạn không cần phải có toàn bộ quá trình trong RAM vật lý: trao đổi được quản lý ở mức độ chi tiết của các trang đơn lẻ. Bất kỳ trang nào không được sử dụng trong một thời gian đều có thể bị tráo đổi và một trang chứa toàn bộ nhớ bị rò rỉ sẽ không bao giờ được sử dụng lại, vì vậy sẽ không bao giờ bị tráo đổi sau khi nó bị tráo đổi.
David Richerby

34

Đó là một ý tưởng tồi.

Nhân bắt đầu sao chép dữ liệu (không di chuyển) để trao đổi lâu trước khi bộ nhớ vật lý gần đầy, bởi vì nếu một quá trình nào đó đòi hỏi nhiều bộ nhớ, bất kỳ trang nào đã có bản sao hợp lệ trong trao đổi đều có thể được sử dụng lại ngay lập tức mà không cần phải ghi lại vào đĩa.

Nói chung, điều đó xảy ra chủ yếu cho các trang không được truy cập trong một thời gian dài, đây là một dấu hiệu tốt cho thấy không chắc là chúng sẽ được truy cập sớm.

Nếu bạn loại bỏ rõ ràng các bản sao, điều đó không mang lại lợi ích gì, vì dữ liệu vẫn tồn tại trong RAM, nhưng có thể khiến bạn mất tốc độ khi một số quy trình muốn phân bổ nhiều bộ nhớ và việc hoán đổi trở nên cần thiết.

Hạt nhân cũng sẽ luôn sử dụng không gian hoán đổi ngay khi bộ nhớ vật lý đầy trên 50%, vì vậy những con số này sẽ khác không ngay cả khi bạn đã cài đặt đủ bộ nhớ.


4
luôn luôn : Tôi nghĩ rằng bạn cho rằng /proc/sys/vm/swappinesscòn lại ở giá trị mặc định của nó 70, điều này tốt cho các máy chủ và các trang khá tích cực loại bỏ các trang bẩn từ các quy trình đã không chạm vào chúng trong một thời gian để nhường chỗ cho nhiều trang hơn. Điều này thường không tốt cho máy tính để bàn vì tab alt có thể bị chậm.
Peter Cordes

@PeterCordes, nếu các trang thực sự bị đuổi thì bộ nhớ cache đã thấy nhiều lượt truy cập hơn các trang ứng dụng được đề cập, do đó, đã có một lợi ích ròng khi sử dụng chúng làm bộ đệm đĩa. Tôi có thể thấy hiệu suất của Alt-Tab hiển thị với người dùng như thế nào, ví dụ như biên dịch thời gian cho một dự án lớn, nhưng khó xây dựng chính sách đảm bảo đáp ứng tức thì mà không làm giảm hiệu suất quá nhiều.
Simon Richter

1
Nói cách khác: kernel được điều chỉnh cho thông lượng ( swappiness=70), nhưng độ trễ quan trọng hơn đối với trải nghiệm người dùng trên máy tính để bàn. Đó là một sự đánh đổi. Nếu bạn thường xuyên biên dịch những thứ hơi quá lớn để ở trong pagecache, thì chắc chắn, hãy để swappinesscao hơn một chút, như 20 hoặc 30 thay vì 5 hoặc 10. Xem thêm akitaonrails.com/2017/01/17/optimizing-linux-for -slow-máy tính . Việc nhìn thấy vm.vfs_cache_pressurethấp hơn 100 cũng ưu tiên siêu dữ liệu bộ đệm / thư mục lưu trữ trên các trang dữ liệu, điều này cũng tốt cho khả năng phản hồi của UI.
Peter Cordes

1
Điều chỉnh khác: ngưỡng ghi lại lonesysadmin.net/2013/12/22/ . Những điều này kiểm soát Linux bắt đầu ghi vào đĩa nhanh như thế nào sau khi một cái gì đó ghi vào tệp và có bao nhiêu trang bẩn được cho phép. (tức là có thể dành bao nhiêu bộ nhớ cho việc ghi bộ nhớ đệm)
Peter Cordes

21

Đây là một ý tưởng tồi. Nếu điều này hữu ích, nhân Linux sẽ thực hiện theo cách này. Tôi không tin rằng có một lý do để thay đổi nhiều hơn một vài tham số điều chỉnh, vì một kịch bản shell đơn giản như vậy rất có thể không thông minh hơn các thuật toán của các nhà phát triển kernel.

Về cơ bản bạn có hai trường hợp:

  • Các quy trình trong không gian trao đổi không được sử dụng anyway. Tại sao bạn muốn kéo chúng trở lại vào RAM?
  • Có ít RAM, vì vậy chúng bị tráo đổi và bạn kéo chúng trở lại vào RAM. Sau đó, hệ thống của bạn sẽ đưa chúng vào trao đổi một lần nữa càng sớm càng tốt.

Vì vậy, có hai điểm chính:

  1. Đầu tiên, hệ thống của bạn sẽ chậm khi có quá ít RAM để chạy tất cả các chương trình của bạn cùng một lúc. Hoán đổi sẽ giúp bạn chạy nhiều chương trình hơn, nhưng không chuyển nhanh sang chương trình hiếm khi được sử dụng, có thể bị tráo đổi. Không có trao đổi nào có thể khiến một người hiếm khi được sử dụng bị giết hoặc gửi cho người đang sử dụng ngoại lệ hết bộ nhớ.
  2. Thứ hai, trao đổi là một điều tốt và cũng có những thứ trong trao đổi, vì bạn có RAM miễn phí với chi phí cho các chương trình mà hiện tại bạn không sử dụng.

Mặc dù không gặp phải vấn đề hết bộ nhớ với quá nhiều chương trình, một số chương trình có thể phân bổ bộ nhớ dựa trên RAM hiện tại (có thể trình duyệt của bạn sẽ sử dụng nhiều memcache hơn và bạn có thể duyệt nhanh hơn) và kernel có thể sử dụng RAM miễn phí để lưu vào bộ nhớ cache và tối ưu hóa tương tự. Khi bạn buộc trao đổi của mình trống, kernel sẽ bỏ bộ đệm đọc và ví dụ: bắt đầu một phiên bản Firefox mới sẽ mất nhiều thời gian hơn khi Firefox vẫn còn trong bộ đệm của đĩa.

Nếu bạn muốn điều chỉnh hành vi của kernel, hãy xem tham số swappiness .

Hai nguồn tài nguyên bổ sung đóng góp bởi @ peter-cordes:

Nếu bạn thực sự muốn có trao đổi trống, bạn có thể tắt trao đổi vĩnh viễn. Tôi không thấy lý do tại sao có nó trong một giờ và sau đó làm trống nó có lợi thế hơn là không có trao đổi.


1
Xem thêm akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computinglonesysadmin.net/2013/12/22/ trên để biết thêm các đề xuất / chi tiết điều chỉnh.
Peter Cordes

5

Bạn có thể đạt được kết quả tương tự bằng cách yêu cầu kernel giải phóng bộ đệm:

echo 3 > /proc/sys/vm/drop_caches

Bằng cách này, bạn sẽ tránh được khoảnh khắc ngắn ngủi có thể bị bỏ đói và để hạt nhân quyết định những gì cần thiết và những gì có thể bị loại bỏ.


0

Trái ngược với ý tưởng chung SWAP tự nó không tệ .
Điều thực sự làm chậm hệ thống của bạn là hoạt động hạt nhân di chuyển Dữ liệu từ RAM sang SWAP và quay lại vào RAM swappiness.
Hệ thống thực hiện việc này một cách tự động vì nó được cấu hình với swappiness.
Điều này làm cho Bộ nhớ từ các quá trình không hoạt động được đổ vào Phân vùng Hoán đổi Harddisk.
Bản thân tôi đã làm việc trong nhiều năm với một Máy không có nhiều Bộ nhớ RAM và tôi luôn có một số Bộ nhớ SWAP được sử dụng. Tuy nhiên, máy của tôi vẫn hoạt động tốt cho đến khi bạn bắt đầu chuyển bộ nhớ trở lại RAM, có lẽ bằng cách cố gắng đóng một ứng dụng đang mở. Sau đó, khối lượng công việc bắt đầu tăng.

  • Vì vậy, bằng cách dọn dẹp liên tục, Bộ nhớ SWAP, Khối lượng công việc trên máy của bạn sẽ tăng đáng kể.
  • Chạy các ứng dụng có Bộ nhớ của chúng trên Phân vùng SWAP có thể bị hỏng khi thực thi.

Thay vào đó tôi sẽ đề nghị bạn nghiên cứu kỹ ứng dụng nào sử dụng bộ nhớ của bạn trên dòng lệnh với htopứng dụng và quyết định đóng một số Ứng dụng. Điều này gnome-system-monitorcó thể cung cấp cho bạn cái nhìn sâu sắc tốt, trong Process-Tab của nó.
Nếu bạn có các ứng dụng lớn sử dụng nhiều RAM. Đừng chạy tất cả chúng cùng một lúc.

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.