Trong hệ thống Linux, vm.max_map_count có giá trị mặc định là 65530. Chúng ta sẽ thay đổi vm.max_map_count để giải quyết lỗi code: 137
được trả về khi chúng tôi cố gắng khởi động Elasticsearch được cài đặt trên môi trường linux với cài đặt max_map_count mặc định.
Vùng bộ nhớ ảo tối đa vm.max_map_count [65530] quá thấp, hãy tăng ít nhất lên [262144]
Như bạn đã biết rằng khi chúng tôi khởi động elaticsearch với docker-composer . Để elaticsearch bắt đầu một cách tối ưu, cần phải vượt qua một số kiểm tra bootstrap. Đây là một trong những kiểm tra bootstrap mà elaticsearch thực hiện.
Tại sao elaticsearch yêu cầu tăng giá trị vm.max_map_count
Sự gia tăng bộ nhớ ảo này được yêu cầu bởi elaticsearch sử dụng bản đồ bộ nhớ mmapfs để lưu trữ các tệp mà nó yêu cầu bộ nhớ ảo. Elaticsearch tiêu thụ rất nhiều bản đồ bộ nhớ, do đó giá trị thấp hơn có thể khiến hệ thống thoát khỏi lỗi bộ nhớ khi một quy trình đạt đến giới hạn. Tuy nhiên, chúng ta nên lưu ý rằng việc tăng giới hạn này sẽ làm tăng mức tiêu thụ bộ nhớ trên hệ thống đó và khi bộ nhớ bổ sung được sử dụng cho bản đồ bộ nhớ. Nếu chúng ta muốn elaticsearch chạy trơn tru, chúng ta cần dành bộ nhớ ảo cho chính elaticsearch.
Bất cứ lúc nào, nếu bạn muốn kiểm tra giá trị hiện tại của vm.max_map_count
cho hệ thống của mình, bạn có thể sử dụng lệnh sau
sudo sysctl vm.max_map_count
Cách thay đổi giá trị mặc định cho vm.max_map_count
Để tạm thời thay đổi giá trị vm.max_map_count, bạn chỉ cần tải giá trị này bằng lệnh sau
sudo sysctl vm.max_map_count=262144
Lệnh trên sẽ tải giá trị max_map_count cho đến khi khởi động lại hệ thống lần tiếp theo. Tức là nếu khởi động lại linux, vm.max_map_count sẽ trở về giá trị mặc định là 65530.
Nếu bạn đang tìm kiếm một giải pháp mà sau khi khởi động lại, vm.max_map_count vẫn giữ giá trị bạn đặt, bạn sẽ cần cập nhật tệp sysctl.conf. Tệp sysctl.conf có thể được cập nhật trực tiếp trong tệp hoặc thông qua dòng lệnh. Bạn có thể chọn tùy chọn theo sở thích và quyền người dùng của mình.
Cách cập nhật vm.max_map_count trực tiếp trong sysctl.conf
Đối với điều này, bạn cần có quyền cập nhật trực tiếp sysctl.conf. Trên máy chủ Ubuntu, nó có thể được tìm thấy trong thư mục /etc/sysctl.conf. Bạn có thể sử dụng bất kỳ trình soạn thảo nào bạn chọn và mở sysctl.conf. Chúng tôi sẽ sử dụng trình chỉnh sửa nano ở đây.
sudo nano sysctl.conf
Thêm phần sau vào tài liệu. Nếu giá trị cho vm.max_map_count đã được đặt trước, thì bạn chỉ cần cập nhật theo nhu cầu.
vm.max_map_count=262144
Điều này sẽ chỉ hoạt động khi chúng tôi khởi động lại máy chủ linux. Để đặt giá trị mà không pahir khởi động lại máy chủ ngay lập tức, bạn cũng có thể sử dụng lệnh sau. Lệnh này sẽ tải các giá trị từ tệp /etc/sysctl.conf.
sudo sysctl -p
Bạn cũng có thể sử dụng cùng một lệnh mà chúng tôi đã sử dụng trước đó để tạm thời tải giá trị sysctl cho đến khi chúng tôi khởi động lại hệ thống.
sudo sysctl vm.max_map_count=262144
Cách cập nhật sysctl.config thông qua tùy chọn dòng lệnh.
Trước tiên, bạn có thể tìm kiếm xem giá trị của vm.max_map_count đã được cập nhật trong tệp sysctl.conf hay chưa bằng cách sử dụng lệnh grep
grep vm.max_map_count /etc/sysctl.conf
Trong trường hợp giá trị chưa tồn tại, bạn có thể sử dụng chọn một trong các lệnh bên dưới để chèn giá trị.
Sử dụng lệnh tee
Chúng ta có thể sử dụng lệnh tee để đọc từ đầu vào tiêu chuẩn và ghi vào đầu ra tiêu chuẩn cũng như ghi vào tệp sysctl.conf như sau.
echo vm.max_map_count=262144 | sudo tee -a /etc/sysctl.conf
Lệnh tee sẽ ghi đầu ra vào màn hình tiêu chuẩn và vào tệp được chỉ định. Đừng quên thêm –a
để đảm bảo rằng tệp sysctl.conf
không bị ghi đè và giá trị được thêm vào tệp.
Lệnh trên sẽ thêm vm.max_map_count=262144 vào tệp sysctl.conf. Giá trị này sẽ được tải khi hệ thống khởi động lại. Nếu bạn cũng muốn tải giá trị này trước khi khởi động lại, hãy chạy lệnh bên dưới.
Lưu ý, nếu bạn đã chạy lệnh bên trên, thì chỉ cần chạy lệnh sudo sysctl vm.max_map_count=262144
echo vm.max_map_count=262144 | sudo tee -a /etc/sysctl.conf;sudo sysctl vm.max_map_count=262144
Sử dụng lệnh shell để chuyển hướng đầu ra
Trong trường hợp bạn muốn sử dụng lệnh shell để cập nhật giá trị vm.max_map_count, hãy sử dụng cách sau
sudo sh -c 'echo "vm.max_map_count=262144" >> /etc/sysctl.conf';sudo sysctl vm.max_map_count=262144
Thao tác này sẽ lặp lại giá trị tới màn hình tiêu chuẩn và chuyển hướng giá trị tương tự tới tệp sysctl.conf. Phần thứ hai của lệnh là tạm thời tải giá trị này vì giá trị từ sysctl.conf sẽ chỉ được tải sau khi hệ thống khởi động lại.