Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Tại sao redis không thể đặt tệp mở tối đa

Chà, hơi muộn cho bài viết này, nhưng vì tôi vừa dành rất nhiều thời gian (cả đêm) để định cấu hình máy chủ redis mới 3.0.6 trên ubuntu 16.04. Tôi nghĩ tôi chỉ nên viết ra cách tôi làm điều đó để những người khác không phải mất thời gian của họ ...

Đối với máy chủ redis mới được cài đặt, bạn có thể sẽ gặp các sự cố sau trong tệp nhật ký redis là /var/log/redis/redis-server.log

Tệp mở tối đa

3917:M 16 Sep 21:59:47.834 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
3917:M 16 Sep 21:59:47.834 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
3917:M 16 Sep 21:59:47.834 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.

Tôi đã thấy rất nhiều bài đăng yêu cầu bạn sửa đổi

/etc/security/limits.conf
redis soft nofile 10000
redis hard nofile 10000

hoặc

/etc/sysctl.conf
fs.file-max = 100000

Điều đó có thể hoạt động trong ubuntu 14.04, nhưng nó chắc chắn không hoạt động trong ubuntu 16.04. Tôi đoán nó có liên quan gì đó đến việc thay đổi từ phiên bản mới sang systemd, nhưng tôi không phải là chuyên gia về nhân linux!

Để khắc phục điều này, bạn phải thực hiện systemd cách

/etc/systemd/system/redis.service
[Service]
...
User=redis
Group=redis
# should be fine as long as you add it under [Service] block
LimitNOFILE=65536
...

Sau đó, bạn phải tải lại daemon và khởi động lại dịch vụ

sudo systemctl daemon-reload
sudo systemctl restart redis.service

Để kiểm tra xem nó có hoạt động hay không, hãy thử giới hạn mức catc

cat /run/redis/redis-server.pid
cat /proc/PID/limits

và bạn sẽ thấy

Max open files            65536                65536                files     
Max locked memory         65536                65536                bytes   

Ở giai đoạn này, tệp đang mở tối đa được giải quyết.

Kết nối tối đa của ổ cắm

2222:M 16 Sep 20:38:44.637 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

Thừa bộ nhớ

2222:M 16 Sep 20:38:44.637 # Server started, Redis version 3.0.6
2222:M 16 Sep 20:38:44.637 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

Vì hai điều này có liên quan đến nhau, chúng tôi sẽ giải quyết nó ngay lập tức.

sudo vi /etc/sysctl.conf

# Add at the bottom of file
vm.overcommit_memory = 1
net.core.somaxconn=1024

Bây giờ để các cấu hình này hoạt động, bạn cần tải lại cấu hình

sudo sysctl -p

Các trang khổng lồ trong suốt

1565:M 16 Sep 22:48:00.993 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

Để giải quyết vĩnh viễn điều này, hãy làm theo đề xuất của nhật ký và sửa đổi rc.local

sudo vi /etc/rc.local

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

Điều này yêu cầu bạn khởi động lại , sao lưu dữ liệu của bạn hoặc làm bất cứ điều gì bạn cần trước khi thực sự làm điều đó !!

sudo reboot

Bây giờ, hãy kiểm tra lại nhật ký của bạn, bạn sẽ có một máy chủ redis mà không có bất kỳ lỗi hoặc cảnh báo nào.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách nhanh nhất để lưu trữ một mảng numpy trong redis

  2. Redis vấn đề chèn nhiều

  3. sự cố kết nối với redis để sử dụng với nhiều thợ máy

  4. Tôi có thể kết nối trực tiếp với máy chủ Redis từ JavaScript đang chạy trong trình duyệt không?

  5. tắt máy chủ redis từ dòng lệnh