> For the complete documentation index, see [llms.txt](https://learnsql.gitbook.io/lernmysql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learnsql.gitbook.io/lernmysql/elasticsearch-and-php-and-mysql-thuc-hanh-phan-10-queue-capacity-1000.md).

# ElasticSearch & php & mysql thực hành – Phần 10 – queue capacity 1000

## ElasticSearch & php & mysql thực hành – Phần 10 – queue capacity 1000

[November 10, 2015](https://thinhpc86.wordpress.com/2015/11/10/elasticsearch-php-mysql-thuc-hanh-phan-10-queue-capacity-1000/) [thinhpc86](https://thinhpc86.wordpress.com/author/thinhpc86/) [Java](https://thinhpc86.wordpress.com/tag/java/), [PHP](https://thinhpc86.wordpress.com/category/php/)[ElasticSearch](https://thinhpc86.wordpress.com/tag/elasticsearch/), [OutOfMemoryError](https://thinhpc86.wordpress.com/tag/outofmemoryerror/), [PHP](https://thinhpc86.wordpress.com/tag/php/)

Sau khi bạn đã [có được 1 lượng dữ liệu lớn](https://thinhpc86.wordpress.com/2015/08/25/elasticsearch-php-mysql-thuc-hanh-phan-9-bulk-api/) 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 | `curl -XGET` `'`[`http://localhost:9200/_cluster/stats?human&pretty`](http://localhost:9200/_cluster/stats?human\&pretty)`'` |
| - | ---------------------------------------------------------------------------------------------------------------------------- |

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](https://thinhpc86.wordpress.com/2015/06/12/elasticsearch-php-mysql-thuc-hanh-phan-7/), 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.
