Tại sao trao đổi được sử dụng mặc dù tôi có nhiều RAM miễn phí?


208

Tôi nghĩ rằng toàn bộ bản chất của trao đổi là hoạt động như một mạng an toàn lưu trữ tạm thời khi RAM đầy nhưng phân vùng trao đổi của tôi liên tục được sử dụng mặc dù đôi khi tôi có tới 3GB RAM miễn phí. Điều này có bình thường không?


3
Xin hãy chia sẻ nội dung hoặc đầu ra của các lệnh sau / files để giúp tốt hơn chúng tôi gỡ rối vấn đề của bạn ( hướng dẫn trong câu trả lời này ) : free -m,top -b 1
ish

Sẽ cập nhật câu hỏi với pastebins của những lệnh đó vào ngày mai. Bây giờ là 12 giờ sáng :(
Mysterio

Tôi nên chỉnh sửa tiêu đề để thêm "... nhưng tôi quá buồn ngủ để quan tâm ngay bây giờ, vì vậy các bạn cũng ngủ trưa": P
ish

Câu trả lời:


188

Bạn có thể thử thay đổi giá trị "swappiness" của mình:

Từ Câu hỏi thường gặp về hoán đổi của Ubuntu :

Swappiness là gì và làm thế nào để tôi thay đổi nó?

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. Đối với Kernel phiên bản 3.5 và mới hơn, nó vô hiệu hóa tính hoán đổi.

  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

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. Lưu ý: Cài đặt máy chủ Ubuntu có các yêu cầu hiệu suất khác nhau đối với các hệ thống máy tính để bàn và giá trị mặc định là 60 có thể phù hợp hơn.

Để kiểm tra giá trị trao đổi

cat /proc/sys/vm/swappiness

Để thay đổi giá trị swappiness Có thể thực hiện thay đổi tạm thời (mất khi khởi động lại) với giá trị swappiness bằng 10

sudo sysctl vm.swappiness=10

Để thay đổi vĩnh viễn , hãy chỉnh sửa tệp cấu hình bằng trình chỉnh sửa yêu thích của bạn:

gksudo gedit /etc/sysctl.conf

Tìm kiếm vm.swappiness và thay đổi giá trị của nó như mong muốn. Nếu vm.swappiness không tồn tại, hãy thêm nó vào cuối tệp như sau:

vm.swappiness=10

Lưu tập tin và khởi động lại.

Ngoài ra, bạn có thể xem: https://askubfox.com/a/103916/54187


1
Suy đoán nhàn rỗi: điều này thực sự có thể có lợi cho hiệu suất - các trang không được truy cập trong một thời gian có thể được sao chép sang không gian hoán đổi, cho phép HĐH nhanh chóng trục xuất chúng nếu cần bộ nhớ, nhưng nội dung trang vẫn còn trong bộ nhớ .
Simon Richter

7
@SimonRichter Vâng, đó là ý tưởng. Mặc dù vậy, Swappiness of 60 có lẽ quá khó chịu đối với các hệ thống hiện đại, vì điều đó có nghĩa là bạn bắt đầu trao đổi khi bạn vẫn còn nhiều hợp đồng bộ nhớ trống.
Brendan Long

1
Chạy sudo sysctl --load=/etc/sysctl.confsau khi chỉnh sửa tệp để áp dụng các thay đổi
deFreitas

92

Có một vài khía cạnh khác nhau cho câu hỏi của bạn.

Thứ nhất, định nghĩa của bạn về "miễn phí" là gì. Nó thực sự không đơn giản như âm thanh trong Linux (hoặc bất kỳ hệ điều hành hiện đại nào).

Cách Linux sử dụng RAM (rất đơn giản)

Mỗi ứng dụng có thể sử dụng một số bộ nhớ của bạn. Linux sử dụng tất cả các bộ nhớ không có người khác (ngoại trừ vài Mb cuối cùng) làm "bộ đệm". Điều này bao gồm bộ đệm trang, bộ đệm inode, v.v ... Đây là một điều tốt - nó giúp tăng tốc mọi thứ. Cả ghi vào đĩa và đọc từ đĩa đều có thể được tăng tốc bằng bộ đệm.

Lý tưởng nhất là bạn có đủ bộ nhớ cho tất cả các ứng dụng của mình và bạn vẫn còn vài trăm Mb cho bộ nhớ cache. Trong tình huống này, miễn là các ứng dụng của bạn không tăng sử dụng bộ nhớ và hệ thống không phải vật lộn để có đủ dung lượng cho bộ đệm, thì không cần phải trao đổi.

Khi các ứng dụng yêu cầu nhiều RAM hơn, nó chỉ cần đi vào một số không gian được sử dụng bởi bộ đệm, thu nhỏ bộ đệm. Phân bổ bộ nhớ cache rẻ và đủ dễ dàng để thực hiện đơn giản trong thời gian thực - mọi thứ nằm trong bộ đệm chỉ là bản sao thứ hai của một cái gì đó đã có trên đĩa, vì vậy có thể được xử lý ngay lập tức hoặc đó là thứ chúng ta sẽ làm đã phải tuôn vào đĩa trong vòng vài giây tiếp theo nào .

Đây không phải là một tình huống dành riêng cho Linux - tất cả các hệ điều hành hiện đại đều hoạt động theo cách này. Các hệ điều hành khác nhau có thể chỉ báo cáo RAM miễn phí khác nhau: một số bao gồm bộ đệm như một phần của những gì chúng cho là "miễn phí" và một số thì không.

Khi bạn nói về RAM miễn phí, việc bao gồm bộ nhớ cache sẽ có ý nghĩa hơn rất nhiều , vì thực tế nó là miễn phí - bất kỳ ứng dụng nào cũng có thể yêu cầu nó. Trên Linux, freelệnh báo cáo cả hai cách - dòng đầu tiên bao gồm bộ đệm trong cột RAM đã sử dụng và dòng thứ hai bao gồm bộ đệm (và bộ đệm) trong cột miễn phí.

Cách Linux sử dụng trao đổi (thậm chí đơn giản hơn)

Khi bạn đã sử dụng đủ bộ nhớ mà không còn đủ cho bộ nhớ cache chạy trơn tru, Linux có thể quyết định phân bổ lại một số bộ nhớ ứng dụng không sử dụng từ RAM để trao đổi.

Nó không làm điều này theo một giới hạn nhất định. Không giống như bạn đạt được một tỷ lệ phân bổ nhất định sau đó Linux bắt đầu hoán đổi. Nó có một thuật toán khá "mờ". Phải mất rất nhiều thứ, điều này có thể được mô tả tốt nhất bằng "có bao nhiêu áp lực để phân bổ bộ nhớ". Nếu có nhiều "áp lực" để phân bổ bộ nhớ mới, thì nó sẽ tăng khả năng một số người sẽ bị tráo đổi để tạo thêm chỗ. Nếu có ít "áp lực" hơn thì sẽ giảm những cơ hội này.

Hệ thống của bạn có cài đặt "swappiness" giúp bạn điều chỉnh cách tính "áp lực" này. Thông thường không nên thay đổi điều này và tôi không khuyên bạn nên thay đổi nó. Hoán đổi nói chung là một điều rất tốt - mặc dù có một vài trường hợp cạnh có hại cho hiệu năng, nếu bạn nhìn vào hiệu năng hệ thống tổng thể, đó là một lợi ích ròng cho một loạt các nhiệm vụ. Nếu bạn giảm độ nhanh, bạn sẽ để dung lượng bộ nhớ cache giảm đi một chút so với mức khác, ngay cả khi nó thực sự hữu ích. Liệu đây có phải là một sự đánh đổi đủ tốt cho bất kỳ vấn đề nào bạn gặp phải khi hoán đổi hay không là tùy thuộc vào bạn. Bạn chỉ nên biết những gì bạn đang làm, đó là tất cả.

Có một tình huống nổi tiếng trong đó hoán đổi thực sự gây hại cho hiệu suất cảm nhận trên hệ thống máy tính để bàn và đó là cách các ứng dụng có thể phản ứng lại với đầu vào của người dùng một cách nhanh chóng sau một thời gian dài và xử lý nền nặng trong IO (chẳng hạn như sao lưu qua đêm) chạy. Đây là một sự chậm chạp rất rõ ràng, nhưng không đủ để biện minh cho việc tắt trao đổi tất cả với nhau và rất khó để ngăn chặn trong bất kỳ hệ điều hành nào. Tắt trao đổi và sự chậm chạp ban đầu này sau khi quét sao lưu / vi-rút có thể không xảy ra, nhưng hệ thống có thể chạy chậm hơn một chút trong cả ngày. Đây cũng không phải là một tình huống giới hạn đối với Linux.

Khi chọn những gì sẽ được hoán đổi vào đĩa, hệ thống sẽ cố gắng chọn bộ nhớ không thực sự được sử dụng - đọc hoặc ghi từ đó. Nó có một thuật toán khá đơn giản để tính toán cái này mà chọn tốt hầu hết thời gian.

Nếu bạn có một hệ thống mà bạn có một lượng RAM khổng lồ (tại thời điểm viết, 8GB là một lượng rất lớn cho một bản phân phối Linux điển hình), thì bạn sẽ hiếm khi gặp phải tình huống cần trao đổi. Bạn thậm chí có thể thử tắt trao đổi. Tôi không bao giờ khuyên bạn nên làm điều đó, nhưng chỉ bởi vì bạn không bao giờ biết khi nào nhiều RAM có thể cứu bạn khỏi một số ứng dụng bị sập. Nhưng nếu bạn biết bạn sẽ không cần nó, bạn có thể làm điều đó.

Nhưng làm thế nào có thể trao đổi tăng tốc hệ thống của tôi? Không trao đổi những thứ chậm lại?

Hành động chuyển dữ liệu từ RAM sang trao đổi là một hoạt động chậm, nhưng nó chỉ được thực hiện khi hạt nhân khá chắc chắn rằng lợi ích tổng thể sẽ vượt xa điều này. Ví dụ: nếu bộ nhớ ứng dụng của bạn tăng đến mức bạn gần như không còn bộ nhớ cache và I / O của bạn rất kém hiệu quả vì điều này, bạn thực sự có thể lấy tốc độ ra khỏi hệ thống nhiều hơn bằng cách giải phóng một số bộ nhớ, thậm chí sau chi phí ban đầu của việc hoán đổi dữ liệu để giải phóng nó.

Đây cũng là giải pháp cuối cùng nếu các ứng dụng của bạn thực sự yêu cầu nhiều bộ nhớ hơn thực tế. Trong trường hợp này, việc hoán đổi là cần thiết để ngăn chặn tình trạng hết bộ nhớ, điều này thường dẫn đến việc ứng dụng bị sập hoặc phải bị giết chết.

Trao đổi chỉ liên quan đến những lúc hệ thống của bạn hoạt động kém vì nó xảy ra vào những lúc bạn hết RAM có thể sử dụng, điều này sẽ làm chậm hệ thống của bạn (hoặc làm cho nó không ổn định) ngay cả khi bạn không trao đổi. Vì vậy, để đơn giản hóa mọi thứ, trao đổi xảy ra hệ thống của bạn đang bị sa lầy, thay vì cách khác.

Một khi dữ liệu được trao đổi, khi nào nó xuất hiện trở lại?

Truyền dữ liệu ra khỏi trao đổi là (đối với các đĩa cứng truyền thống, ít nhất) cũng tốn thời gian như đưa nó vào đó. Vì vậy, có thể hiểu được, hạt nhân của bạn sẽ miễn cưỡng loại bỏ dữ liệu khỏi trao đổi, đặc biệt là nếu nó không thực sự được sử dụng (tức là đọc từ hoặc ghi vào). Nếu bạn có dữ liệu trong trao đổi và nó không được sử dụng, thì thực sự đó là một thứ tốt khi nó được trao đổi, vì nó để lại nhiều bộ nhớ hơn cho những thứ khác đang được sử dụng, có khả năng tăng tốc hệ thống của bạn.


5
+1 để giải thích chi tiết. Tôi cũng muốn giữ trao đổi 2GiB trên máy tính của mình. Nếu có điều gì đó không ổn - rò rỉ bộ nhớ, v.v., thì bạn có thể thấy trao đổi tăng lên và tìm kiếm sự cố trước khi hết bộ nhớ. Đó là một mạng lưới an toàn cũng như một công cụ hiệu suất.
Joe

1
Trên netbook của tôi, chỉ có 2GB RAM, tôi giữ 4GB trao đổi. Điều này là do tôi sử dụng netbook nhiều hơn so với dự định và các chương trình của tôi thường yêu cầu nhiều hơn 2GB bộ nhớ. Vì Linux hoạt động rất kém trong các tình huống hết bộ nhớ, tôi thích có một mạng lưới an toàn lớn. Và tôi có nhiều không gian đĩa.
Scott Severance

Nếu các chương trình của bạn thường xuyên yêu cầu bộ nhớ nhiều hơn 2GB, tôi sẽ cân nhắc việc sử dụng nhiều RAM hơn (nó cực rẻ!) Vì RAM cạn kiệt sẽ làm giảm hiệu suất. Vì lợi ích của những người đọc khác: làm cho bạn không chỉ nhìn vào bộ nhớ cache được cho là có bộ nhớ RAM khả dụng - xem các tài liệu tham khảo khác free -m.
thomasrutter

2
@neon_overload: Tôi chỉ cần lưu ý rằng theo HP, RAM tối đa của netbook của tôi là 1GB. Hiện tại tôi đã có 2GB và các nguồn internet cho thấy 2GB là mức tối đa thực tế. Do đó, cần phải có các cách giải quyết này.
Scott Severance

@thomasrutter: Câu trả lời của bạn thay đổi như thế nào đối với các máy chủ lớn, một trong số tôi có 1TB (có một terabyte đầy đủ) của ram và vẫn đang sử dụng trao đổi; cài đặt hoán đổi nào và phân vùng trao đổi kích thước nào bạn muốn giới thiệu?
chrisinmtown

24

Đặt giá trị swappiness không hoạt động trong mọi tình huống. Nếu nó làm việc cho bạn, tuyệt vời. Nếu không, tôi đã viết một kịch bản để định kỳ xóa trao đổi bằng cách tắt và bật lại.

Trao đổi khó khăn là một chút rủi ro nếu bạn không cẩn thận. Nếu bạn không có đủ RAM miễn phí để giữ mọi thứ trong RAM cộng với mọi thứ trong trao đổi, cố gắng vô hiệu hóa trao đổi sẽ khiến hệ thống của bạn không phản hồi. Trước tiên, kịch bản của tôi sẽ kiểm tra xem có đủ RAM miễn phí hay không (cần một chút thao tác, vì lượng RAM miễn phí thực tế khác với freebáo cáo là miễn phí), sau đó chỉ chuyển đổi nếu có. Nhưng, nếu bạn hơi thiếu RAM, đừng bắt đầu một quy trình lớn khác trong khi tập lệnh đang chạy. Đây là:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
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)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Bạn phải chạy tập lệnh này dưới dạng root (ví dụ: với sudo). Kịch bản này sẽ không khiến hệ thống của bạn không phản hồi; nếu bạn không đủ RAM, nó sẽ từ chối chuyển đổi. Tôi đã sử dụng kịch bản này mà không gặp vấn đề gì trong gần năm năm nay.


+1 cho tập lệnh. Bạn có thể muốn hiện đại hóa nó một chút bằng cách thay đổi MB thành MiB trong các đầu ra. Tôi đã viết một kịch bản tương tự mà không có tất cả các bài kiểm tra an toàn (tốt) mà bạn đưa vào. Trên cuốn sổ cũ của tôi, nơi trao đổi được sử dụng nhiều, sẽ mất một lúc để chạy - một hoặc hai phút, nhưng không làm tổn thương gì. Một lần nữa, nó sẽ thất bại vì không có đủ bộ nhớ trống để chạy, nhưng điều đó không gây ra thêm bất kỳ vấn đề nào. Tôi đã phải khởi động lại để dọn dẹp mọi thứ khi điều đó xảy ra. Nó phải làm với những gì trông giống như rò rỉ bộ nhớ trong Transmission (kể từ khi sửa, tôi tin) và chỉ có ram 2GiB.
Joe

6
Nếu một cái gì đó đã được chuyển sang trao đổi và nó vẫn được trao đổi, đó thường là một điều tốt - điều đó có nghĩa là dữ liệu không thực sự được sử dụng và nó giải phóng một số RAM của bạn cho các công cụ khác, dẫn đến tăng tốc độ tiềm năng. Điều gì khiến bạn tin rằng dữ liệu này không nên trao đổi và thay vào đó sẽ chiếm nhiều RAM có giá trị hơn? Thông thường, hạt nhân khá giỏi trong việc biết những gì không được sử dụng và có thể được giữ lại một cách an toàn để trao đổi RAM.
thomasrutter

@neon: Hãy nhớ rằng máy của tôi có RAM 2 GB và 3 GB tương ứng, hiện tại khá ít. Bằng chứng là trong hiệu suất. Ví dụ, việc hiển thị các menu hoặc chuyển đổi chương trình có thể bị chậm do hoán đổi, cũng như Compos có thể tạo hiệu ứng trực quan. Sự chậm chạp này được chữa khỏi bằng cách chuyển đổi trao đổi, do đó chứng minh rằng ít nhất trong một số trường hợp thuật toán tối ưu hóa của hạt nhân là tối ưu. Tôi không thể tranh luận với kinh nghiệm lặp đi lặp lại.
Scott Severance

Phù !! Điều này chỉ tăng lên 0% trong trao đổi .... Tôi không có nhiều thời gian để xem xét câu hỏi hoàn chỉnh này và câu trả lời của nó nhưng tôi thích đọc nó khi tôi có thời gian rảnh.
AzkerM

Tại sao bạn không đặt swappiness thành một giá trị thấp? Điều đó dường như sẽ làm điều tương tự như kịch bản của bạn, nhưng theo cách được kiểm soát nhiều hơn.
jhfrontz

4

Nói chung trao đổi vẫn không được sử dụng trên các hệ thống ngày nay. Theo kinh nghiệm của tôi, các quy trình đang chạy trong một thời gian dài mà không có các hoạt động chuyên sâu được chuyển sang trao đổi bởi linux.
Nó làm cho một vài chương trình bị ảnh hưởng chạy chậm.
Nếu bạn có nhiều ram miễn phí, bạn có thể tắt trao đổi bằng cách chạy lệnh:
swapoff -av(bạn sẽ cần sudoquyền cho nó.)
Nếu bạn không thích trao đổi, bạn có thể bật nó lên, sử dụng lệnh đối xứng:
swapon -av( lại sudoyêu cầu).


12
Quay swap tắt hoàn toàn là quá mức cần thiết kể từ swapiness = 0 làm điều tương tự, nhưng an toàn hơn (nếu bạn làm kết thúc với quá nhiều thứ trong bộ nhớ, nó sẽ ném một cái gì đó trong swap).
Brendan Long

@BrendanLong Điểm công bằng .. Cảm ơn đã dạy tôi. :)
Drainke01

3

Khi trao đổi đã được sử dụng cho một chương trình, nó có xu hướng duy trì ánh xạ cho vòng đời của chương trình. Nhiều chương trình có mã (và dữ liệu) hiếm khi được sử dụng .. Một khi bộ nhớ bị tráo đổi, không có khả năng bị hoán đổi.

Một cách để buộc các trang này vào bộ nhớ là tắt thiết bị trao đổi. Nếu bạn có hai, bạn có thể tắt một cái, bật lại, sau đó tắt cái thứ hai. Nếu trao đổi là thực sự cần thiết, nó sẽ di chuyển giữa các thiết bị. Bạn chỉ có thể tắt thiết bị trao đổi (hoặc tệp), nhưng nếu bạn thực sự cần trao đổi không gian mạnh mẽ, điều đó có thể xảy ra.

Bên cạnh những thứ bình thường trong bộ nhớ, tempfs sử dụng không gian hoán đổi và sẽ trao đổi như phần còn lại của bộ nhớ. Nếu bạn chạy một cái gì đó đòi hỏi nhiều đĩa tạm thời, nó có thể buộc các trang bị tráo đổi. Các tệp tạm thời đã tạo có thể không còn được sử dụng sau vài phút và là ứng cử viên tốt sẽ được chuyển sang thiết bị trao đổi.

Trong một nhúm bạn có thể sử dụng một tập tin như một thiết bị trao đổi. Điều này rất hữu ích nếu bạn cần thêm không gian trao đổi tạm thời.


2

Tôi đã chỉnh sửa tập lệnh của Scott Severance để phù hợp với các phiên bản miễn phí mới hơn bao gồm tổng trường bộ nhớ khả dụng.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

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