Cấu hình giới hạn File Descriptors (ulimit) cho User OpenSearch
OpenSearch mở rất nhiều file khi chạy (index files, segments, logs). Nếu giới hạn file descriptors mặc định của hệ thống (thường là 1024) quá thấp, cluster sẽ bị treo hoặc lỗi "Too many open files" khi tải dữ liệu lớn.
Chúng ta cần tăng giá trị này lên ít nhất 65536 cho user opensearch để đảm bảo hoạt động ổn định.
1. Sửa file systemd để tăng ulimit
Chỉnh sửa file service unit của OpenSearch để áp dụng giới hạn mới khi khởi động service.
sudo systemctl edit opensearch
File cấu hình mở ra, thêm nội dung sau vào cuối file:
[Service]
LimitNOFILE=65536
LimitNPROC=65536
Lưu và đóng file. Sau đó reload systemd daemon để nhận diện thay đổi.
sudo systemctl daemon-reload
2. Sửa file giới hạn hệ thống (limits.conf)
Để đảm bảo giới hạn này được áp dụng cả khi chạy thủ công hoặc từ các script, cần chỉnh sửa file /etc/security/limits.conf.
echo "* soft nofile 65536" | sudo tee -a /etc/security/limits.conf
echo "* hard nofile 65536" | sudo tee -a /etc/security/limits.conf
echo "opensearch soft nofile 65536" | sudo tee -a /etc/security/limits.conf
echo "opensearch hard nofile 65536" | sudo tee -a /etc/security/limits.conf
3. Verify kết quả
Khởi động lại service OpenSearch để áp dụng các thay đổi.
sudo systemctl restart opensearch
Chạy lệnh kiểm tra giới hạn file descriptors hiện tại của user opensearch.
cat /proc/$(pgrep -f opensearch)/limits | grep "Max open files"
Kết quả mong đợi: Cột "Soft Limit" và "Hard Limit" phải hiển thị giá trị 65536 hoặc cao hơn.
Cấu hình bộ nhớ Heap trong JVM Options
Bộ nhớ Heap (JVM Heap) là nơi lưu trữ các index và segment cache. Quy tắc vàng của OpenSearch: Heap không nên vượt quá 50% tổng RAM vật lý và tuyệt đối không vượt quá 32GB (do giới hạn của Compressed OOPs).
Giả sử server có 16GB RAM, chúng ta sẽ cấu hình Heap là 8GB.
1. Xác định RAM hiện có
Trước khi cấu hình, cần biết chính xác dung lượng RAM của server.
free -h
Ghi nhận giá trị "total" ở dòng "Mem". Ví dụ: 16G.
2. Chỉnh sửa file jvm.options
File cấu hình JVM nằm tại `/etc/opensearch/jvm.options`. Chúng ta sẽ xóa các dòng heap mặc định và thay thế bằng cấu hình tối ưu.
sudo cp /etc/opensearch/jvm.options /etc/opensearch/jvm.options.bak
Thay thế nội dung các dòng liên quan đến Heap (Xms và Xmx) trong file. Dưới đây là nội dung hoàn chỉnh cho file `/etc/opensearch/jvm.options` (dành cho server 16GB RAM, heap 8GB):
### JVM_HEAP_SIZE ###
# Set Xms and Xmx to the same value
-Xms8g
-Xmx8g
### GC ###
# Use the G1 GC
-XX:+UseG1GC
### Heap dump on OOM ###
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/lib/opensearch/heapdump.hprof
### Lucene ###
-XX:+ExplicitGCInvokesConcurrent
-XX:G1HeapRegionSize=16m
-XX:InitiatingHeapOccupancyPercent=30
-XX:G1ReservePercent=15
-XX:ParallelGCThreads=4
-XX:ConcGCThreads=1
-XX:G1NewSizePercent=50
-XX:G1MaxGenotypeLength=4
-XX:G1MaxRPermSize=10m
-XX:G1PermSize=10m
-XX:G1ReservePercent=10
-XX:G1ReservePercent=10
### JMX ###
-Djdk.attach.allowAttachSelf
-Djava.net.preferIPv4Stack=true
-Djava.security.manager=allow
-Dopensearch.security.disabled=true
### Misc ###
-Dopensearch.node.name=opensearch-node-1
-Dopensearch.data.path=/var/lib/opensearch/data
-Dopensearch.logs.path=/var/log/opensearch
-Dopensearch.config.path=/etc/opensearch
-Dopensearch.plugins.dir=/usr/share/opensearch/plugins
Lưu ý: Giá trị `-Xms8g` và `-Xmx8g` phải bằng nhau. Nếu RAM server khác, hãy tính toán lại (Max 32g).
3. Verify kết quả
Khởi động lại OpenSearch để áp dụng cấu hình Heap mới.
sudo systemctl restart opensearch
Chờ khoảng 30-60 giây để node khởi động xong, sau đó kiểm tra thông tin JVM từ API.
curl -s -k https://localhost:9200/_nodes/jvm | jq '.nodes[] | {name: .name, heap_used: .jvm.mem.heap_used, heap_max: .jvm.mem.heap_max_in_bytes}'
Kết quả mong đợi: Trường `heap_max_in_bytes` phải xấp xỉ 8GB (8589934592 bytes) nếu bạn cấu hình 8g. Nếu dùng RAM 32GB+ thì heap_max sẽ là 32GB (33554432000 bytes).
Tối ưu hóa Lucene và Indexing trong opensearch.yml
Sau khi JVM đã ổn, cần điều chỉnh các tham số ở tầng Lucene (thư viện tìm kiếm) để tăng tốc độ ghi (indexing) và đọc (searching).
1. Cấu hình số lượng Shard và Replica
Việc chia nhỏ index (sharding) giúp phân tán tải. Tuy nhiên, quá nhiều shard sẽ gây overhead. Quy tắc: Tổng số shard (primary + replica) không nên vượt quá 1000 trên một node.
Chỉnh sửa file `/etc/opensearch/opensearch.yml`.
sudo nano /etc/opensearch/opensearch.yml
Thêm hoặc sửa các dòng sau vào cuối file (hoặc tìm và chỉnh sửa nếu đã tồn tại):
# Tối ưu số lượng shard mặc định
index.number_of_shards: 1
index.number_of_replicas: 0
# Tối ưu bộ nhớ cache cho Lucene (Fielddata và Query)
indices.memory.index_buffer_size: 50%
index.store.memory: 100%
Ghi chú: `index.number_of_replicas: 0` chỉ dùng cho môi trường Dev/Test. Nếu Production, hãy để là 1.
2. Cấu hình Refresh Interval và Merge Policy
Mặc định OpenSearch refresh index sau mỗi 1 giây. Khi đang bulk import dữ liệu lớn, hãy tăng thời gian này để giảm I/O disk.
Thêm các dòng sau vào file `/etc/opensearch/opensearch.yml`:
# Tăng thời gian refresh khi bulk import (tối ưu ghi)
index.refresh_interval: 30s
# Tối ưu Merge Policy (tối ưu đọc và giảm số lượng segment file)
index.translog.durability: async
index.translog.sync_interval: 5s
index.codec: best_compression
Lưu ý: `best_compression` giúp giảm dung lượng disk nhưng tốn CPU hơn. Nếu server CPU yếu, có thể bỏ dòng này.
3. Verify kết quả
Khởi động lại service.
sudo systemctl restart opensearch
Tạo một index test và kiểm tra settings đã áp dụng chưa.
curl -s -k https://localhost:9200/_settings | jq '.["test-index"].settings.index.refresh_interval'
Kết quả mong đợi: Giá trị `refresh_interval` phải trả về `30s`. Nếu trả về `1s` thì cấu hình chưa được apply đúng.
Cấu hình Swap Space để tránh OOM Killer
OpenSearch rất nhạy cảm với Swap. Khi RAM đầy, Linux sẽ đẩy dữ liệu vào Swap disk. Điều này làm chậm OpenSearch cực độ. Hơn nữa, nếu Swap quá nhiều, Linux OOM Killer có thể giết chết tiến trình OpenSearch.
Chúng ta sẽ tắt Swap hoặc giảm Swappiness xuống 0.
1. Kiểm tra và tắt Swap hiện tại
Trước tiên, kiểm tra xem hệ thống có đang dùng Swap không.
swapon --show
Nếu có dòng xuất hiện, tắt Swap ngay lập tức để OpenSearch không bị ảnh hưởng.
sudo swapoff -a
2. Giảm Swappiness xuống 0
Tham số `vm.swappiness` kiểm soát xu hướng sử dụng swap. Mặc định là 60. Chúng ta cần giảm xuống 0 để Linux chỉ dùng swap khi RAM hoàn toàn hết sạch (tình huống cực hiếm).
sudo sysctl vm.swappiness=0
3. Làm việc vĩnh viễn (Persist configuration)
Để cấu hình này không mất sau khi reboot, cần thêm vào file `/etc/sysctl.conf`.
echo "vm.swappiness=0" | sudo tee -a /etc/sysctl.conf
Đồng thời, đảm bảo file `/etc/fstab` không có dòng mount swap (hoặc comment dòng đó đi) để swap không tự bật lên khi khởi động lại máy.
sudo cat /etc/fstab | grep swap
Nếu có dòng nào xuất hiện, hãy comment bằng cách thêm ký hiệu `#` vào đầu dòng đó.
sudo nano /etc/fstab
Sửa dòng swap thành: `# /dev/sdX swap swap defaults 0 0`.
4. Verify kết quả
Kiểm tra giá trị swappiness hiện tại.
cat /proc/sys/vm/swappiness
Kết quả mong đợi: Phải trả về giá trị `0`.
Kiểm tra lại trạng thái swap.
free -h
Cột "Swap" phải hiện là 0B (hoặc rất nhỏ nếu hệ thống vẫn giữ một ít buffer, nhưng về cơ bản là không dùng).
Điều hướng series:
Mục lục: Series: Triển khai Database Search với OpenSearch và Ubuntu 24.04
« Phần 3: Cấu hình bảo mật và xác thực SSL/TLS cho OpenSearch
Phần 5: Quản lý Index và Mapping dữ liệu cơ bản »