2012-08-01 27 views
27

tất cả: đây là thông tin bộ nhớ máy chủ của tôi với 'free -m'redis bgsave thất bại vì ngã ba Không thể cấp phát bộ nhớ

   total  used  free  shared buffers  cached 
Mem:   64433  49259  15174   0   3   31 
-/+ buffers/cache:  49224  15209 
Swap:   8197  184  8012 

redis-máy chủ của tôi đã sử dụng bộ nhớ 46g, hầu như bộ nhớ 15G còn lại miễn phí

Theo kiến ​​thức của tôi, ngã ba được sao chép trên ghi, nó không nên thất bại khi có bộ nhớ 15G miễn phí, đó là đủ để malloc cấu trúc hạt nhân cần thiết.

bên cạnh đó, khi máy chủ redis-sử dụng bộ nhớ 42G, bgsave là ok và ngã ba cũng được.

Có bất kỳ thông số vm nào tôi có thể điều chỉnh để tạo thành công trở lại ngã ba không?

Cảm ơn.

+0

Nhận 'double 'bộ nhớ nhiều hơn – surfer190

Trả lời

14

Từ proc (5):

/proc/sys/vm/overcommit_memory 
       This file contains the kernel virtual memory accounting mode. Values are: 
       0: heuristic overcommit (this is the default) 
       1: always overcommit, never check 
       2: always check, never overcommit 
       In mode 0, calls of mmap(2) with MAP_NORESERVE set are not checked, and the default check is very weak, leading to the risk of getting a process "OOM-killed". Under Linux 2.4 
       any non-zero value implies mode 1. In mode 2 (available since Linux 2.6), the total virtual address space on the system is limited to (SS + RAM*(r/100)), where SS is the size 
       of the swap space, and RAM is the size of the physical memory, and r is the contents of the file /proc/sys/vm/overcommit_ratio. 
46

Cụ thể hơn, từ Redis FAQ

Redis nền schema tiết kiệm dựa trên copy-on-viết ngữ nghĩa của ngã ba hệ điều hành hiện đại: Redis dĩa (tạo ra một tiến trình con) đó là một bản sao chính xác của phụ huynh. Quá trình con đổ DB trên đĩa và cuối cùng thoát. Về lý thuyết, trẻ nên sử dụng nhiều bộ nhớ như cha mẹ làm bản sao, nhưng thực sự nhờ vào ngữ nghĩa sao chép trên ghi được thực hiện bởi hầu hết các hệ điều hành hiện đại, quá trình cha mẹ và con sẽ chia sẻ các trang bộ nhớ chung. Một trang sẽ được sao chép chỉ khi nó thay đổi ở trẻ em hoặc trong phụ huynh. Vì trong lý thuyết tất cả các trang có thể thay đổi trong khi quá trình con được lưu, Linux không thể biết trước bao nhiêu bộ nhớ con sẽ sử dụng, vì vậy nếu thiết lập overcommit_memory được đặt thành 0 thì sẽ thất bại trừ khi có nhiều RAM miễn phí bắt buộc phải thực sự sao chép tất cả các trang bộ nhớ gốc, với kết quả là nếu bạn có tập dữ liệu Redis là 3 GB và chỉ 2 GB bộ nhớ miễn phí, nó sẽ thất bại.

Đặt overcommit_memory thành 1 cho biết Linux để thư giãn và thực hiện ngã ba theo kiểu phân bổ lạc quan hơn và đây thực sự là điều bạn muốn cho Redis.

Redis không cần bộ nhớ nhiều như hệ điều hành nghĩ rằng nó ghi vào đĩa, vì vậy có thể không làm hỏng ngã ba.

29

Sửa /etc/sysctl.conf và thêm

vm.overcommit_memory=1 

Sau đó khởi động lại sysctl bởi

Trên FreeBSD: $ sudo /etc/rc.d/sysctl reload

On Linux: $ sudo sysctl -p /etc/sysctl.conf

Các vấn đề liên quan