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


314

Khi tôi mở một ứng dụng sử dụng nhiều RAM (VirtualBox được đặt ở mức 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ì 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 đó, 2GB RAM sẽ được giải phóng, nhưng vẫn sử dụng không gian hoán đổi tương tự.

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

Làm cách nào tôi có thể yêu cầu Ubuntu ngừng sử dụng trao đổi đó và hoàn nguyên về việc sử dụng RAM?


Điều dễ dàng 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 năng lượng của nhiệt độ máy tính xách tay và cpu
Mohamed Slama

5
Giả định lớn rằng việc sao chép lại tất cả những thứ trên máy tính của bạn mất ít thời gian hơn thế.
jQwierdy

Ubuntu 16.04, ít nhất, có thể tiếp tục sử dụng trao đổi lâu sau khi cần thiết, do đó làm cho các đơn đặt hàng hệ thống của bạn chậm hơn bằng cách dựa vào tệp trao đổi mặc dù không còn cần thiết nữa. Do đó, sự can thiệp bằng tay có thể hữu ích. Khởi động lại không phải lúc nào cũng là một lựa chọn.
matt

Câu trả lời:


167

Chỉ vì trao đổi được phân bổ, không có nghĩa là nó đượ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ụ 770 MB), điều đó 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ó gì đang hoán đổi vào / ra bạn có thể sử dụng vmstatlệnh. Để nó chạy một vài giây để ổn định và xem các cột si(hoán đổi) và so(trao đổi). Nếu không có gì xảy ra thì không có lý do gì để lo lắng.

Đây là đầu ra của hoạt động vmstat 1, nơi bạn có thể thấy máy của tôi không bị tráo đổi gì cả.

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 topbạ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

32
Không có lý do gì để lo lắng, cho đến khi tôi tiếp tục sử dụng một số ứng dụng đã bị tráo đổi. Sau tất cả những điều kinh khủng.
törzsmókus

207
Bài đăng này không trả lời câu hỏi.
emchristiansen

18
Tiền đề của câu hỏi dựa trên những quan niệm sai lầm. Bài đăng này giải quyết những quan niệm sai lầm.
popey

30
Tôi không thấy một quan niệm sai lầm, tôi thấy một sự bất đồng về ý nghĩa của "được sử dụng". Bạn có nghĩa là "được sử dụng" để chỉ chủ động trao đổi vào / ra, trong khi câu hỏi ban đầu dường như được đặt ra với "đã sử dụng" có nghĩa là có dữ liệu đã được hoán đổi, sau đó có thể cần phải hoán đổi lại. Những lý do hợp lệ để muốn xóa sạch trao đổi sau một sự kiện hoán đổi nhiều bộ nhớ khác, về cơ bản là đánh tráo hoạt động hoán đổi hoạt động mà người dùng biết sẽ xảy ra sau đó (đặc biệt là nếu việc 'tráo đổi' sau này có thể xảy ra trong khi đĩa đang được tải vì lý do khác).
drfrogsplat

39
Sau khi chạy một ứng dụng cần nhiều bộ nhớ, các ứng dụng khác của tôi không hoạt động khi tôi chuyển sang chúng, có lẽ là do bị tráo đổi. Một số cách để yêu cầu hệ thống hủy trao đổi càng nhiều dữ liệu càng tốt (tiếp theo là nghỉ giải lao) sẽ tốt hơn là phải đợi 20 giây mỗi lần tôi Alt + Tab.
Mark K Cowan

424

Hạt nhân Linux nằm dưới Ubuntu sẽ tự động "hoán đổi" các trang đó từ đĩa sang RAM khi cần, vì vậy, nói chung tôi sẽ nói cứ để nó diễn ra 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 nó, (tôi có thể thấy một kịch bản mà bạn muốn biết hệ thống sẽ phản hồi sau), bạn có thể tắt và bật lại trao đổi trong giây lát

sudo swapoff -a
sudo swapon -a

HOẶC thay thế dưới dạng một dòng

swapoff -a; swapon -a

Hãy cẩn thận khi 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ó đã hết RAM.


8
Điều đó đã lừa, trao đổi đã được sao chép vào ram. Tôi đoán bạn chỉ cần đảm bảo có ít nhất số lượng trao đổi được sử dụng làm ram miễn phí trước khi chạy trao đổi, phải không?
jfoucher

12
Việc 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 hộp không bị tráo đổi trước khi làm điều này. Nếu bạn làm như vậy, thì kernel 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 tiện. Không có lý do gì bạn cần phải 'dọn dẹp' trao đổi như thế này. (xem bình luận khác của tôi) :)
popey

51
Trên thực tế, việc hoán đổi được sao chép vào ram hoặc chính xác hơn là các trang được hoán đổi từ đĩa sang RAM trước khi trao đổi có thể bị vô hiệu hóa.
SpamapS

14
Các trang được sao chép vào RAM chỉ khi chúng vẫn cần một số quy trình. Đôi khi một trang bị tráo đổi thuộc về một quá trình đã hoàn thành và kernel không quan tâm đến việc xóa các trang này khỏi trao đổi ngay lập tức.
BrunoJCM

6
Đây phải là câu trả lời chính xác, vì đó là cách để đưa các trang bị tráo đổi trở lại RAM và sau đó làm trống bộ nhớ trao đổi
Alfonso Jiménez

144

Bạn cũng có thể đặt giá trị "swappiness" của mình từ mặc định là 60, bằng cách này, việc hoán đổi sẽ không quá lớn để bắt đầu. Tại sao mặc định vận chuyển đượ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 cài đặt máy tính để bàn điển hình của Ubuntu. Giá trị của swappiness = 10 được khuyến nghị , nhưng hãy 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 mức tăng tốc độ đáng kể và có thể nhận thấy 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 sẽ không tắt trao đổi cho kernel Linux 3.4 trở xuống nhưng với 3.5+ thì bạn sẽ muốn sử dụng giá trị 1 nếu bạn muốn giữ nó ở cài đặt 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 cứ thứ gì chạm vào đĩa đều chậm hơn RAM. Tôi có 8 lõi ảo, SSD nhanh và 8 GB bộ nhớ và trao đổi của tôi được đặt thành 0. Hiện tại 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, trao đổi được sử dụng 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 kernel để di chuyển các tiến trình ra khỏi bộ nhớ vật lý và vào đĩa trao đổi. Vì các đĩ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 cho hệ thống và ứng dụng nếu các quá trình di chuyển quá mạnh ra khỏi bộ nhớ.

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

Dưới đây là các hướng dẫn cơ bản để kiểm tra swappiness, làm trống giao dịch 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 ( như được đề xuất bởi SpamapS ):

Điều này sẽ làm trống trao đổ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 đảm bảo bạn có đủ bộ nhớ khả dụng bằng cách xem tab tài nguyên của màn hình hệ thống gnome, bộ nhớ trống của bạn phải lớn hơn so với trao đổi đã sử dụng của bạn. Quá trình này có thể mất một lúc, sử dụng màn hình gnome-system để 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 trao đổ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 # khởi động lại hệ thống

* Với phiên bản kernel 3.5+, cài đặt swappiness thành 0 sẽ tắt hoàn toàn và cài đặt 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/


1
Tôi vừa cập nhật câu trả lời để bao gồm một cách vĩnh viễn để thiết lập swappiness. Không chắc làm thế nào nó được nâng cấp rất nhiều, tôi đoán không ai kiểm tra nó.
Elijah Lynn

1
Đọc thêm về swappiness trong câu trả lời này => Askubfox.com/a/103916/11929
Elijah Lynn

3
Tôi không chắc liệu điều này có sẵn hay không khi tác giả ban đầu đăng câu trả lời nhưng giá trị swappiness của "60" được áp dụng cho các cài đặt máy chủ Ubuntu vì môi trường đó có một bộ thông số kỹ thuật khác về hiệu suất. help.ubfox.com/community/ từ
Frito

1
Cài đặt này rất hiệu quả trong việc kiểm soát kích thước của trao đổi. Hệ thống của tôi có RAM 16G và trao đổi 16G. Đôi khi tôi đang chạy đến máy ảo và một số ứng dụng của tôi bị tráo đổi. Khi tôi đóng VM, việc sử dụng RAM giảm xuống, nhưng việc sử dụng trao đổi vẫn giữ nguyên và hệ thống của tôi bị chậm khi thay đổi ứng dụng. Thay đổi sự hoán đổi đã cải thiện hiệu suất cho tôi.
kapad

1
Đây phải là câu trả lời được chấp nhận thực sự. Giải thích cặn kẽ về vấn đề, và đó là giải pháp, cũng như các liên kết và giải pháp để giữ lại bộ nhớ Hoán đổi, nhưng giúp kiểm soát nó ngay từ đầu. Công cụ tuyệt vời. Cảm ơn. :)
Jack_Hu

53

Tôi đã thấy rằng hoán đổi trống có thể giúp ích rất nhiều cho các hệ thống có đĩa chậm và RAM hạn chế. 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 đủ RAM, làm như vậy sẽ gây ra đủ loại vấn đề.

Tôi đã viết một kịch bản mà tôi gọi toggle_swaplà đã làm việc cho tôi trong nhiều 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

Tuyệt vời tôi đã tìm kiếm một cái gì đó như thế này. Có lẽ để 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 đó hỏi, chỉ để chắc chắn.
Atherion

2
Tôi đã cập nhật mã và đã tạo ra một ý chính dựa trên 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, giống như một cách nào đó nên đảm bảo có đủ RAM thực sự trước khi giết chết trao đổi. Cảm ơn ngài, 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 điều phải làm.)
Shiki

Ngoại trừ việc bạn chạy bất kỳ thứ gì mới trong khi tắt trao đổi, và trước khi nó bật lại - nó sẽ không có đủ bộ nhớ.
barteks2x

Điều đó phụ thuộc vào dung lượng bộ nhớ trống của bạn. Nếu có đủ bộ nhớ trống để giữ mọi thứ trong trao đổi VÀ quá trình mới, thì không có vấn đề gì. Nếu không thì bạn đã đúng.
Scott Severance

25

Sau khi loay hoay với 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 chính nó. Nó biết những gì nó đang làm và nó được tối ưu hóa để cung cấp cho bạn 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 sẽ để nó lại.


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

Chắc chắn có những trường hợp trao đổi nhất định trên máy tính để bàn làm cho nó bị lag. (không phải trong khi nó đang tráo đổi, mà cả sau đó, khi có đủ RAM, trong thời gian dài sau đó.) Vì vậy, tốt nhất câu trả lời này chỉ là kinh nghiệm chủ quan xảy ra trong một số trường hợp.
Cray

-1

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 dụng. Hình phạt hiệu suất duy nhất là công cụ đang 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ì.


10
Ừ nhưng nếu một cái gì đó đang được hoán đổi nó không ảnh hưởng đến hiệu suất, vì thế câu hỏi này.
lượng

Đó là một số điều vô lý thực sự, thường là các giao dịch dự phòng lớn trên ổ cứng hoặc nói chung là trên thiết bị chậm hơn RAM - nếu hết dung lượng - nội dung hiện có bị tráo đổi - ví dụ như trình duyệt internet - và sau đó bạn thực sự sử dụng nó từ thiết bị chậm hơn. ..
jave.web
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.