AWS EC2内のCentos7に基づいて構築されたJenkinsインスタンスでDockerコンテナを構築または実行しています。 2つのCPUと3.5GBの空きメモリを備えた2つのt2.mediumインスタンスがあります。
場合によっては、別のコンテナ内にコンテナを作成し、単にドラッグして実行します(他のコンテナ)。
エラーが発生し始めました。
open /var/lib/docker/overlay/<sha>-init/merged/dev/console: cannot allocate memory
私達はjournalctl
得た
page allocation failure: order:4
ページキャッシュダンプを実行すると、問題が一時的に解決される可能性があります。
echo 1 > /proc/sys/vm/drop_caches
だから私はドッカータスクを実行するとDirty
メモリブロックが(必要に応じて)急増し、Mapped
その後にジャンプすることがわかりました。しかし、DirectMap4k
今回のジャンプは比較的近いです。
たとえば、
アイドルマシン
cat /proc/meminfo | grep -P "(Dirty|Mapped|DirectMap4k)"
Dirty: 104 kB
Mapped: 45696 kB
DirectMap4k: 100352 kB
主な動機
cat /proc/meminfo | grep -P "(Dirty|Mapped|DirectMap4k)"
Dirty: 72428 kB
Mapped: 70192 kB
DirectMap4k: 100352 kB
したがって、このマシンが失敗し始めるのにはしばらく時間がかかりますが、同じマシンは報告され、定期的にDirectMap4k: 77824 kB
失敗しますが(より複雑なコンテナの構築も処理しなければなりません)sysctl vm
。
Dockerコンテナをビルド/実行するとメモリ不足エラーが発生し、問題はカーネルを安定させるためにどの調整が必要かです。
ドッカーバージョン
Client:
Version: 17.06.0-ce
API version: 1.30
Go version: go1.8.3
Git commit: 02c1d87
Built: Fri Jun 23 21:20:36 2017
OS/Arch: linux/amd64
Server:
Version: 17.06.0-ce
API version: 1.30 (minimum version 1.12)
Go version: go1.8.3
Git commit: 02c1d87
Built: Fri Jun 23 21:21:56 2017
OS/Arch: linux/amd64
Experimental: false
コア3.10.0-327.10.1.el7.x86_64
システム制御仮想マシン
vm.admin_reserve_kbytes = 8192
vm.block_dump = 0
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30
vm.dirty_writeback_centisecs = 500
vm.drop_caches = 1
vm.extfrag_threshold = 500
vm.hugepages_treat_as_movable = 0
vm.hugetlb_shm_group = 0
vm.laptop_mode = 0
vm.legacy_va_layout = 0
vm.lowmem_reserve_ratio = 256 256 32
vm.max_map_count = 65530
vm.memory_failure_early_kill = 0
vm.memory_failure_recovery = 1
vm.min_free_kbytes = 67584
vm.min_slab_ratio = 5
vm.min_unmapped_ratio = 1
vm.mmap_min_addr = 4096
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.nr_overcommit_hugepages = 0
vm.nr_pdflush_threads = 0
vm.numa_zonelist_order = default
vm.oom_dump_tasks = 1
vm.oom_kill_allocating_task = 0
vm.overcommit_kbytes = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.page-cluster = 3
vm.panic_on_oom = 0
vm.percpu_pagelist_fraction = 0
vm.stat_interval = 1
vm.swappiness = 30
vm.user_reserve_kbytes = 108990
vm.vfs_cache_pressure = 100
vm.zone_reclaim_mode = 0
ベストアンサー1
長い話を短く
sudo su
sysctl -w vm.swappiness=10
説明する
私はこのエラーを10/10回再現できるテストシナリオを作成しました。これは、CIを介さずにコマンドラインから直接大きな画像を構築することです。
述べたように、私が知っている解決策は次のとおりです。
echo 1 > /proc/sys/vm/drop_caches
だから私はDirectMap
それを価値観に結び付けようとしています。これらの値はTLB負荷を表し、直接調整できないことがわかっているので、これを使用するための好ましい値である交換性(commutativity)を探してみました。
RHLE 7のドキュメントでは、交換性について説明しています。:
交換性
swappiness 値の範囲は 0 ~ 100 で、システムが匿名メモリまたはページキャッシュをサポートする程度を制御します。高い値は、ファイルシステムのパフォーマンスを向上させるとともに、アクティブではないプロセスをRAMで積極的に置き換えます。値が低いほど、メモリ内のプロセスを交換するのを防ぐことができます。これは通常、I / Oパフォーマンスを犠牲にして待ち時間を短縮します。デフォルトは60です。
警告する
swappiness == 0に設定すると、スワップアウトが非常に積極的に防止されるため、強力なメモリとI / O圧力がOOMシャットダウンのリスクを高めます。
したがって、これを減らすと、メモリ内キャッシュページへの依存度が減少します。私たちが使用しているEC2 Centos 7の画像はデフォルトで30に設定されているので、10に減らすと大きな画像が10/10倍になります。