Máy tính đóng băng trên RAM gần đầy, có thể có vấn đề về bộ đệm đĩa


74

Vấn đề tôi nghĩ là hơi giống với chủ đề này .

Không có vấn đề gì nếu tôi bật hoặc tắt trao đổi, bất cứ khi nào dung lượng RAM thực sự sử dụng bắt đầu gần đạt mức tối đa và hầu như không còn chỗ trống cho bộ đệm đĩa, hệ thống sẽ hoàn toàn không phản hồi.

Đĩa rất nhanh, và đôi khi sau 10 phút chờ đợi, nó sẽ không hoạt động, và đôi khi không (hoặc tôi hết sự kiên nhẫn). Đôi khi nếu tôi hành động nhanh chóng, tôi có thể quản lý để từ từ mở giao diện điều khiển và tiêu diệt một số ứng dụng ăn ram như trình duyệt và hệ thống sẽ mở ra gần như ngay lập tức.

Vì vấn đề này, tôi gần như không bao giờ thấy bất cứ điều gì trong trao đổi, chỉ đôi khi có một vài MB ở đó, và ngay sau đó vấn đề này xuất hiện. Dự đoán không được giáo dục của tôi sẽ là nó được kết nối bằng cách nào đó với bộ đệm đĩa quá tham lam hoặc quản lý bộ nhớ quá khoan dung, vì vậy khi cần bộ nhớ, nó không được giải phóng đủ nhanh và bỏ đói hệ thống.

Vấn đề có thể đạt được rất nhanh nếu làm việc với các tệp lagrge (500MB +) được tải trong bộ đệm đĩa và hệ thống sau đó không thể tải chúng đủ nhanh.

Bất kỳ trợ giúp hoặc ý tưởng sẽ được đánh giá rất cao.

Bây giờ tôi phải sống trong nỗi sợ hãi thường trực, khi làm một cái gì đó máy tính có thể đóng băng và tôi thường phải khởi động lại nó, nếu nó thực sự hết ram tôi sẽ rất thích nó để giết một số ứng dụng không gian người dùng, như broser ( tốt nhất là nếu tôi có thể đánh dấu cái nào đó để giết trước)

Mặc dù sự nhầm lẫn là tại sao không trao đổi cứu tôi trong tình huống này.

CẬP NHẬT: Nó đã không treo trong một thời gian, nhưng bây giờ tôi đã có một vài lần xuất hiện trở lại. Bây giờ tôi đang giữ màn hình ram trên màn hình của mình mọi lúc và khi tình trạng treo máy xảy ra, nó vẫn hiển thị miễn phí ~ 30% (Có thể được sử dụng bởi bộ đệm đĩa). Triệu chứng bổ sung: Nếu tại thời điểm tôi đang xem video (trình phát VLC), âm thanh sẽ dừng trước, sau vài giây hình ảnh dừng lại. Mặc dù âm thanh đã dừng nhưng tôi vẫn có một số quyền kiểm soát trên PC, nhưng khi hình ảnh dừng lại, tôi thậm chí không thể di chuyển chuột được nữa, vì vậy tôi đã khởi động lại nó sau một thời gian chờ đợi. Btw, điều này đã không xảy ra khi tôi bắt đầu xem video nhưng một thời gian sau (20 phút) và tôi đã không chủ động làm bất cứ điều gì khác vào lúc đó, ngay cả khi trình duyệt và oowrite luôn mở trên màn hình thứ hai. Về cơ bản một cái gì đó chỉ quyết định xảy ra tại một điểm và treo hệ thống.

Theo yêu cầu trong các ý kiến, tôi chạy dmesg ngay sau khi treo. Tôi không nhận thấy bất cứ điều gì kỳ lạ, nhưng không biết phải tìm gì, vì vậy đây là: https://docs.google.com/document/d/1iQih0Ee2DwsGd3VuQZu0bPbg0JGjSOCRZhu0B05CMYs/edit?hl=bc


11
Điều này cần được chú ý nhiều hơn. Tôi biết rằng có những lỗi được đệ trình trong nhiều năm.
n3rd

1
@ n3rd: Đây là lỗi .
Dan Dascalescu

@ Krišjāni Nesenbergs: Vui lòng sửa cho tôi nếu tôi sao chép sai một tập tin dài cũng làm cho nó bị treo.
Rick2047

Cảm ơn đã hỏi câu hỏi này và tìm một giải pháp. Vui lòng thêm một ngày để cập nhật, nếu không nó không rõ ràng những gì đã làm việc và những gì không hoạt động. Tôi đang gặp vấn đề tương tự, tôi luôn kiểm tra mức bộ nhớ và tôi có 16 GB, dự định có 32 GB, để xem liệu tôi có thể khắc phục theo cách đó không ...
Beto Aveiga

Câu trả lời:


63

Để khắc phục sự cố này, tôi thấy rằng bạn cần đặt cài đặt sau thành khoảng 5% -6% tổng RAM vật lý của mình, chia cho số lõi trong máy tính:

sysctl -w vm.min_free_kbytes=65536

Hãy nhớ rằng đây là cài đặt theo lõi, vì vậy nếu tôi có 2GB RAM và hai lõi, thì tôi đã tính 6% chỉ 1 GB và thêm một chút để đảm bảo an toàn.

Điều này buộc máy tính phải cố gắng giữ dung lượng RAM này miễn phí và làm như vậy sẽ hạn chế khả năng lưu trữ các tệp đĩa. Tất nhiên nó vẫn cố gắng lưu trữ chúng và ngay lập tức trao đổi chúng, vì vậy bạn có lẽ cũng nên hạn chế trao đổi:

sysctl -w vm.swappiness=5

(100 = trao đổi thường xuyên nhất có thể, 0 = chỉ trao đổi trên tổng mức cần thiết)

Kết quả là linux không còn ngẫu nhiên quyết định tải toàn bộ tệp phim có dung lượng xấp xỉ 1GB trong khi xem và giết chết máy khi làm như vậy.

Bây giờ có đủ không gian dành riêng để tránh tình trạng đói bộ nhớ, điều đáng lo ngại là vấn đề (xem như không còn đóng băng như trước đây).

Sau khi thử nghiệm trong một ngày - khóa đã hết, đôi khi có một số sự cố nhỏ, bởi vì công cụ được lưu trữ thường xuyên hơn, nhưng tôi có thể sống với điều đó nếu tôi không phải khởi động lại máy tính cứ sau vài giờ.

Bài học ở đây là - quản lý bộ nhớ mặc định chỉ là một trong những trường hợp sử dụng và không phải là tốt nhất, mặc dù một số người cố gắng đề xuất khác - giải trí gia đình ubfox nên được cấu hình khác với máy chủ.


Bạn có thể muốn làm cho các cài đặt này vĩnh viễn bằng cách thêm chúng vào /etc/sysctl.confnhư thế này:

vm.swappiness=5
vm.min_free_kbytes=65536

Tìm thấy tốt, cố gắng báo cáo các lỗi về nó để có thêm nhận thức về vấn đề này và hy vọng ai đó sẽ đưa ra giải pháp để không tải ngẫu nhiên toàn bộ phim,
Oxwivi

cảm ơn, rất chi tiết và giải thích vấn đề của tôi Nhiều đánh giá cao!
odedbd

1
tốt, tôi đã thử hầu hết mọi thứ, và chỉ đề nghị của bạn cải thiện mọi thứ. cảm ơn bạn
Vitalii

1
Nếu tôi đang chạy mà không có phân vùng trao đổi, tôi có nên sử dụng số tiền lớn hơn 5-6% không? Và thiết lập vm.swappinesssẽ không làm gì trong trường hợp đó, tôi giả sử?
Jarett Millard

1
"[vm.min_free_kbytes] buộc máy tính cố gắng giữ dung lượng RAM này miễn phí và khi làm như vậy sẽ hạn chế khả năng lưu trữ các tệp đĩa." - xin lỗi đã làm phiền, nhưng điều này không liên quan đến những gì vm.min_free_kbyteshiện tại. Nó hoạt động như một khối các trang dành riêng để giảm bớt sự __GFP_WAITphân bổ nguyên tử (nghĩa là điền hoặc giết / không ) khi bị tranh chấp bộ nhớ hệ thống cao. Nó thực sự có thể có ý nghĩa để nâng nó ở đây (vì có lẽ những quầy hàng này có liên quan đến sự tranh chấp bộ nhớ hệ thống), nhưng chắc chắn sẽ không phải là lý do được mô tả trong câu trả lời này.
Chris Xuống

9

Điều này đã xảy ra với tôi trong một bản cài đặt mới của Ubuntu 14.04.

Trong trường hợp của tôi, nó không liên quan gì đến các vấn đề sysctl được đề cập.

Thay vào đó, vấn đề là UUID của phân vùng trao đổi khác nhau trong quá trình cài đặt so với sau khi cài đặt. Vì vậy, trao đổi của tôi không bao giờ được kích hoạt và máy của tôi sẽ bị khóa sau vài giờ sử dụng.

Các giải pháp là để kiểm tra UUID hiện tại của phân vùng swap với

sudo blkid

và sau đó sudo nano /etc/fstabđể thay thế giá trị UUID của trao đổi không chính xác bằng giá trị được báo cáo bởi blkid.

Một khởi động lại đơn giản để ảnh hưởng đến những thay đổi và voila.


3
Cảm ơn bạn rất nhiều! Tôi đã phải vật lộn với lỗi vô cùng đáng sợ này trong gần một năm nay và đã thử mọi cách để sửa nó. Tại sao Linux có hành vi này? Có vẻ như nó phải hành động như không có trao đổi, và chỉ cần gọi OOM-killer. Thay vào đó, nó dường như giả vờ như có trao đổi, nhưng sau đó không thực sự trao đổi mọi thứ (vì thực tế không có, vì nó được cấu hình không đúng).
crazy2be

@ crazy2be Nó không thất bại, nó thành công không ngừng. Ngay cả khi không có bất kỳ trao đổi nào, Linux vẫn có thể loại bỏ các chương trình và các tệp chưa sửa đổi trong bộ nhớ và đọc lại chúng từ đĩa.
Martin Thornton

4

Tôi biết câu hỏi này đã cũ, nhưng tôi đã gặp vấn đề này trong Ubuntu (Chrubfox) 14.04 trên Chromebook Acer C720. Tôi đã thử giải pháp Krišjāni Nesenbergs, và nó đã hoạt động được phần nào, nhưng đôi khi vẫn bị hỏng.

Cuối cùng tôi đã tìm thấy một giải pháp hoạt động bằng cách cài đặt zram thay vì sử dụng trao đổi vật lý trên SSD. Để cài đặt nó, tôi chỉ cần làm theo các hướng dẫn ở đây , như thế này:

sudo apt-get install zram-config

Sau đó tôi có thể định cấu hình kích thước của hoán đổi zram bằng cách sửa đổi /etc/init/zram-config.conftrên dòng 21.

20: # Calculate the memory to user for zram (1/2 of ram)
21: mem=$(((totalmem / 2 / ${NRDEVICES}) * 1024))

Tôi đã thay thế 2 bằng 1 để làm cho kích thước zram có cùng kích thước với số lượng ram tôi có. Kể từ khi làm như vậy, tôi đã không còn bị đóng băng hoặc không phản hồi hệ thống.


zramlà tùy chọn khả thi chỉ khi bạn không thể cài đặt thêm RAM. Nếu hệ thống quá chậm khi hoán đổi sang SSD và hết RAM mà không trao đổi, thì zramcó thể giúp một chút cho đến khi bạn cố gắng làm thêm một chút và kết quả là giống như hết RAM mà không có trao đổi.
Mikko Rantalainen

4

Không có gì làm việc cho tôi !!

Vì vậy, tôi đã viết một kịch bản để theo dõi việc sử dụng bộ nhớ. Trước tiên, nó sẽ cố gắng xóa bộ nhớ cache RAM nếu mức tiêu thụ bộ nhớ tăng ngưỡng. Bạn có thể cấu hình ngưỡng này trên tập lệnh. Nếu mức tiêu thụ bộ nhớ thậm chí không đến dưới ngưỡng, nó sẽ bắt đầu giết chết các quá trình theo thứ tự giảm dần mức tiêu thụ bộ nhớ cho đến khi mức tiêu thụ bộ nhớ dưới ngưỡng. Tôi đã đặt nó ở mức 96% theo mặc định. Bạn có thể định cấu hình nó bằng cách thay đổi giá trị của biến RAM_USAGE_THRESHOLD trong tập lệnh.

Tôi đồng ý rằng việc giết các quá trình tiêu thụ bộ nhớ cao không phải là giải pháp hoàn hảo, nhưng tốt hơn hết là giết MỘT ứng dụng thay vì mất TẤT CẢ công việc !! tập lệnh sẽ gửi cho bạn thông báo trên màn hình nếu việc sử dụng RAM tăng ngưỡng. Nó cũng sẽ thông báo cho bạn nếu nó giết bất kỳ quá trình.

#!/usr/bin/env python
import psutil, time
import tkinter as tk
from subprocess import Popen, PIPE
import tkinter
from tkinter import messagebox
root = tkinter.Tk()
root.withdraw()

RAM_USAGE_THRESHOLD = 96
MAX_NUM_PROCESS_KILL = 100

def main():
    if psutil.virtual_memory().percent >= RAM_USAGE_THRESHOLD:
        # Clear RAM cache
        mem_warn = "Memory usage critical: {}%\nClearing RAM Cache".\
            format(psutil.virtual_memory().percent)
        print(mem_warn)
        Popen("notify-send \"{}\"".format(mem_warn), shell=True)
        print("Clearing RAM Cache")
        print(Popen('echo 1 > /proc/sys/vm/drop_caches',
                    stdout=PIPE, stderr=PIPE,
                    shell=True).communicate())
        post_cache_mssg = "Memory usage after clearing RAM cache: {}%".format(
                            psutil.virtual_memory().percent)
        Popen("notify-send \"{}\"".format(post_cache_mssg), shell=True)
        print(post_cache_mssg)

        if psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD:
            print("Clearing RAM cache saved the day")
            return
        # Kill top C{MAX_NUM_PROCESS_KILL} highest memory consuming processes.
        ps_killed_notify = ""
        for i, ps in enumerate(sorted(psutil.process_iter(),
                                      key=lambda x: x.memory_percent(),
                                      reverse=True)):
            # Do not kill root
            if ps.pid == 1:
                continue
            elif (i > MAX_NUM_PROCESS_KILL) or \
                    (psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD):
                messagebox.showwarning('Killed proccess - save_hang',
                                       ps_killed_notify)
                Popen("notify-send \"{}\"".format(ps_killed_notify), shell=True)
                return
            else:
                try:
                    ps_killed_mssg = "Killed {} {} ({}) which was consuming {" \
                                     "} % memory (memory usage={})". \
                        format(i, ps.name(), ps.pid, ps.memory_percent(),
                               psutil.virtual_memory().percent)
                    ps.kill()
                    time.sleep(1)
                    ps_killed_mssg += "Current memory usage={}".\
                        format(psutil.virtual_memory().percent)
                    print(ps_killed_mssg)
                    ps_killed_notify += ps_killed_mssg + "\n"
                except Exception as err:
                    print("Error while killing {}: {}".format(ps.pid, err))
    else:
        print("Memory usage = " + str(psutil.virtual_memory().percent))
    root.update()


if __name__ == "__main__":
    while True:
        try:
            main()
        except Exception as err:
            print(err)
        time.sleep(1)

Lưu mã trong một tệp nói save_hang.py. Chạy tập lệnh dưới dạng:

sudo python save_hang.py

Xin lưu ý rằng tập lệnh này chỉ tương thích với Python 3 và yêu cầu bạn phải cài đặt gói tkinter. bạn có thể cài đặt nó dưới dạng:

sudo apt-get install python3-tk

Hi vọng điêu nay co ich...


2

Tôi đoán là bạn đã đặt vm.swappinessgiá trị rất thấp, điều này khiến kernel bị hoán đổi quá muộn, khiến RAM quá thấp để hệ thống hoạt động.

Bạn có thể hiển thị cài đặt swappiness hiện tại của mình bằng cách thực hiện:

sysctl vm.swappiness

Theo mặc định, giá trị này được đặt thành 60. Ubuntu Wiki khuyên bạn nên đặt thành 10, nhưng hãy thoải mái đặt nó thành giá trị cao hơn. Bạn có thể thay đổi nó bằng cách chạy:

sudo sysctl vm.swappiness=10

Điều này sẽ chỉ thay đổi nó cho phiên hiện tại , để làm cho nó liên tục, bạn cần thêm vm.swappiness = 10vào /etc/sysctl.conftệp.

Nếu đĩa của bạn chậm, hãy cân nhắc mua một cái mới.


Trên thực tế giảm sự hoán đổi làm giảm vấn đề (nó hiếm khi xảy ra hơn). Tôi đang giữ nó ở mức 5 bây giờ. Mặc dù có thể đó là một vấn đề khác với hoán đổi higer, bởi vì, khi nó 60 tuổi và tôi quyết định xem một bộ phim hoặc chỉnh sửa một tập tin lớn, toàn bộ tập tin gần như một GB đã được tải vào bộ nhớ và sau đó hệ thống bắt đầu hoán đổi các chương trình tôi tích cực sử dụng và thậm chí giao diện người dùng chính nó. Điều tôi nghĩ là tôi hiểu phần hoán đổi, điều tôi muốn là giết chết các ứng dụng người dùng tham lam thay vì đóng băng máy khi hết ram. (Và tốt nhất là giới hạn kích thước tệp trong bộ đệm)
Krišjāni Nesenbergs

@Krisa: khi hệ thống hết bộ nhớ (RAM và trao đổi), kernel gọi oom_kill sẽ giết các tiến trình để tiết kiệm bộ nhớ. Thật không may, bạn không thể kiểm soát các quá trình mục tiêu. Để kích hoạt thủ công, nhấn Alt + SysRq + F. Khi chạy dmesglệnh, bạn sẽ thấy một số thông tin (và tên quy trình + id) của quy trình. Tôi nghĩ rằng bạn nên mua một đĩa mới, nhanh hơn. Hoặc nâng cấp RAM của bạn.
Lekensteyn

3
Vấn đề là, oom_kill chỉ không được gọi trước khi máy tính bị khóa trong khoảng 30 phút. Ngoài ra - có ít nhất một cách để biết quá trình nào sẽ bị giết trước?
Krišjāni Nesenbergs

2
Tôi có 2GB Ram và ổ cứng là 5400rpm. Tôi thực sự không nghĩ rằng đó là một hệ thống cũ như vậy chỉ cần đóng băng nửa giờ trong khi xem một số video trên một màn hình và duyệt một số 20-30 tab khác. Trên thực tế tôi sẽ rất vui nếu tôi có thể truy cập bàn điều khiển và giết một số tiến trình - có cách nào để làm cho đầu vào của người dùng và thiết bị đầu cuối cực kỳ ưu tiên để nó hoạt động trong khi hệ thống đóng băng?
Krišjāni Nesenbergs

1
Dù sao - trao đổi và dung lượng RAM là một chút ngoài luồng. Vấn đề là, hệ thống đó đã không phản hồi trong một thời gian dài, ngay cả khi trao đổi bị vô hiệu hóa và sau đó đôi khi vẫn chạy chương trình (vì vậy nó quản lý để tìm bộ nhớ ở đâu đó) và những lần khác chạy oom_killer. Hệ thống sẽ có thể nói rằng nó sắp hết ram và chỉ không cho tôi chạy nhiều thứ hơn. Vì vậy, có cách nào để ngăn chặn những đóng băng đó hoặc đặt mức độ ưu tiên của đầu vào của người dùng cao đến mức tôi có thể chuyển sang bàn điều khiển khi chúng xảy ra và tự mình giết một số quy trình không?
Krišjāni Nesenbergs

2

Tôi đã vật lộn với vấn đề này trong một thời gian dài, nhưng bây giờ nó dường như đã được giải quyết trên Máy tính xách tay của tôi.

Nếu không có câu trả lời nào khác phù hợp với bạn (tôi đã thử hầu hết trong số chúng), hãy chơi với min_free_kbytes , để có thêm dung lượng RAM khi máy tính của bạn bắt đầu hoán đổi (ngay trước khi đạt giá trị tối thiểu này trên RAM miễn phí).

Tôi có 16GB RAM, nhưng sớm hơn bộ nhớ đã đầy và sau đó dừng đáp ứng trong 10 đến 30 phút, cho đến khi một số thứ bị tráo đổi.

Ít nhất là đối với tôi, việc đặt giá trị min_free_kbytes trên mức được khuyến nghị sẽ khiến quá trình hoán đổi đó nhanh hơn đáng kể.

Đối với RAM 16 GB, hãy thử điều này:

vm.min_free_kbytes=500000

Để đặt giá trị này, hãy xem các câu trả lời khác hoặc chỉ cần google nó :)


0

Tôi liên tục chạy một trong các máy tính xách tay của mình từ thẻ Ubuntu SD trực tiếp, với phân vùng lưu trữ ext4 nhỏ và tệp hoán đổi trên ổ cứng. Khi hầu hết tất cả RAM được sử dụng và giá trị trao đổi quá thấp (đôi khi tôi muốn tắt hoàn toàn ổ cứng nếu có thể, vì nó gây ồn ào), hiệu suất Linux có xu hướng rơi xuống một vách đá đối với tôi, như vậy chỉ cần đến TTY1 để giết Firefox mất 15 phút.

Tăng /proc/sys/vm/vfs_cache_pressuretừ mặc định 100 lên giá trị 6000 dường như giúp ngăn chặn điều này. Tuy nhiên, tài liệu kernel cảnh báo không làm như vậy, nói rằng

Increasing vfs_cache_pressure significantly beyond 100 may have negative
performance impact. Reclaim code needs to take various locks to find freeable
directory and inode objects. With vfs_cache_pressure=1000, it will look for
ten times more freeable objects than there are.

Tôi không hoàn toàn chắc chắn về tác dụng phụ của việc này nên tôi cẩn thận khi làm việc này.


Bạn có thể sẽ trải nghiệm kết quả tốt hơn với vfs_cache_pressuregần 10 (nghĩa là ít hơn 100) và đặt min_free_kbytescao hơn. Được cảnh báo rằng nếu bạn đặt min_free_kbytesquá cao, kernel killer OOM sẽ giết tất cả mọi người!
Mikko Rantalainen

@MikkoRantalainen Tôi đã tăng lên min_free_kbytes262144 và tôi đã quan sát thấy việc hạ thấp vfs_cache_pressurecó tác dụng ngược lại - hạ thấp xuống dưới 100 khiến hệ thống trở nên không phản hồi nhanh hơn nhiều. Tôi không chắc tại sao chính xác.
Hitechcomputergeek

Nói chung, việc tăng vfs_cache_pressuresẽ khiến các direntries bị ném trước nội dung tệp được lưu trong bộ nhớ cache và do đó, hiệu suất tổng thể thường sẽ bị ảnh hưởng với các giá trị trên 100. Nếu bạn có thể tìm ra các bước để tạo lại sự cố / treo hệ thống bắt đầu bằng ví dụ Ubuntu Live CD sau đó các nhà phát triển kernel có thể tìm ra nguyên nhân gốc rễ. Đối với tôi, hang xảy ra mà không có bất kỳ cảnh báo. Dự đoán tốt nhất của tôi là hạt nhân bị treo do OOM trước khi OOM Killer đã giải phóng đủ RAM. Tôi hiện đang chạy min_free_kbytes = 100000, admin_reserve_kbytes = 250000 và user_reserve_kbytes = 500000.
Mikko Rantalainen

(tiếp) Tôi chưa gặp sự cố với cấu hình trên mặc dù tôi có swappiness = 5 và vfs_cache_pressure = 20. Hệ thống có 16 GB RAM và 8 GB trao đổi trên SSD. Một hệ thống khác có 32 GB RAM và không có trao đổi và nó dường như gặp phải vấn đề tương tự - nhấn Alt + SysRq + f sau khi hệ thống cảm thấy chậm có vẻ hữu ích nên tôi đoán nếu OOM Killer hoạt động đủ nhanh thì hệ thống sẽ không treo.
Mikko Rantalainen
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.