Không thể thay đổi vm.max_map_count cho elaticsearch


14

Thời tiền sử

Tôi có elaticsearch và SugarCRM7 chạy trên CentOS 6.5. Mỗi ngày tôi phải đối mặt với cùng một vấn đề: lỗi java outOfMemory. Điều đó xảy ra do giá trị vm.max_map_count nhỏ, 65530 chỉ khi 262144 được khuyến nghị.

Vấn đề

Vấn đề là vm.max_map_count dường như không thể thay đổi:

  1. Thay đổi dưới gốc

    sudo sysctl -w vm.max_map_count=262144
    

    trả lại

    lỗi: quyền bị từ chối trên khóa 'vm.max_map_count'

    Trong khi

    ps aux | grep java
    

    Chỉ trả về quá trình grep

  2. Thay đổi khi khởi động elaticsearch

    sudo service elasticsearch start
    

    Trả về lỗi, quá

    lỗi: quyền bị từ chối trên khóa 'vm.max_map_count'

    Bắt đầu tìm kiếm: [OK]

  3. Thay đổi thủ công qua tệp (hack bẩn-bẩn):

    sudo vi /proc/sys/vm/max_map_count
    

    Cũng không hoạt động:

    "/ Proc / sys / vm / max_map_count" [chỉ đọc] 1L, 6C

    - CHERTN - W10: Cảnh báo: Thay đổi tệp chỉ đọc

    E45: tùy chọn 'chỉ đọc' được đặt (thêm! Để ghi đè)

    "/ Proc / sys / vm / max_map_count" E212: Không thể mở tệp để ghi

    Trong khi

    ls -la /proc/sys/vm/ | grep max_map_count
    

    Trả về

    -rw-r - r-- 1 root root 0 ngày 10 tháng 4 09:36 max_map_count

    (Nhưng tôi đoán điều này có thể là bình thường đối với linux nói về thư mục / Proc)

Vậy làm thế nào tôi có thể thay đổi giá trị của biến này? Khởi động lại elaticsearch mỗi đêm không phải là một ý tưởng hay ... Hoặc ít nhất có thể có ai đó biết tại sao lỗi này xảy ra?


3
Đó là loại máy gì? Ảo? Nếu vậy những loại ảo hóa được sử dụng? Lưu ý rằng một số ảo hóa, ví dụ, các thùng chứa OpenVZ áp đặt giới hạn đối với vùng chứa của bạn và không cho phép bạn "điều chỉnh" kernel và các công cụ cấp thấp khác.
Miroslav Koškár

@MiroslavKoskar Tôi không biết, thật không may. Làm thế nào tôi có thể tìm ra nó?
Valentina ngày

@MiroslavKoskar Quên đề cập đến - máy là ảo, dĩ nhiên
Valentina ngày

1
Làm thế nào để tìm hiểu? Vâng, nó được lưu trữ ở đâu? Nó khá rõ ràng vì nó thường là một phần trong hợp đồng của bạn với nhà cung cấp dịch vụ lưu trữ. Nếu vẫn còn nghi ngờ, hãy liên hệ với bộ phận hỗ trợ nhà cung cấp dịch vụ lưu trữ của bạn, IMHO là nơi tốt nhất để bắt đầu (vì đó thường là một phần của thỏa thuận và là thứ bạn có khả năng trả tiền).
Miroslav Koškár

@MiroslavKoskar, nhà cung cấp đã trả lời mà không đề cập đến công nghệ mà họ không thể giúp tôi với vấn đề này (điều đó khá hợp lý). Cảm ơn sự giúp đỡ của bạn
Valentina

Câu trả lời:


13

bạn gần như ở đó, không quan trọng nếu là máy ảo hay máy vật lý, những cài đặt đó luôn có thể thay đổi.

Tôi sẽ chỉ ra 3 phương pháp.

Một số thông tin trước:

1) Tốt hơn là thực thi như root, nếu có thể.

2) / Proc trên unix không phải là một hệ thống tệp thực, nó là một hệ thống tệp hạt nhân trong bộ nhớ, nhưng nó có vẻ giống như một hệ thống tệp đĩa bình thường. Bạn có thể gọi nó là 'hệ thống tệp giả' hoặc 'hệ thống tệp đặc biệt', bạn không thể chỉnh sửa các tệp giả mạo đó bằng vi hoặc bất kỳ trình chỉnh sửa nào khác, vì chúng không phải là tệp, chúng trông giống như tệp. Tôi mắc kẹt với cùng một vấn đề năm trước.

Nhưng thật đơn giản để thay đổi giá trị của chúng, chỉ cần một loại 'cơ học' khác để chỉnh sửa chúng.

Tôi sẽ giải thích: Đầu tiên, cần phải là root: (sudo không hoạt động trong một số bản phát hành, nhưng không phải trên một số bản phân phối khác như bạn đã thử, phương pháp đầu tiên này là phổ biến và hoạt động trên mọi Linux, macOS hoặc bất kỳ nền tảng Unix nào Hy vọng bạn có quyền truy cập vào mật khẩu root.

Tiến hành nhanh chóng:

    $ su root

Nhập mật khẩu root.

Bây giờ bạn đã root, hãy kiểm tra giá trị hiện tại của: / Proc / sys / vm / max_map_count

    $ cat /proc/sys/vm/max_map_count  
    65536

Hãy thay đổi nó:

    echo 262144 > /proc/sys/vm/max_map_count

Hãy xác minh:

    cat /proc/sys/vm/max_map_count
    262144

Xong rôi! Và nó đã được áp dụng và chức năng. Bằng cách thay đổi giá trị của bất kỳ tệp giả nào trong / Proc, cài đặt sẽ hoạt động ngay lập tức. Nhưng họ không kiên trì sau khi khởi động lại. Bạn có thể chơi với các giá trị và đo lường thay đổi hiệu suất tại elasticearh hoặc bất kỳ số liệu ứng dụng hoặc hệ thống nào khác. Hãy điều chỉnh hệ thống của bạn, viết các giá trị lên một số giấy, giữ các giá trị tốt nhất. Trong bất kỳ sai lầm nào, hãy khởi động lại và tất cả chúng sẽ trở về giá trị ban đầu và bắt đầu lại cho đến khi tất cả các giá trị mong muốn là tối ưu. Có rất nhiều tham số có thể điều chỉnh đĩa và bộ nhớ trong / Proc. Và họ tạo ra sự khác biệt lớn và tăng hiệu suất nếu bạn điều chỉnh chúng tốt (và có thời gian cho nó). Bạn đang đi đúng hướng.

Khi hài lòng, hãy làm cho chúng vĩnh viễn:

Phương pháp đầu tiên:

sử dụng /etc/rc.local

    vi /etc/rc.local 

đặt tất cả các tham số trong tập tin RC.local, ví dụ:

    echo 220000000 > /proc/sys/vm/dirty_background_bytes
    echo 320000000 > /proc/sys/vm/dirty_bytes
    echo 0 > /proc/sys/vm/dirty_background_ratio
    echo 0 > /proc/sys/vm/dirty_ratio
    echo 500 > /proc/sys/vm/dirty_writeback_centisecs
    echo 4500 > /proc/sys/vm/dirty_expire_centisecs
    echo 1 > /proc/sys/net/ipv4/tcp_rfc1337
    echo 10 > /proc/sys/vm/swappiness
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
    echo 0 > /proc/sys/vm/zone_reclaim_mode
    echo deadline > /sys/block/sda/queue/scheduler
    echo 8 > /sys/class/block/sda/queue/read_ahead_kb
    echo 1048575 > /proc/sys/vm/max_map_count

thoát vi biên tập lưu tập tin.

Các tham số đó sẽ được đặt trên mỗi lần khởi động lại, SAU tất cả các dịch vụ init đã bắt đầu, ngay trước khi dấu nhắc đăng nhập hiển thị.

( /etc/rc.local file được thực thi sau khi tất cả các dịch vụ linux khởi động, nó có thể không hoạt động nếu elaticsearch bắt đầu trước khi nó là một dịch vụ, nhưng phương pháp này có thể hữu ích trong một thiết lập khác nếu bạn cần trong tương lai hoặc bạn có thể sử dụng như thế này bằng cách đặt chúng bên trong tập lệnh init elearchearch của bạn, bởi vì tập lệnh init chạy dưới dạng root, do đó, đây là cú pháp tương tự ở trên để sử dụng bên trong tập lệnh init)

Bạn cũng có thể sao chép chúng ngay bây giờ và dán chúng để thay đổi ngay lập tức. Các tham số trên là hợp lệ, điều chỉnh và chạy trên máy chủ cassandra apache của tôi. Nếu bạn muốn, hãy thử chúng như một điểm khởi đầu để điều chỉnh của bạn.

Phương pháp thứ hai để làm cho chúng vĩnh viễn:

Các tham số bây giờ sẽ được đặt TRƯỚC bất kỳ dịch vụ khởi động nào trên linux.

Chỉnh sửa /etc/sysctl.conf , đặt tham số bên trong

 vm.max_map_count=1048575
 vm.zone_reclaim_mode=0
 vm.dirty_background_bytes=220000000
 vm.dirty_background_ratio=0
 vm.dirty_bytes=320000000
 vm.dirty_ratio=0
 vm.swappiness=10

tiếp tục với những người khác, lưu /etc/sysctl.conf , khởi động lại máy chủ của bạn để áp dụng các thay đổi hoặc thực hiện: sysctl -p để áp dụng các thay đổi mà không cần khởi động lại. Họ sẽ được vĩnh viễn trên các lần khởi động lại.

Hai phương pháp trên là commom nhất. Có một cái khác, và nó có thể phù hợp với bạn, đó là bằng cách sử dụng sudo , gần giống như bạn đang làm:

thay vì:

  sudo sysctl -w vm.max_map_count=262144

thử:

  echo 262144 | sudo tee /proc/sys/vm/max_map_count

Nó hoạt động trên Ubuntu.

Kiểm chứng:

   user@naos:~$ cat /proc/sys/vm/max_map_count
   262144

Hy vọng tôi đã giúp được cách nào đó, ít nhất là bằng cách đưa ra 3 lựa chọn khác nhau để giải quyết vấn đề, vì câu hỏi của bạn đã gần một năm rồi;)

Trân trọng, Rafael Prado


3
Họ đã làm điều này, và nó đã thất bại.
Michael Hampton

1
Xin chào Michael, vâng bạn đúng. Lúc đầu tôi hiểu rằng vấn đề liên quan đến hệ điều hành CentOS và các quyền của người dùng unix, vì vậy tôi đã theo dõi câu trả lời đó. Nhưng thông tin mới hơn đặt trọng tâm của vấn đề vào "máy chủ" OpenVZ, giới hạn một số cài đặt. Kiến thức của tôi là về Centos và VmWare, nhưng không phải về OpenVZ.
dùng62739

4

Tôi nghĩ rằng "máy ảo" của bạn thực sự là một thùng chứa OpenVZ (bạn có thể xác minh điều này bằng cách chạy virt-what).

Trong trường hợp này, bạn không thể thay đổi vm.max_map_countsysctl hoặc nhiều người khác. Các giá trị được cố định.

Đây là một vấn đề nổi tiếng với elaticsearch ( vấn đề # 4978 ). Đó không chỉ là Elaticsearch. Các ứng dụng Java nổi tiếng là hoạt động kém trên các nhà cung cấp OpenVZ khác nhau, chủ yếu là do các máy chủ thường được điều chỉnh kém và bạn không thể làm gì về điều đó. Một người bình luận về vấn đề đó lặp lại chính xác đề xuất của tôi là gì:

joshuajonah đã bình luận vào ngày 20 tháng 10 năm 2015
Điều này thật điên rồ. Tôi đoán tôi sẽ đổi sang VPS KVM.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.