Linux: làm thế nào để dứt khoát bỏ qua mọi thứ có thể?


59

Tôi đã đưa ra một cái gì đó chiếm rất nhiều bộ nhớ và bây giờ mọi thứ chậm lại rất nhiều. Tôi đoán bộ nhớ của tất cả các ứng dụng đã được hoán đổi để giải phóng không gian cho quy trình sử dụng nhiều bộ nhớ và hiện tại mọi thứ đang dần quay trở lại RAM khi được truy cập.

Có cách nào để di chuyển rõ ràng mọi thứ có thể từ hoán đổi trở lại RAM không? Hoặc có thể không phải tất cả mọi thứ, nhưng chỉ là một số dữ liệu quy trình cụ thể?

Câu trả lời:


59

Tôi khuyên bạn nên cho phép trao đổi kiểm soát bộ nhớ Linux bình thường trong những thứ thực sự được sử dụng, khi chúng được sử dụng.

Điều duy nhất tôi có thể nghĩ ra là tắt trao đổi, sau đó bật lại

sudo swapoff -a
sudo swapon -a

Điều đó giả định rằng bạn có đủ bộ nhớ vật lý dự phòng để chứa mọi thứ trong trao đổi ...


4
Nó hoạt động, rất chậm mặc dù :) Cảm ơn! Nhưng tôi vẫn tin rằng có một giải pháp thanh lịch hơn :)
kolypto

7
Cẩn thận với giải pháp này, nó sẽ lấy mọi thứ ra khỏi trao đổi một cách cưỡng bức ... nếu nó không phù hợp với bộ nhớ vật lý, hạt nhân sẽ bắt đầu kẻ giết người OOM chết người. Tôi không biết bất kỳ lệnh "cố gắng di chuyển mọi thứ vào RAM, nhưng thất bại một cách duyên dáng nếu không thể".
Juliano

1
Tôi đã thử nó và phát hiện ra rằng nó hoạt động rất chậm. Vì vậy, có thể theo dõi RAM miễn phí và tiêu diệt swapoffnếu bộ nhớ xuống thấp: trong trường hợp này, không gian hoán đổi sẽ vẫn hoạt động :)
kolypto

2
Tôi không chắc việc giết hoán đổi sẽ thực sự dừng hoạt động. Phụ thuộc vào cách nó được thực hiện.
Douglas Leeder

2
Có vẻ như lệnh hoán đổi thực hiện một cái gì đó như "không cho phép ghi mới để trao đổi" trong khi bất kỳ quá trình chạy nào khác (đã / đang sử dụng trao đổi) vẫn có thể "giải phóng trao đổi". Đây có thể là lý do tại sao nó đi chậm như vậy. Nó dường như không gây ra OOM như một người khác đã nói (tôi đang sử dụng Ubuntu Bionic) - có thể đó chỉ là trường hợp nếu các quá trình "bổ sung (hoặc hiện tại) bắt đầu sử dụng bộ nhớ mới" (tức là OOM thực). Vì vậy, tất cả trong tất cả các hoán đổi / hoán đổi là một giải pháp tuyệt vời có vẻ như. Nhẹ nhàng / ổn định. Điều này giả định rằng bạn không khởi tạo thêm bộ nhớ bằng cách sử dụng các quy trình (hoặc tăng mức tiêu thụ khi chạy).
Roel Van de Paar

12

Bạn có thể điều chỉnh nó lặp lại một số từ 0 đến 100 vào /proc/sys/vm/swappiness.

Điều khiển này được sử dụng để xác định mức độ tích cực của kernel sẽ trao đổi các trang bộ nhớ. Giá trị cao hơn sẽ làm tăng tính áp lự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 hoán đổi cho đến khi số lượng trang miễn phí và được hỗ trợ tệp ít hơn mức nước cao trong một vùng.

Giá trị mặc định là 60.


13
Không sử dụng / Proc / sys trực tiếp, sysctlthay vào đó hãy sử dụng lệnh. Trong trường hợp này, nó là sysctl vm.swappiness=x.
Juliano

7
Tôi không nghĩ ngay cả một sự thay đổi bằng không sẽ khiến các trang đã bị tráo đổi được đưa vào bộ nhớ chính một cách rõ ràng?
Douglas Leeder

1
@Doumund nói đúng. vm.swappiness sẽ chủ yếu kiểm soát quyết định về việc di chuyển mọi thứ để trao đổi hoặc giảm số lượng bộ đệm và bộ đệm khi bộ nhớ được yêu cầu.
Juliano

@Juliano, tại sao không nên / Proc / sys được sử dụng?
James

@James Bởi vì / Proc / sys là giao diện cấp thấp hơn được sử dụng để thay đổi và truy vấn cấu hình kernel (đó là "chi tiết triển khai"). Linux cung cấp sysctllệnh cấp cao hơn cho tương tác người dùng. Kết quả cuối cùng là như nhau, nhưng thông thường các giao diện cấp cao hơn được ưa thích để người dùng tương tác trực tiếp. Kiểu như khởi động động cơ bằng cách đoản mạch dây đánh lửa (cấp thấp hơn) thay vì chỉ xoay chìa khóa (cấp cao hơn).
Juliano

5

Linux làm tốt công việc quản lý bộ nhớ và bạn không nên cản trở nó. Cài đặt vm.swappiness (đã đề cập trước đây) không theo cách của nó. Bạn có nhiều khả năng gặp các vấn đề kỳ lạ khi làm mọi thứ theo cách khác.

Những gì bạn đã khởi động mà đã rất đói bộ nhớ? Nó có thể được điều chỉnh? Nếu nó không có chỉ thị giới hạn bộ nhớ riêng, bạn cũng có thể xem ulimit.


Trong trường hợp của tôi nó là convert -density 200 file.pdf jpegs/file.jpg. Vì một số lý do, nó sử dụng rất nhiều bộ nhớ, nhưng bạn đã đúng: nó có thể được điều chỉnh. Dù sao, tình huống có thể xảy ra với bất kỳ ứng dụng nào :)
kolypto

1
Tôi đồng ý với câu trả lời này - có lẽ bạn nên để các hoạt động bình thường trên máy để trao đổi những gì thực sự cần thiết.
Douglas Leeder

convert-limitđối số để kiểm soát bộ nhớ của nó so với việc sử dụng đĩa và bạn nên đọc chúng. Cài đặt -limit memory 512MBhoặc tương tự sẽ tốt. Có lẽ cũng tốt khi chỉ định một MAGICK_TEMPORARY_PATH rõ ràng và dọn sạch nó sau khi lệnh của bạn được thực hiện.
Slacy

3

Nếu bạn có bộ nhớ khả dụng cho tất cả các ứng dụng của mình, bạn có thể đặt swappiness thành 0 để mọi thứ không bị mất. Ví dụ, qemu-kvm là một mục tiêu lớn mà VMM bị tráo đổi, bởi vì nó "dường như" không hoạt động trong hầu hết thời gian. Tôi đã thấy tới 80% bộ nhớ của bộ nhớ qemu-kvm được ghi để trao đổi. Các máy ảo chạy trong qemu-kvm sẽ trở nên gần như không phản hồi vì chúng sắp hết trao đổi (mặc dù khách không biết điều này đang xảy ra). VM khách sẽ nghĩ rằng nó hoạt động xuất sắc nhất, mặc dù trong thực tế, nó đang kéo theo khủng khiếp. Khi tôi sử dụng máy ảo "thức dậy" và bắt đầu thực hiện, nó có thể tăng trung bình tải lên đến hơn 30, ngay cả trên phần cứng cấp doanh nghiệp với bộ nhớ và đĩa nhanh. Tôi đoán đây là một thất bại trong thiết kế qemu-kvm ngoài luồng.

Hy vọng điều này sẽ giúp được ai đó.


Tôi sợ điều này không hoàn toàn chính xác.
Marc.2377

2

Tôi sẽ khuyên bạn không nên cố gắng nghĩ ra hệ thống con VM trong kernel. Thật không thể tin được là bạn thực sự có đủ thông tin để đưa ra quyết định tốt hơn nó. Và nếu bạn buộc nó bằng cách nào đó làm sai, thì cuối cùng bạn sẽ khiến mọi thứ trở nên chậm hơn.


9
Có một số trường hợp tôi muốn làm những gì OP muốn. Nếu tôi vô tình để một quá trình chạy loạn và chiếm hết RAM + trao đổi, thì tôi có thể đợi 15 giây mỗi lần tôi chuyển đổi các ứng dụng để bộ nhớ thoát khỏi trao đổi hoặc chỉ buộc nó và mọi thứ chạy nhanh như bình thường.
Alex

1

Nếu bạn có thể khởi động lại hệ thống nên làm điều đó (và có thể mất ít thời gian hơn nhiều so với thử bất kỳ giải pháp nào khác).


1

Để sao chép một số câu trả lời của tôi từ câu hỏi này .

Vì vậy, bạn biết làm thế nào điều chỉnh swappiness hoạt động. Điều này hoạt động bằng cách yêu cầu hệ thống con VM tìm kiếm các trang để hoán đổi khi% bộ nhớ được ánh xạ để xử lý các bảng trang + giá trị swappiness> 100. Vì vậy, cài đặt 60 sẽ khiến hệ thống bắt đầu phân trang các trang cũ từ bảng trang xử lý khi nó đang sử dụng hơn 40% bộ nhớ hệ thống của bạn. Nếu bạn muốn cho phép các chương trình của bạn sử dụng nhiều bộ nhớ hơn với chi phí bộ nhớ cache, bạn sẽ muốn hạ thấp giá trị trao đổi.


Tôi không nghĩ bộ nhớ chương trình so với bộ nhớ cache là vấn đề ở đây - Tôi nghĩ đó là bộ nhớ ứng dụng so với bộ nhớ không sử dụng. Và tôi không nghĩ rằng sự thay đổi sẽ ảnh hưởng đến điều đó.
Douglas Leeder

0

Là quá trình vẫn đang chạy? Mở một thiết bị đầu cuối và xem nếu bạn có thể phát hiện (các) quá trình đã được khởi chạy. (ps aux | grep processname có thể làm cho nó dễ dàng hơn một chút) Sử dụng kill -9 PID để tiêu diệt chúng nếu chúng vẫn đang chạy. Hãy cẩn thận với những gì bạn giết chết. Nếu bạn không biết quy trình là gì, đừng giết nó! Ngoài ra, hãy đăng kết quả đầu ra của freem để chúng tôi có thể biết liệu bạn có thực sự vẫn đang sử dụng nhiều trao đổi hay không.

Nếu mọi thứ vẫn chạy chậm, bạn vẫn có thể có bất cứ thứ gì bạn khởi chạy vẫn đang chạy. Tôi sẽ không bao giờ tắt trao đổi trừ khi bạn thực sự biết những gì bạn đang làm hoặc bạn thích sống ở rìa. =)


0

Tôi tin rằng không có cách nào thực sự tốt để buộc Linux hủy dữ liệu từ đĩa vào bộ nhớ. Khi hoán đổi / hoán đổi là một giải pháp làm việc, nhưng nó bẩn và dễ dàng có thể làm cho hệ thống của bạn không ổn định. Đối với các trường hợp khi bạn có nhiều dữ liệu trong trao đổi hơn bộ nhớ trống, sẽ khó có thể tưởng tượng bất kỳ chính sách hiệu quả nào mà Linux có thể sử dụng để quyết định phần dữ liệu nào di chuyển vào bộ nhớ và phần nào lưu trên đĩa.

Tóm tắt: Chỉ cần để Linux dần khôi phục hiệu suất của nó theo cách thông thường. Hệ thống con VM của nó được tổ chức theo cách nó phấn đấu và liên tục chuyển sang trạng thái cân bằng lý tưởng.


-2

Làm trống bộ đệm

Nếu bạn muốn làm trống chúng, bạn có thể sử dụng chuỗi lệnh này.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

Bạn có thể báo hiệu Kernel Linux để loại bỏ các khía cạnh khác nhau của các mục được lưu trong bộ nhớ cache bằng cách thay đổi đối số số thành lệnh trên.

LƯU Ý: dọn sạch bộ nhớ của những thứ không cần thiết (Kernel 2.6.16 hoặc mới hơn). Luôn đảm bảo chạy đồng bộ hóa trước để tuôn ra những thứ hữu ích ra đĩa !!!

  • Để miễn phí pagecache:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Để miễn phí răng và inodes:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Để miễn phí pagecache, nha khoa và inodes:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Ở trên có nghĩa là được chạy như root. Nếu bạn đang cố gắng thực hiện chúng bằng sudo thì bạn sẽ cần thay đổi cú pháp một chút thành một cái gì đó như sau:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
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.