Câu hỏi Làm thế nào để trống trao đổi nếu có RAM miễn phí?


Khi tôi mở một ứng dụng chuyên sâu RAM (VirtualBox đặt ở 2GB RAM), một số không gian trao đổi thường được sử dụng, tùy thuộc vào những gì khác tôi đã mở vào thời điểm đó.

Tuy nhiên, khi tôi thoát khỏi ứng dụng cuối cùng, RAM 2GB được giải phóng, nhưng vẫn sử dụng không gian trao đổi tương tự.

Ví dụ, ngay bây giờ, khoảng hai giờ sau khi đã đóng VirtualBox, tôi có RAM 1.6 GB miễn phí và vẫn còn 770MB khi hoán đổi.

Làm thế nào tôi có thể nói với Ubuntu ngừng sử dụng trao đổi đó và quay lại sử dụng RAM?


256
2017-08-06 06:43


gốc


Điều dễ nhất Khởi động lại thiết bị của bạn và tiết kiệm thời gian đối phó với ram và ram miễn phí tiết kiệm điện năng của máy tính xách tay và nhiệt độ cpu - Mohamed Slama
Giả định lớn rằng việc tái tạo lại mọi thứ trên máy tính của bạn mất ít thời gian hơn thế. - jQwierdy


Các câu trả lời:


Chỉ vì trao đổi được phân bổ, không có nghĩa là nó đang được 'sử dụng'. Trong khi các chương trình như màn hình hệ thống và trên cùng sẽ hiển thị một số không gian hoán đổi của bạn được phân bổ (trong ví dụ 770MB) của bạn không có nghĩa là hệ thống đang tích cực hoán đổi vào / ra.

Để tìm hiểu xem có bất cứ điều gì đang hoán đổi vào / ra, bạn có thể sử dụng vmstat chỉ huy. Để nó chạy vài giây để lắng xuống và xem si (swapin) và so (hoán đổi) cột. Nếu không có gì xảy ra thì không có lý do gì để được quan tâm.

Đây là đầu ra của việc chạy vmstat 1, nơi bạn có thể thấy máy của tôi không hoán đổi chút nào.

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0  78588 230788   9596  72196    0    0     0     0  543  652 12  6 78  0
 0  0  78588 230780   9596  72196    0    0     0     0  531  410  1  0 99  0
 0  0  78588 230796   9596  72196    0    0     0     0  300  335  1  1 97  0
 1  0  78588 230788   9608  72224    0    0    40     0  737  762  4  4 84  8
 5  0  78588 230788   9608  72224    0    0     0     0  415  385  9  3 84  0
 0  0  78588 230540   9616  72224    0    0     0    44  611  556 55  5 31  0
 0  0  78588 230532   9616  72224    0    0     0     0  574  662  1  6 89  0

Tuy nhiên, ở đây trong top bạn có thể thấy tôi có không gian trao đổi được phân bổ: -

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached

146
2017-08-06 10:04



"Không có lý do để được quan tâm", đến mức khi tôi tiếp tục sử dụng một số ứng dụng đã được hoán đổi. Sau tất cả những điều kinh khủng. - törzsmókus
Bài đăng này không trả lời câu hỏi. - emchristiansen
Tiền đề của câu hỏi được dựa trên quan niệm sai lầm. Bài đăng này giải quyết các quan niệm sai lầm. - popey
Tôi không thấy một quan niệm sai lầm, tôi thấy một bất đồng về những gì "được sử dụng" có nghĩa là. Bạn có nghĩa là "được sử dụng" để tham chiếu tích cực vào / ra, trong khi câu hỏi ban đầu dường như được đặt ra với "được sử dụng" có nghĩa là có dữ liệu đã được hoán đổi, mà sau này có thể cần phải được trao đổi lại. các lý do hợp lệ muốn xóa hoán đổi sau khi một sự kiện hoán đổi rất nhiều bộ nhớ khác, về cơ bản trước khi làm trống chuyển đổi đang hoạt động mà người dùng biết sẽ xảy ra sau đó (đặc biệt là nếu sau này có thể xảy ra đĩa đang được tải vì các lý do khác). - drfrogsplat
Sau khi chạy một ứng dụng chuyên sâu về bộ nhớ, các ứng dụng khác của tôi không phản ứng khi tôi chuyển sang chúng, có lẽ do bị đổi chỗ. Một số cách để hệ thống không thể trao đổi càng nhiều dữ liệu càng tốt (theo sau là giờ nghỉ giải lao) sẽ tốt hơn là phải đợi 20 mỗi lần tôi nhấn Alt + Tab. - Mark K Cowan


Hạt nhân Linux nằm bên dưới Ubuntu sẽ tự động "hoán đổi" các trang đó từ đĩa sang RAM khi cần thiết, vì vậy nói chung tôi muốn nói chỉ để cho nó xảy ra một cách tự nhiên.

Tuy nhiên, nếu bạn thực sự cảm thấy rằng bạn cần phải ép buộc, (tôi có thể thấy một kịch bản mà bạn muốn biết hệ thống sẽ đáp ứng sau) bạn có thể vô hiệu hóa và kích hoạt lại trong giây lát

sudo swapoff -a
sudo swapon -a

HOẶC cách khác là một lệnh duy nhất

swapoff -a && swapon -a

Hãy cẩn thận làm điều này, vì bạn có thể làm cho hệ thống của bạn không ổn định, đặc biệt là nếu nó đã thấp trên RAM.


348
2017-08-06 06:47



Điều đó đã làm các trick, trao đổi được sao chép vào ram. Tôi đoán bạn chỉ cần chắc chắn để có ít nhất số lượng trao đổi được sử dụng như ram miễn phí trước khi chạy swapoff, phải không? - jfoucher
Trao đổi không được sao chép vào RAM. Nó chỉ đơn thuần là vô hiệu hóa. Bạn nên đảm bảo rằng hộp không trao đổi trước khi thực hiện việc này. Nếu bạn làm thế, thì hạt nhân sẽ thấy bộ nhớ biến mất và OOM-Killer có thể sẽ bắt đầu giết chết các ứng dụng một cách tùy ý. Không có lý do gì bạn cần phải 'làm sạch' việc hoán đổi như thế này. (xem bình luận khác của tôi) :) - popey
Trên thực tế, trao đổi là, về cơ bản, sao chép vào ram, hoặc chính xác hơn, các trang được trao đổi trở lại từ đĩa vào RAM trước khi trao đổi có thể bị vô hiệu hóa. - SpamapS
Các trang được sao chép vào RAM chỉ khi chúng vẫn còn cần thiết bởi một số quy trình. Đôi khi một trang được hoán đổi thuộc về một quá trình đã được hoàn tất và hạt nhân không quan tâm đến việc loại bỏ các trang này khỏi hoán đổi ngay lập tức. - BrunoJCM
Đây sẽ là câu trả lời đúng, vì đó là cách để chuyển các trang được đổi lại thành RAM và sau đó làm trống bộ nhớ hoán đổi - Alfonso Jiménez


Bạn cũng có thể đặt giá trị "swappiness" của mình từ giá trị mặc định là 60, theo cách này, trao đổi sẽ không phát triển quá lớn để bắt đầu. Tại sao giá trị mặc định giao hàng được đặt thành 60 khi giá trị được đề xuất là 10 làm tôi bối rối. Từ Ubuntu SwapFAQ:

Cài đặt mặc định trong Ubuntu là swappiness = 60. Giảm giá trị mặc định của swappiness có thể sẽ cải thiện hiệu suất tổng thể cho một cài đặt máy tính để bàn Ubuntu điển hình. Giá trị swappiness = 10 được khuyến nghị, nhưng cảm thấy tự do để thử nghiệm.

Bằng cách thay đổi giá trị này thành 10 hoặc thậm chí 0, bạn có thể thêm một tốc độ đáng kể và có thể cảm nhận được vào một hệ thống cũ hơn với một ổ đĩa chậm. Đặt giá trị này thành 0 không tắt hoán đổi cho hạt nhân Linux 3.4 trở xuống nhưng với 3.5+ nó làm như vậy bạn sẽ muốn sử dụng giá trị 1 nếu bạn muốn giữ nó ở mức thấp nhất *.

Tôi thấy không có lý do gì để không đặt giá trị này thành 0 vì bất kỳ thứ gì truy cập đĩa chậm hơn RAM. Tôi có 8 lõi ảo, một SSD nhanh & 8 GB bộ nhớ và trao đổi của tôi được đặt thành 0. Do thời điểm này tôi có 3 máy ảo đang chạy, mức sử dụng bộ nhớ của tôi là 7,1 trên 7,7 GB, việc sử dụng swap của tôi chỉ ở mức 576KB 952MB và tất cả các hệ thống đang chạy trơn tru!

Từ Ubuntu SwapFAQ:

Tham số swappiness kiểm soát xu hướng của hạt nhân để di chuyển các tiến trình ra khỏi bộ nhớ vật lý và vào đĩa trao đổi. Bởi vì đĩa chậm hơn nhiều so với RAM, điều này có thể dẫn đến thời gian phản hồi chậm hơn đối với hệ thống và ứng dụng nếu các quá trình được chuyển quá mạnh khỏi bộ nhớ.

  1. swappiness có thể có giá trị từ 0 đến 100
  2. swappiness = 0 báo cho hạt nhân tránh các quá trình hoán đổi từ bộ nhớ vật lý càng lâu càng tốt
  3. swappiness = 100 báo cho hạt nhân chuyển đổi mạnh mẽ các tiến trình ra khỏi bộ nhớ vật lý và chuyển chúng sang bộ nhớ đệm trao đổi

Dưới đây là các hướng dẫn cơ bản để kiểm tra swappiness, đổ trao đổi của bạn và thay đổi swappiness thành 0:

Để kiểm tra giá trị swappiness:

cat /proc/sys/vm/swappiness

Để tạm thời đặt hoán đổi thành 0 (theo đề xuất của SpamapS):

Điều này sẽ làm trống việc hoán đổi của bạn và chuyển tất cả các trao đổi trở lại vào bộ nhớ. Trước tiên hãy chắc chắn rằng bạn có đủ bộ nhớ có sẵn bằng cách xem tab tài nguyên của gnome-system-monitor, bộ nhớ miễn phí của bạn nên lớn hơn swap đã sử dụng của bạn. Quá trình này có thể mất một lúc, sử dụng gnome-system-monitor để theo dõi và xác minh tiến trình.

sudo swapoff --all

Để đặt giá trị mới thành 0:

sudo sysctl vm.swappiness=0 

Để bật lại hoán đổi:

sudo swapon --all

Để đặt vĩnh viễn swappiness thành 0:

  1. sudoedit /etc/sysctl.conf 
  2. Thêm dòng này vm.swappiness = 0 
  3. sudo shutdown -r now # hệ thống khởi động lại

* Với thiết lập phiên bản kernel 3.5+ swappiness thành 0, hãy tắt hoàn toàn và thiết lập 1 được khuyến nghị nếu bạn muốn thuật toán swappiness thấp nhất. nguồn: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/


119
2018-06-11 14:10



Đây sẽ là câu trả lời được chấp nhận. - quant
Tôi vừa cập nhật câu trả lời để bao gồm một cách vĩnh viễn để đặt swappiness. Không chắc làm thế nào nó đã upvoted rất nhiều, tôi đoán không ai thử nghiệm nó. - Elijah Lynn
Đọc tốt hơn về swappiness trong câu trả lời này => askubuntu.com/a/103916/11929 - Elijah Lynn
Thêm một lưu ý về hành vi của swappiness = 0 thay đổi với phiên bản kernel Linux 3.5+. - Elijah Lynn
Tôi không chắc chắn nếu điều này đã có sẵn khi tác giả ban đầu đăng câu trả lời nhưng một giá trị swappiness của "60" được đặt ra cho ubuntu cài đặt máy chủ kể từ khi môi trường có một bộ khác nhau của thông số kỹ thuật cho hiệu suất. help.ubuntu.com/community/… - Frito


Tôi đã tìm thấy rằng trao đổi có sản phẩm nào có thể giúp ích rất nhiều trên các hệ thống có đĩa chậm và RAM giới hạn. Tất nhiên, như đã đề cập, cách để làm điều này là để chạy sudo swapoff -a; sudo swapon -a. Vấn đề ở đây là nếu không có đủ RAM, làm như vậy sẽ gây ra tất cả các loại vấn đề.

Tôi đã viết một kịch bản mà tôi gọi toggle_swap đã làm việc cho tôi trong vài năm qua. Nó kiểm tra đủ RAM miễn phí trước khi thực sự vô hiệu hóa trao đổi. Đây là:

#!/bin/bash

free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

46
2017-12-25 16:35



Điều này thực sự hữu ích, cảm ơn bạn! - Luke Cousins
Hey, đây là giải pháp tốt nhất. Cảm ơn! - Fabio A. Correa
Tuyệt vời Tôi đang tìm kiếm một cái gì đó như thế này. Có thể để an toàn hơn một chút, bạn có thể trình bày số lượng và tỷ lệ phần trăm và sau đó yêu cầu, chỉ để được hoàn toàn chắc chắn. - Atherion
Tôi đã cập nhật mã và đã tạo ra một gist dựa gist.github.com/Jekis/6c8fe9dfb999fa76479058e2d769ee5c - Jekis
Đây là kết luận tôi đã đạt được sau khi đọc tất cả các mẹo, như một cách nào đó bằng cách nào đó hãy chắc chắn rằng có đủ RAM thực sự trước khi giết hoán đổi. Cảm ơn bạn, kịch bản tuyệt vời. Nên được bao gồm trong Ubuntu theo mặc định (không đùa, nó thực sự là một musthave.) - Shiki


Sau khi mucking xung quanh với swappiness trong một vài ngày, tôi đã đi đến kết luận rằng hạt nhân nên được để lại cho các thiết bị của riêng mình. Nó biết những gì nó đang làm, và nó được tối ưu hóa để cung cấp cho bạn những trải nghiệm tốt nhất.

Trừ khi bạn có một lý do thực sự tốt để muốn đĩa đó trở lại, tôi muốn để nó được.


23
2017-08-06 16:34



Tôi đã có một số công cụ trong trao đổi, vmstat cho tôi thấy rằng swapin và swapout đã xảy ra, và Chrome đã lag lag, trong khi CPU của tôi đã hầu như không được sử dụng. Lý do đủ tốt, phải không? - Xerus


Nó không ảnh hưởng đến hiệu suất nếu không gian trao đổi của bạn bị chiếm đóng. Các hình phạt hiệu suất duy nhất là công cụ đang đi vào / ra khỏi trao đổi. Nếu không có gì được hoán đổi trong / hoán đổi, thì bạn không phải lo lắng về bất cứ điều gì.


1
2017-08-11 19:35



Yeah nhưng nếu một cái gì đó Là được đổi chỗ nó làm ảnh hưởng đến hiệu suất, do đó câu hỏi này. - quant