ElasticSearch & php & mysql thực hành – Phần 10 – queue capacity 1000
https://thinhpc86.wordpress.com/2015/11/10/elasticsearch-php-mysql-thuc-hanh-phan-10-queue-capacity-1000/
ElasticSearch & php & mysql thực hành – Phần 10 – queue capacity 1000
November 10, 2015 thinhpc86 Java, PHPElasticSearch, OutOfMemoryError, PHP
Sau khi bạn đã có được 1 lượng dữ liệu lớn cho index của bạn. Và chạy test với lượng request ( search hoặc index) lớn mỗi ngày có thể bạn sẽ đối mặt với những Error sau đây khiến ES bị ngưng chạy, thậm chí gây cho các service khác trong cùng server cũng bị ngưng trệ, không chạy được.
Biểu hiện:
Khi xem log của elasticsearch. Bạn sẽ gặp 1 trong những (hoặc tất cả) error message sau:
– rejected execution (queue capacity 1000) – failed to reduce search – java.lang.OutOfMemoryError: Java heap space
Nguyên nhân:
ES cần nhiều RAM hơn cái lượng mà bạn đang dành cho nó. Bạn cần tăng RAM thêm cho ES (tăng ES_HEAP_SIZE)
Cách kiểm tra lượng memory ES đang dùng:
Bạn chạy dòng lệnh sau:
1
Kết quả sẽ in ra nhiều thông số của ES. Trong đó bạn chú ý đến thông số memory:
123456789101112131415161718
"jvm"
: { "max_uptime"
:
"16.7h", "max_uptime_in_millis"
: 60333921, "versions"
: [ { "version"
:
"1.8.0_51", "vm_name"
:
"OpenJDK 64-Bit Server VM", "vm_version"
:
"25.51-b03", "vm_vendor"
:
"Oracle Corporation", "count"
: 1 } ], "mem"
: { "heap_used"
:
"1.8gb", "heap_used_in_bytes"
: 1995711136, "heap_max"
:
"3.7gb", "heap_max_in_bytes"
: 4054515712 }, "threads"
: 258},
heap_max là 3.7 GB, và heap_used là 1.8GB. Như vậy là tốt, memory sử dụng trong giới hạn cho phép. Khi bạn bị out of memory thì heap_used sẽ thường xuyên bằng hoặc lớn hơn heap_max. Bằng dòng lệnh trên bạn có thể check trong thời điểm hiện tại ES có dùng quá nhiều memory hay không.
Khi bạn bị out of memory. Hãy restart lại ES. Và chạy dòng lệnh trên liên tục để check ( vì nó sẽ thay đổi theo từng giây). Sau khi khởi động, heap_used sẽ tăng dần cho đến khi đạt hoặc vượt ngưỡng heap_max. Lúc đó bạn hiểu rằng bạn cần tăng thêm heap_max cho ES.
Change Heap size:
Cách config Heap size mình đã giới thiệu ở phần 7: setting ES, các bạn có thể xem lại.
ES ngốn khá nhiều RAM khi lượng request lớn. Nếu bạn có 10 GB ram thì nên để cho ES max là 5 GB RAM.
Để thay đổi heap size bạn làm như sau: Trong file: /etc/default/elasticsearch(In CentOS: ‘/etc/sysconfig/elasticsearch’ or /etc/init.d/elasticsearch):
123
ES_HEAP_SIZE=512mMAX_OPEN_FILES=65535MAX_LOCKED_MEMORY=unlimited
Trong file:
/etc/elasticsearch/elasticsearch.yml:
1
bootstrap.mlockall: true
setting mlockall như trên để ngăn swapping.
Restart lại ES.
Chú ý: đường dẫn đến file config elasticsearch có thể khác nhau. Bạn cần tìm đúng file đó. Như trường hợp của mình thì nó là file:
/usr/local/share/elasticsearch/bin/elasticsearch.conf. Do mình dùng Service wrapper để elasticsearch chạy như 1 service. Mình config như sau:
123
set.default.ES_HEAP_SIZE=4000set.default.MAX_OPEN_FILES=65535set.default.MAX_LOCKED_MEMORY=unlimited
Trước đây mình tìm hiểu trên nhiều bài viết thì họ hướng dẫn config thí dụ 1GB, 1g, 2G … để config với đơn vị Gigabyte. Mình đã thử config là 4g. Nhưng khi restart lại thì gặp lỗi:
1
java.lang.OutOfMemoryError: Direct buffer memory
Nhìn lại file config của mình thì nhận ra là file config của mình nó nhận ES_HEAP_SIZE theo MB. Đoạn config trong file như sau:
12345
# Initial Java Heap Size (in MB)wrapper.java.initmemory=%ES_HEAP_SIZE%
# Maximum Java Heap Size (in MB)wrapper.java.maxmemory=%ES_HEAP_SIZE%
Tức là thay vì viết là 4g thì phải viết là 4000 (tức 4000MB) thì mới đúng. Chứ 4g nó sẽ hiểu là 4MB Vì chỗ này và chưa thạo về cách check heap_used mà mình mất cả tuần loay hoay với lỗi OutOfMemoryError. Các bạn cần xem kỹ file config và check heap_used xem config đã đúng chưa.
Kiểm tra và ước lượng:
Sau khi restart ES. Bạn chạy lệnh check heap size usage trên kia để xem kết quả.
Nếu heap_max được update như bạn đã thay đổi thì bạn đã config đúng, còn không thì phải xem lại. Bạn check liên tục, nếu heap_used tăng dần đến hạn và vượt heap_max thì bạn phải change lại heap size để tăng thêm cho nó. Nếu heap_used ổn định ở 1 hạn mức nào đó nhỏ hơn heap_max thì bạn đã config thành công. Yên tâm sẽ không bị Out of memory nữa Nếu heap_used ổn định ở 1 mức thấp hơn nhiều heap_max thì bạn nên change lại heap size, giảm bớt xuống tránh việc cấp phát memory cho ES nhiều quá gây thừa thãi.
Kết: Khi dùng ES thì bạn ko thể tránh khỏi việc dành nhiều RAM cho nó. Nhưng hiệu quả thì khá vượt trội so với dùng mysql. Có thể đáp ứng được lượng request lớn, query search, filter phức tạp đều được giải quyết nhanh chóng. Nếu server có nhiều RAM và tất nhiên là bạn config đúng thì sẽ thấy ES chạy rất êm.
Hi vọng bài viết giúp giải quyết đúng vấn đề các bạn đang gặp phải.
Last updated