it-swarm-vi.com

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

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 trao đổi tương tự.

Ví dụ: ngay bây giờ, khoảng hai giờ sau khi đóng VirtualBox, tôi có 1.6GB miễn phí RAM 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?

304
jfoucher

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 hay không, bạn có thể sử dụng lệnh vmstat. Để 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 việc chạy vmstat 1, nơi bạn có thể thấy máy của tôi hoàn toàn không hoán đổi.

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 hoán đổi được phân bổ: -

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

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ế như 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ó đã hết RAM.

401
SpamapS

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 phát triển 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 Ubuntu thông thường. 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 cái 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 & 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 trao đổ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/

140
Elijah Lynn

Tôi đã thấy rằng việc 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 tập lệnh mà tôi gọi là toggle_swap đã hoạt động cho tôi trong nhiều năm qua. Nó kiểm tra đủ RAM 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
52
Scott Severance

Sau khi làm quen 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 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.

26
Erigami

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ì.

0
Rory