Elastik arama için vm.max_map_count değiştirilemiyor


14

tarih öncesi

CentOS 6.5 üzerinde çalışan elasticsearch ve SugarCRM7 var. Her gün aynı sorunla karşılaşıyorum: java outOfMemory hatası. Bu, yalnızca 262144 önerildiğinde, küçük vm.max_map_count değeri, 65530 nedeniyle olur.

Sorun

Sorun şu ki, vm.max_map_count değiştirilemez gibi görünüyor:

  1. Kök altında değiştirme

    sudo sysctl -w vm.max_map_count=262144
    

    İadeler

    hata: 'vm.max_map_count' anahtarında izin reddedildi

    Süre

    ps aux | grep java
    

    Yalnızca grep işlemini döndürür

  2. Elastik arama başlangıcında değişiklik

    sudo service elasticsearch start
    

    Hata da döndürür

    hata: 'vm.max_map_count' anahtarında izin reddedildi

    Elastik arama başlatılıyor: [Tamam]

  3. Dosya ile manuel değişiklikler (kirli-kirli kesmek):

    sudo vi /proc/sys/vm/max_map_count
    

    İkisi de çalışmaz:

    "/ proc / sys / vm / max_map_count" [salt okunur] 1L, 6C

    - INSERT - W10: Uyarı: Salt okunur bir dosyayı değiştirme

    E45: 'salt okunur' seçeneği ayarlandı (geçersiz kılmak için! Ekleyin)

    "/ proc / sys / vm / max_map_count" E212: Dosya yazmak için açılamıyor

    Süre

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

    İadeler

    -rw-r - r-- 1 kök kökü 0 Nis 10 09:36 max_map_count

    (Ama bu linux / proc dizini hakkında konuşmak için normal olabilir sanırım)

Peki bu değişkenin değerini nasıl değiştirebilirim? Her gece elasticsearch'ü yeniden başlatmak iyi bir fikir değil ... Ya da en azından birisi bu hatanın neden olduğunu biliyor olabilir mi?


3
Ne tür bir makine? Gerçek? Varsa ne tür bir sanallaştırma kullanılır? OpenVZ kapsayıcıları gibi bazı sanallaştırmaların kapınıza sınırlama getirdiğini ve çekirdeği ve diğer düşük düzey öğeleri "değiştirmenize" izin vermediğini unutmayın.
Miroslav Koškár

@MiroslavKoskar Ne yazık ki bilmiyorum. Nasıl öğrenebilirim?
Valentina

@MiroslavKoskar Bahsetmeyi unuttum - makine sanal, tabii ki
Valentina

1
Nasıl öğrenilir? Nerede barındırılıyor? Genellikle barındırma sağlayıcınızla sözleşmenizin bir parçası olduğu için oldukça açık olmalıdır. Hala şüpheniz varsa, barındırma sağlayıcı desteğinizle (IMHO) başlamak için en iyi yerle iletişim kurun (çünkü genellikle anlaşmanın bir parçası ve muhtemelen ödediğiniz bir şeydir).
Miroslav Koškár

@MiroslavKoskar iyi, sağlayıcı teknolojiden bahsetmeden cevap verdi bu sorun bana yardımcı olamaz (oldukça makul). Yardımınız için teşekkürler
Valentina

Yanıtlar:


13

neredeyse oradasınız, Sanal bir makine veya fiziksel bir makine olması önemli değil, bu ayarlar her zaman değiştirilebilir.

3 yöntem göstereceğim.

Bazı ön bilgiler:

1) Mümkünse kök olarak yürütmek daha iyidir.

2) / proc on unix gerçek bir dosya sistemi değildir, bellek içi bir çekirdek dosya sistemidir, ancak normal bir disk dosya sistemi gibi görünmektedir. Buna 'sahte dosya sistemi' veya 'özel dosya sistemi' diyebilirsiniz, bu sahte dosyaları vi veya başka bir düzenleyici ile düzenleyemezsiniz, çünkü bunlar dosya değil, sadece dosyaya benziyorlar. Yıllar önce aynı sorunla karşılaştım.

Ancak değerlerini değiştirmek basittir, bunları düzenlemek için başka bir tür 'mekanik' gerektirir.

Açıklayacağım: İlk olarak, root olmanız gerekir: (sudo bazı dağıtımlarda çalışır, ancak denediğiniz gibi başka dağıtımlarda çalışmaz, bu ilk yöntem evrenseldir ve herhangi bir Linux, macOS veya Unix tabanlı herhangi bir bilgisayarda çalışır Umarım root şifresine erişiminiz olur.

Hemen devam edin:

    $ su root

Kök şifresini girin.

Şimdi köksünüz , şu anki değerini kontrol edelim: / proc / sys / vm / max_map_count

    $ cat /proc/sys/vm/max_map_count  
    65536

Değiştirelim:

    echo 262144 > /proc/sys/vm/max_map_count

Doğrulayalım:

    cat /proc/sys/vm/max_map_count
    262144

Bitti! Ve zaten uygulanmış ve işlevsel. / Proc altındaki herhangi bir sözde dosyanın değerlerini değiştirerek ayarlar anında etkinleşir. Ancak yeniden başlatmanın ardından devam etmezler. Elasticsearh veya başka herhangi bir uygulama veya sistem metriklerinde değerlerle oynayabilir ve performans değişikliklerini ölçebilirsiniz . Sisteminizi düzeltmeye çalışın, değerleri bir kağıda yazın, en iyi değerleri koruyun. Herhangi bir hata durumunda, yeniden başlatın ve hepsi orijinal değerlerine geri dönecek ve istenen tüm değerler optimal olana kadar yeniden başlayacaktır. / Proc altında çok fazla disk ve bellekle ayarlanabilen parametre var. Ve onları iyi ayarlamanız (ve bunun için zamanınız olması) durumunda büyük bir fark ve performans kazancı yaratırlar. Doğru yoldasınız.

Memnun kaldıklarında, onları kalıcı hale getirelim:

İlk yöntem:

/etc/rc.local kullanma

    vi /etc/rc.local 

tüm parametreleri rc.local dosyasının içine koyun, örnek:

    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

vi editörü dosyayı kaydetmeden çıkın.

Bu parametreler, tüm başlatma hizmetleri başlatıldıktan SONRA, oturum açma istemi gösterilmeden hemen önce her yeniden başlatmada ayarlanır.

( /etc/rc.local dosyası tüm başlangıç ​​linux hizmetlerinden sonra yürütülür, elasticsearch bir hizmet olarak önce başlıyorsa çalışmayabilir, ancak gelecekte bu yöntem başka bir kurulumda yararlı olabilir veya bu şekilde kullanabilirsiniz elasticsearch init betiğinizin içine yerleştirerek, init betiği kök olarak çalıştığından, init betiğinin içinde kullanmak için yukarıdaki sözdizimiyle aynıdır)

Ayrıca şimdi kopyalayabilir ve anlık değişiklikler için yapıştırabilirsiniz. Yukarıdaki parametreler geçerli, ayarlanmış ve apache cassandra sunucumda çalışıyor. İsterseniz, bunları ayarlamak için bir başlangıç ​​noktası olarak deneyin.

Kalıcı hale getirmenin ikinci yöntemi:

Parametreler artık linux'daki herhangi bir başlatma hizmetinden ÖNCE ayarlanacaktır.

Düzen /etc/sysctl.conf , koyun parametreler içeride

 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

diğerleriyle devam edin, /etc/sysctl.conf dosyasını kaydedin , değişiklikleri uygulamak için sunucunuzu yeniden başlatın veya değişiklikleri yeniden başlatmaksızın uygulamak için sysctl -p komutunu çalıştırın . Yeniden başlatmalarda kalıcı olacaklar.

Yukarıdaki iki yöntem en yaygın olanıdır. Başka bir tane var ve sizin için işe yarayabilir , neredeyse sudo yaptığınız gibi, sudo kullanarak :

onun yerine:

  sudo sysctl -w vm.max_map_count=262144

Deneyin:

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

Ubuntu üzerinde çalışır.

Doğrulayın:

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

Umarım bir şekilde yardımcı oldum, en azından sorunla başa çıkmak için 3 farklı seçenek vererek, sorunuz neredeyse bir yaşında olduğu için;)

Saygılarımızla, Rafael Prado


3
Zaten yaptığımız bu ve o başarısız oldu.
Michael Hampton

1
Merhaba Michael, evet haklısın. İlk başta sorunun işletim sistemi CentOS ve unix kullanıcı izinleriyle ilgili olduğunu anladım, bu yüzden cevabımda bu satırı takip ettim. Ancak daha yeni bilgiler, sorunun odağını bazı ayarları sınırlayan "ana bilgisayar" OpenVZ'ye yerleştirir. Benim bilgim Centos ve VmWare ile ilgili ama OpenVZ ile ilgili değil.
user62739

4

Ben "sanal makine" aslında bir OpenVZ konteyner (ki bunu çalıştırarak doğrulayabilirsiniz virt-what) olduğunu düşünüyorum.

Bu durumda, vm.max_map_countsysctl veya diğerlerini değiştiremezsiniz . Değerler sabittir.

Bu, elasticsearch ile ilgili iyi bilinen bir konudur ( sorun # 4978 ). Sadece Elasticsearch değil. Java uygulamalarının çeşitli OpenVZ sağlayıcılarında kötü performans gösterdiği iyi bilinir, çünkü ana bilgisayarlar genellikle zayıf ayarlanmıştır ve bu konuda yapabileceğiniz hiçbir şey yoktur. Bu konuda bir yorumcu benim tavsiyem tam olarak ne olacağını söyledi:

joshuajonah 20 Ekim 2015 tarihinde yorum yaptı
This is deli. Sanırım bir KVM VPS'ye geçeceğim.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.