Chạy bất kỳ lệnh nào cũng trả về không thể phân bổ bộ nhớ trên máy chủ Ubuntu


16

Tôi đang sử dụng Ubuntu 14.04. Gần đây, khi tôi đăng nhập qua SSH với người dùng của mình bằng các đặc quyền sudo, mọi lệnh tôi chạy đều dẫn đến một lỗi Không thể phân bổ bộ nhớ lỗi. Dưới đây là một vài cái tôi đã thử tại bàn điều khiển của mình

myuser@mymachine:~$ whoami
-bash: fork: Cannot allocate memory
myuser@mymachine:~$ uname -a
-bash: fork: Cannot allocate memory

Ngay cả khi tôi thử sudo reboot nowtôi cũng gặp phải lỗi trên, vì vậy tôi không biết những gì khác tôi có thể thử để mở khóa phiên bản của mình. Máy chủ lưu trữ là DigitalOcean nếu điều đó quan trọng.

Chỉnh sửa: Mỗi câu trả lời / gợi ý được đưa ra ở đây là đầu ra của "miễn phí"

myuser@mymachine:~$ free
-bash: fork: Cannot allocate memory

Câu trả lời:


12

Giải pháp

Như đã nói trong các thông báo lỗi, máy của bạn đã hết bộ nhớ. Điều này có thể vì một số lý do, nhưng về cơ bản, một cái gì đó đang ăn hết bộ nhớ của bạn và không để lại bất kỳ việc sử dụng lệnh cơ bản nào.

Tôi sẽ đề nghị bạn khởi động lại giọt nước của bạn (chỉ cần truy cập bảng điều khiển máy khách của bạn và chọn "Khởi động lại"), sshsau đó chạy tophoặc htop. Theo dõi việc sử dụng bộ nhớ và xem quá trình nào đang sử dụng hết bộ nhớ. Từ đó, hãy thử một trong hai

  1. Giết chết / Loại bỏ các chương trình bị lỗi / quá trình

    CẢNH BÁO : XIN làm nghiên cứu của bạn trên nếu quá trình này là một quá trình hệ thống quan trọng, đầu tiên! Nếu một quy trình hệ thống gây ra các vấn đề về bộ nhớ, đừng chỉ giết nó, hãy nghiên cứu về nó và tìm cách cụ thể để giải quyết nó.
  2. Thay đổi cấu hình cho chương trình / quy trình đó để nó không chiếm hết bộ nhớ của bạn.

Đề xuất ngăn chặn sự cố xảy ra lần nữa

  • Một cái gì đó tốt để làm là thêm bộ nhớ trao đổi , vì nó phân bổ thêm bộ nhớ nếu bạn sắp hết.
  • Bất cứ khi nào bạn cài đặt chương trình, hãy đảm bảo bạn định cấu hình chúng một cách chính xác để chúng không thực hiện theo những cách ngoài ý muốn (như ăn hết bộ nhớ)
  • Sau mỗi lần bạn thêm gói hoặc về cơ bản mọi thứ mới được định cấu hình, hãy kiểm tra htophoặc topđể xem bạn sử dụng bao nhiêu bộ nhớ với các chương trình hiện tại. Nếu bạn nhận thấy rằng bạn đang sử dụng gần như tất cả, hãy thử và xóa một số bằng cách thực hiện và loại bỏ các chương trình / quy trình không cần thiết.
  • Nếu có bất cứ điều gì đang được tự động khởi động (tất nhiên ngoài các quy trình hệ thống!) Mà bạn không nhận ra hoặc muốn tự động khởi động, hãy xóa nó! Nhưng luôn luôn thực hiện nghiên cứu của bạn về quy trình là gì trước khi giết / xóa nó, vì nó có thể cần thiết cho các quy trình khởi động hoặc chức năng hệ thống, v.v.

7

Để thoát khỏi tình trạng này mà không cần khởi động lại, bạn có thể kích hoạt trình diệt OOM theo cách thủ công như sau:

echo 1 > /proc/sys/kernel/sysrq
echo f > /proc/sysrq-trigger
echo 0 > /proc/sys/kernel/sysrq

Tài liệu tham khảo


Bạn có tài liệu nào hỗ trợ các lệnh đó không? Tại sao không chỉ sudo sysctl -w vm.oom_kill_allocating_task=1hoặc vĩnh viễn trên/etc/sysctl.conf .
Pablo Bianchi

1
Nghe có vẻ không tạo ra sự khác biệt, hệ thống sẽ không đạt được điều kiện OOM thực tế nếu điều này xảy ra khi nghỉ vì không có quá trình nào cố gắng phân bổ bộ nhớ và không có quy trình bổ sung nào có thể được bắt đầu. Và không liên quan nhưng bạn sẽ không thể sử dụng sudo hoặc sysctl một lần trong trạng thái này.
Luke F

Điều này làm việc cho tôi. Đừng biết làm thế nào, đừng quan tâm. Tôi thậm chí không thể chạy sudo reboottrước khi chạy nó. Cảm ơn!
boulder_ruby

0

Để hoàn thành câu trả lời được chấp nhận, có một điều nữa cần xem xét: Hệ thống của bạn có thể hết xử lý tệp hoặc thậm chí bộ đệm ổ cắm và vẫn còn nhiều bộ nhớ trong khi đưa ra cùng một lỗi. Điều này đặc biệt đúng nếu lưu trữ chia sẻ áp đặt các giới hạn có tính chất như vậy. Trên các hệ thống OpenVZ, xem nội dung của

# mèo / Proc / user_beancounters

Điều này sẽ cung cấp cho bạn trong cột ngoài cùng bên phải vượt qua đầu tiên. Nếu điều này là đúng, hãy chuyển sang gói lưu trữ lớn hơn hoặc tìm ra thủ phạm có khả năng nhất: cơ sở dữ liệu mysql hoặc mariadb, có thể, với sự xuất hiện của ứng dụng PHP bị lỗi, tệp rò rỉ xử lý hàng trăm giây mỗi giây.

Điều này cũng có thể xảy ra nếu máy chủ web của bạn mở ssh với internet và chấp nhận thông tin đăng nhập tên người dùng / mật khẩu: ngay cả khi bạn đang chạy fail2ban, bạn có thể đã bị gián đoạn từ điển phân tán trong nỗ lực cũng tiêu tốn nhiều tài nguyên.

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.