Hôm nay mình gặp một sự cố khá nguy hiểm với Redis trên môi trường Production. Số là một cụm web khá quan trọng với công ty vừa mới được dựng, chạy có sử dụng Redis. Sau khi cài đặt hết mọi thứ, từ 3 con Redis replication (1 master, 2 slave), cấu hình Sentinel để HA cho con master, LB 3 con qua Haproxy ngon nghẻ, mình tự tin cho nó chạy thật. Nhưng trong vòng 3 hôm đã có 2 lần con master chết. Check log thấy như sau:
2150:M 28 Mar 12:44:43.083 # Can't save in background: fork: Cannot allocate memory
Nguyên nhân: chưa set overcommit_memory.
Khi ghi dữ liệu từ RAM xuống disk, Redis sử dụng các tiến trình con. Theo mặc định, tiến trình con này cần memory tương đương tiến trình mẹ, do nó có chứa dữ liệu tương đương. Điều này dẫn tới OS không đủ RAM cho việc ghi DB xuống Disk này > lỗi.
Tuy nhiên Linux có hỗ trợ Copy-on-write, nghĩa là chỉ cần cấp memory cho những gì tiến trình con khác với tiến trình mẹ, phần giống nhau thì dùng chung memory cho tiết kiệm. Để bật nó thì cần set overcommit_memory = 1
Việc cần làm sau khi setup REDIS
- Tối ưu sysctl
Sửa file /etc/sysctl.conf và thêm dòng
vm.overcommit_memory=1
net.core.somaxconn=65535
Load lại sysctl:
sudo sysctl --system
2. Tuning the kernel memory
Chạy lệnh dưới quyền root:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
3. Tối ưu Redis (bonus)
Với 2 bước trên bắt buộc phải làm khi chạy Redis, các tối ưu sau thì có thể tùy mục đích
Set Max memory redis có thể sử dụng: sửa file config Redis.conf
# memory size in bytes
maxmemory 1288490188
Hoặc để dưới dạng GB cho dễ nhìn:
maxmemory 10G
Set Max client: Mặc định là 10.000 rồi nhưng nếu muốn thêm thì tìm dòng
# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
maxclients 10000
Check memory used:
redis-cli info memory
Monitor:
redis-cli monitor
Được cập nhật: 15 giờ trước (3:58:13) | Lượt xem: 909