
server_Aに50GBのファイルが1つあり、それをserver_Bにコピーしています。
server_A$ rsync --partial --progress --inplace --append-verify 50GB_file root@server_B:50GB_file
Server_B には 32 GB の RAM と 2 GB のスワップがあります。ほとんどアイドル状態であり、多くの空き RAM があるはずです。十分なディスク容量があります。約 32 GB で、リモート側が接続を閉じたため、転送は中止されます。
Server_B はネットワークから切断されました。データ センターに再起動を依頼します。クラッシュする前のカーネル ログを見ると、スワップの使用量は 0 バイトで、プロセス リストのメモリ使用量はごくわずかでした (rsync プロセスは 600 KB の RAM を使用しているとリストされていました)。しかし、oom_killer が暴走し、ログの最後には metalog のカーネル リーダー プロセスが強制終了した箇所が記録されています。
これはカーネル 3.2.59、32 ビットです (したがって、プロセスは 4 GB を超える領域をマップできません)。
まるで Linux が長時間実行されるデーモンよりもキャッシュを優先しているかのようです。何が起こっているのでしょうか? また、これを再度起こさないようにするにはどうすればよいでしょうか?
oom_killer の出力は次のとおりです。
Sep 23 02:04:16 [kernel] [1772321.850644] clamd invoked oom-killer: gfp_mask=0x84d0, order=0, oom_adj=0, oom_score_adj=0
Sep 23 02:04:16 [kernel] [1772321.850649] Pid: 21832, comm: clamd Tainted: G C 3.2.59 #21
Sep 23 02:04:16 [kernel] [1772321.850651] Call Trace:
Sep 23 02:04:16 [kernel] [1772321.850659] [<c01739ac>] ? dump_header+0x4d/0x160
Sep 23 02:04:16 [kernel] [1772321.850662] [<c0173bf3>] ? oom_kill_process+0x2e/0x20e
Sep 23 02:04:16 [kernel] [1772321.850665] [<c0173ff8>] ? out_of_memory+0x225/0x283
Sep 23 02:04:16 [kernel] [1772321.850668] [<c0176438>] ? __alloc_pages_nodemask+0x446/0x4f4
Sep 23 02:04:16 [kernel] [1772321.850672] [<c0126525>] ? pte_alloc_one+0x14/0x2f
Sep 23 02:04:16 [kernel] [1772321.850675] [<c0185578>] ? __pte_alloc+0x16/0xc0
Sep 23 02:04:16 [kernel] [1772321.850678] [<c0189e74>] ? vma_merge+0x18d/0x1cc
Sep 23 02:04:16 [kernel] [1772321.850681] [<c01856fa>] ? handle_mm_fault+0xd8/0x15d
Sep 23 02:04:16 [kernel] [1772321.850685] [<c012305a>] ? do_page_fault+0x20e/0x361
Sep 23 02:04:16 [kernel] [1772321.850688] [<c018a9c4>] ? sys_mmap_pgoff+0xa2/0xc9
Sep 23 02:04:16 [kernel] [1772321.850690] [<c0122e4c>] ? vmalloc_fault+0x237/0x237
Sep 23 02:04:16 [kernel] [1772321.850694] [<c08ba7e6>] ? error_code+0x5a/0x60
Sep 23 02:04:16 [kernel] [1772321.850697] [<c08b0000>] ? cpuid4_cache_lookup_regs+0x372/0x3b2
Sep 23 02:04:16 [kernel] [1772321.850700] [<c0122e4c>] ? vmalloc_fault+0x237/0x237
Sep 23 02:04:16 [kernel] [1772321.850701] Mem-Info:
Sep 23 02:04:16 [kernel] [1772321.850703] DMA per-cpu:
Sep 23 02:04:16 [kernel] [1772321.850704] CPU 0: hi: 0, btch: 1 usd: 0
Sep 23 02:04:16 [kernel] [1772321.850706] CPU 1: hi: 0, btch: 1 usd: 0
Sep 23 02:04:16 [kernel] [1772321.850707] CPU 2: hi: 0, btch: 1 usd: 0
Sep 23 02:04:16 [kernel] [1772321.850709] CPU 3: hi: 0, btch: 1 usd: 0
Sep 23 02:04:16 [kernel] [1772321.850711] CPU 4: hi: 0, btch: 1 usd: 0
Sep 23 02:04:16 [kernel] [1772321.850713] CPU 5: hi: 0, btch: 1 usd: 0
Sep 23 02:04:16 [kernel] [1772321.850714] CPU 6: hi: 0, btch: 1 usd: 0
Sep 23 02:04:16 [kernel] [1772321.850716] CPU 7: hi: 0, btch: 1 usd: 0
Sep 23 02:04:16 [kernel] [1772321.850718] Normal per-cpu:
Sep 23 02:04:16 [kernel] [1772321.850719] CPU 0: hi: 186, btch: 31 usd: 70
Sep 23 02:04:16 [kernel] [1772321.850721] CPU 1: hi: 186, btch: 31 usd: 116
Sep 23 02:04:16 [kernel] [1772321.850723] CPU 2: hi: 186, btch: 31 usd: 131
Sep 23 02:04:16 [kernel] [1772321.850724] CPU 3: hi: 186, btch: 31 usd: 76
Sep 23 02:04:16 [kernel] [1772321.850726] CPU 4: hi: 186, btch: 31 usd: 29
Sep 23 02:04:16 [kernel] [1772321.850728] CPU 5: hi: 186, btch: 31 usd: 61
Sep 23 02:04:16 [kernel] [1772321.850731] CPU 7: hi: 186, btch: 31 usd: 17
Sep 23 02:04:16 [kernel] [1772321.850733] HighMem per-cpu:
Sep 23 02:04:16 [kernel] [1772321.850734] CPU 0: hi: 186, btch: 31 usd: 2
Sep 23 02:04:16 [kernel] [1772321.850736] CPU 1: hi: 186, btch: 31 usd: 69
Sep 23 02:04:16 [kernel] [1772321.850738] CPU 2: hi: 186, btch: 31 usd: 25
Sep 23 02:04:16 [kernel] [1772321.850739] CPU 3: hi: 186, btch: 31 usd: 27
Sep 23 02:04:16 [kernel] [1772321.850741] CPU 4: hi: 186, btch: 31 usd: 7
Sep 23 02:04:16 [kernel] [1772321.850743] CPU 5: hi: 186, btch: 31 usd: 188
Sep 23 02:04:16 [kernel] [1772321.850744] CPU 6: hi: 186, btch: 31 usd: 25
Sep 23 02:04:16 [kernel] [1772321.850746] CPU 7: hi: 186, btch: 31 usd: 158
Sep 23 02:04:16 [kernel] [1772321.850750] active_anon:117913 inactive_anon:9942 isolated_anon:0
Sep 23 02:04:16 [kernel] [1772321.850751] active_file:106466 inactive_file:7784521 isolated_file:0
Sep 23 02:04:16 [kernel] [1772321.850752] unevictable:40 dirty:0 writeback:61 unstable:0
Sep 23 02:04:16 [kernel] [1772321.850753] free:143494 slab_reclaimable:128312 slab_unreclaimable:4089
Sep 23 02:04:16 [kernel] [1772321.850754] mapped:6706 shmem:308 pagetables:915 bounce:0
Sep 23 02:04:16 [kernel] [1772321.850759] DMA free:3624kB min:140kB low:172kB high:208kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolate
d(file):0kB present:15808kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:240kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB writeback_tm
p:0kB pages_scanned:0 all_unreclaimable? yes
Sep 23 02:04:16 [kernel] [1772321.850763] lowmem_reserve[]: 0 869 32487 32487
Sep 23 02:04:16 [kernel] [1772321.850770] Normal free:8056kB min:8048kB low:10060kB high:12072kB active_anon:0kB inactive_anon:0kB active_file:248kB inactive_file:388kB unevictable:0kB isolated(anon)
:0kB isolated(file):0kB present:890008kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:513008kB slab_unreclaimable:16356kB kernel_stack:1888kB pagetables:3660kB unstable:0
kB bounce:0kB writeback_tmp:0kB pages_scanned:1015 all_unreclaimable? yes
Sep 23 02:04:16 [kernel] [1772321.850774] lowmem_reserve[]: 0 0 252949 252949
Sep 23 02:04:16 [kernel] [1772321.850785] lowmem_reserve[]: 0 0 0 0
Sep 23 02:04:16 [kernel] [1772321.850788] DMA: 0*4kB 7*8kB 3*16kB 6*32kB 4*64kB 6*128kB 5*256kB 2*512kB 0*1024kB 0*2048kB 0*4096kB = 3624kB
Sep 23 02:04:16 [kernel] [1772321.850795] Normal: 830*4kB 80*8kB 0*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 1*4096kB = 8056kB
Sep 23 02:04:16 [kernel] [1772321.850802] HighMem: 13*4kB 14*8kB 2*16kB 2*32kB 0*64kB 0*128kB 2*256kB 2*512kB 3*1024kB 0*2048kB 136*4096kB = 561924kB
Sep 23 02:04:16 [kernel] [1772321.850809] 7891360 total pagecache pages
Sep 23 02:04:16 [kernel] [1772321.850811] 0 pages in swap cache
Sep 23 02:04:16 [kernel] [1772321.850812] Swap cache stats: add 0, delete 0, find 0/0
Sep 23 02:04:16 [kernel] [1772321.850814] Free swap = 1959892kB
Sep 23 02:04:16 [kernel] [1772321.850815] Total swap = 1959892kB
Sep 23 02:04:16 [kernel] [1772321.949081] 8650736 pages RAM
Sep 23 02:04:16 [kernel] [1772321.949084] 8422402 pages HighMem
Sep 23 02:04:16 [kernel] [1772321.949085] 349626 pages reserved
Sep 23 02:04:16 [kernel] [1772321.949086] 7885006 pages shared
Sep 23 02:04:16 [kernel] [1772321.949087] 316864 pages non-shared
Sep 23 02:04:16 [kernel] [1772321.949089] [ pid ] uid tgid total_vm rss cpu oom_adj oom_score_adj name
(rest of process list omitted)
Sep 23 02:04:16 [kernel] [1772321.949656] [14579] 0 14579 579 171 5 0 0 rsync
Sep 23 02:04:16 [kernel] [1772321.949662] [14580] 0 14580 677 215 5 0 0 rsync
Sep 23 02:04:16 [kernel] [1772321.949669] [21832] 113 21832 42469 37403 0 0 0 clamd
Sep 23 02:04:16 [kernel] [1772321.949674] Out of memory: Kill process 21832 (clamd) score 4 or sacrifice child
Sep 23 02:04:16 [kernel] [1772321.949679] Killed process 21832 (clamd) total-vm:169876kB, anon-rss:146900kB, file-rss:2712kB
以下は、非 root ユーザーとして rsync コマンドを繰り返した後の「top」出力です。
top - 03:05:55 up 8:43, 2 users, load average: 0.04, 0.08, 0.09
Tasks: 224 total, 1 running, 223 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 99.9% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 33204440k total, 32688600k used, 515840k free, 108124k buffers
Swap: 1959892k total, 0k used, 1959892k free, 31648080k cached
sysctl vm パラメータは次のとおりです。
# sysctl -a | grep '^vm'
vm.overcommit_memory = 0
vm.panic_on_oom = 0
vm.oom_kill_allocating_task = 0
vm.oom_dump_tasks = 1
vm.overcommit_ratio = 50
vm.page-cluster = 3
vm.dirty_background_ratio = 1
vm.dirty_background_bytes = 0
vm.dirty_ratio = 0
vm.dirty_bytes = 15728640
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 3000
vm.nr_pdflush_threads = 0
vm.swappiness = 60
vm.lowmem_reserve_ratio = 256 32 32
vm.drop_caches = 0
vm.min_free_kbytes = 8192
vm.percpu_pagelist_fraction = 0
vm.max_map_count = 65530
vm.laptop_mode = 0
vm.block_dump = 0
vm.vfs_cache_pressure = 100
vm.legacy_va_layout = 0
vm.stat_interval = 1
vm.mmap_min_addr = 4096
vm.vdso_enabled = 2
vm.highmem_is_dirtyable = 0
vm.scan_unevictable_pages = 0
答え1
それでは、oom-killer の出力を読んで、そこから何がわかるかを見てみましょう。
OOM キラー ログを分析する場合、何がそれをトリガーしたかを確認することが重要です。ログの最初の行には、いくつかの手がかりがあります。
[カーネル] [1772321.850644] clamd が oom-killer を呼び出しました:gfp_mask=0x84d0、順序=0
order=0
要求されているメモリの量を示しています。カーネルのメモリ管理では 2 の累乗のページ番号しか管理できないため、clamd は 2 0ページ、つまり 4KB のメモリを要求しています。
GFP_MASK(空きページマスク取得)の下位2ビットは、いわゆるゾーンマスク アロケータにメモリをどのゾーンから取得するかを指示する:
Flag value Description
0x00u 0 implicitly means allocate from ZONE_NORMAL
__GFP_DMA 0x01u Allocate from ZONE_DMA if possible
__GFP_HIGHMEM 0x02u Allocate from ZONE_HIGHMEM if possible
メモリゾーン主に互換性の理由から作成された概念です。簡略化すると、x86 カーネルには 3 つのゾーンがあります。
Memory range Zone Purpose
0-16 MB DMA Hardware compatibility (devices)
16 - 896 MB NORMAL space directly addressable by the Kernel, userland
> 896 MB HIGHMEM userland, space addressable by the Kernel via kmap() calls
あなたの場合、ゾーンマスクは 0 であり、clamd が からメモリを要求していることを意味しますZONE_NORMAL
。
他のフラグは次のように解決されます
/*
* Action modifiers - doesn't change the zoning
*
* __GFP_REPEAT: Try hard to allocate the memory, but the allocation attempt
* _might_ fail. This depends upon the particular VM implementation.
*
* __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller
* cannot handle allocation failures.
*
* __GFP_NORETRY: The VM implementation must not retry indefinitely.
*/
#define __GFP_WAIT 0x10u /* Can wait and reschedule? */
#define __GFP_HIGH 0x20u /* Should access emergency pools? */
#define __GFP_IO 0x40u /* Can start physical IO? */
#define __GFP_FS 0x80u /* Can call down to low-level FS? */
#define __GFP_COLD 0x100u /* Cache-cold page required */
#define __GFP_NOWARN 0x200u /* Suppress page allocation failure warning */
#define __GFP_REPEAT 0x400u /* Retry the allocation. Might fail */
#define __GFP_NOFAIL 0x800u /* Retry for ever. Cannot fail */
#define __GFP_NORETRY 0x1000u /* Do not retry. Might fail */
#define __GFP_NO_GROW 0x2000u /* Slab internal usage */
#define __GFP_COMP 0x4000u /* Add compound page metadata */
#define __GFP_ZERO 0x8000u /* Return zeroed page on success */
#define __GFP_NOMEMALLOC 0x10000u /* Don't use emergency reserves */
#define __GFP_NORECLAIM 0x20000u /* No realy zone reclaim during allocation */
によるLinux MM ドキュメントGFP_ZERO
したがって、リクエストには、、、およびGFP_REPEAT
のフラグが含まれており、特に厳密なものではありません。GFP_FS
GFP_IO
GFP_WAIT
では、 はどうなっているのでしょうかZONE_NORMAL
? OOM 出力のさらに先に、いくつかの一般的な統計情報があります。
[カーネル] [1772321.850770] 正常空き:8056kB 最小:8048kB 低:10060kB高さ:12072kB アクティブ匿名:0kB 非アクティブ匿名:0kB アクティブファイル:248kB 非アクティブファイル:388kB 非追放可能:0kB 隔離(匿名):0kB 隔離(ファイル):0kB 現在:890008kB
ここで注目すべきはfree
わずか8Kmin
そしてずっと下low
これは、ホストのメモリマネージャが多少問題を抱えており、kswapdがすでにページをスワップアウトしていることを意味します。黄色以下のグラフの位相:
ゾーンのメモリ断片化に関する詳細情報は、以下に記載されています。
[カーネル] [1772321.850795] 通常: 830*4kB 80*8kB 0*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 1*4096kB = 8056kB
基本的には、4MB の連続したページが 1 つあり、残りは主に 4KB のページに大きく断片化されていることを示しています。
では、要約してみましょう。
- ユーザランドプロセス(
clamd
)がメモリを取得していますZONE_NORMAL
が、非特権メモリの割り当ては通常、ZONE_HIMEM
- メモリマネージャはこの時点で要求された4Kページを処理できるはずですが、メモリ不足がかなり発生しているようです。
ZONE_NORMAL
- システムは、
kswapd
のルールにより、すべきZONE_NORMAL
以前にページングアクティビティが見られましたが、明らかな理由もなく、メモリ不足の状態でもスワップアウトは行われませんでした。 - 上記のいずれも、なぜ
oom-killer
呼び出されたのか明確な理由を示していない。
これらはすべてかなり奇妙に思えるが、少なくともJohn O'Gorman の優れた書籍「Linux 仮想メモリ マネージャの理解」のセクション 2.5:
カーネルが使用できるアドレス空間 (ZONE_NORMAL) のサイズは限られているため、カーネルはハイ メモリの概念をサポートしています。 [...] 1GiB から 4GiB の範囲のメモリにアクセスするために、カーネルは kmap() を使用して一時的にハイ メモリから ZONE_NORMAL にページをマップします。 [...]
つまり、1GiB のメモリを記述するには、約 11MiB のカーネル メモリが必要です。したがって、16GiB では 176MiB のメモリが消費され、ZONE_NORMAL に大きな負担がかかります。ZONE_NORMAL を使用する他の構造を考慮するまでは、これはそれほど悪くないように思えます。ページ テーブル エントリ (PTE) などの非常に小さな構造でも、最悪の場合、約 16MiB が必要です。これにより、x86 Linuxで利用可能な物理メモリの実質的な限界は16GiB程度となる。。
(強調は私によるものです)
3.2 では 2.6 に比べてメモリ管理がかなり進歩しているので、これは明確な答えではありませんが、私が最初に追求すべき非常に強力なヒントです。カーネルmem=
パラメータを使用するか、サーバーから DIMM の半分を取り外すことによって、ホストの使用可能なメモリを最大 16G に減らします。
結局、64ビットカーネルを使用する。
おい、今は2015年だよ。
答え2
いくつかのこと...
私の経験則では、スワップ スペースは物理 RAM の少なくとも 2 倍の容量にする必要があります。これにより、ページ/スワップ デーモンがメモリを効率的に再編成できるようになります。
Server_Bには32GBのRAMがあるので、64GBのスワップを設定してみてください。私の意見では、あなたのサーバーの2GBのスワップスペースは方法特にサーバーにとっては低すぎます。
スワップパーティションにできる余分なパーティションがない場合は、ファイルを作成してそれをスワップパーティションとしてマウントすることでテストできます[遅くなります]。https://www.maketecheasier.com/swap-partitions-on-linux/
server_B には十分なディスク容量があるため、--inplace は必要ありません。また、rsync が 32GB を使用する原因となっている可能性があるため、--inplace は望ましくない可能性があります。--inplace は、ファイルシステムの容量が不足している場合 (実際には不足していません)、または特別なパフォーマンス要件がある場合にのみ役立ちます。
私の推測では、現在のオプションでは rsync は 50GB の RAM [ファイル サイズ] を使用するでしょう。通常、rsync はジョブを実行するためにそれほど多くのメモリを必要としないので、1 つ以上のオプションに問題がある可能性があります。私は 200GB のファイルを問題なく定期的に転送しています。
オプションなしでテスト実行をいくつか実行します。10 GB などの小さいファイルでこれを実行します。これによりカーネル パニックを回避できるだけでなく、問題の原因となっている動作を監視できます。rsync のメモリ使用量を監視します。
徐々にオプションを 1 つずつ追加していき、どのオプション [またはオプションの組み合わせ] が rsync に RAM の消費を大量に引き起こすかを確認します (たとえば、転送中に、rsync の RAM 使用量は転送されるファイル データの量に比例して増加するなど)。
rsync が RAM 内のファイル イメージを保持するオプションが本当に必要な場合は、追加のスワップ領域が必要になり、最大ファイル サイズがそれに応じて制限されます。
さらにいくつか[更新済み]:
(1) カーネルスタックのトレースバックは、rsyncがmmap領域でページフォールトを起こしていることを示しています。おそらくファイルをmmapしているのでしょう。mmapはディスクにフラッシュする保証はありません。それまでファイルは閉じられ(読み取り/書き込みとは異なり)、すぐに FS ブロック キャッシュに送られます(そこでフラッシュされます)。
(2) カーネルのクラッシュ/パニックは、転送サイズが RAM のサイズに達したときに発生します。明らかに、rsync は malloc または mmap を介してその量の非 fscache メモリを取得しています。もう一度、指定したオプションを使用すると、rsync は 50 GB のファイルを転送するために 50 GB のメモリを割り当てます。
(3) 24GB のファイルを転送します。おそらくこれでうまくいくでしょう。次に、カーネルを mem=16G で起動し、24GB のファイル テストを再度実行します。32GB ではなく 16GB でオーバーフローします。これにより、rsync に本当にメモリが必要であることが確認できます。
(4) スワップを追加するのは馬鹿げていると言う前に、[スワップからファイルへの方法で] スワップを追加してみてください。これは、スワップが不要であるというすべての学術的な議論よりもはるかに簡単に実行およびテストできます。これが解決策ではないとしても、そこから何かを学べるかもしれません。mem=16G テストはパニックやクラッシュなしで成功するでしょう。
(5)rsyncははスワップにヒットしますが、OOM が起動して rsync を終了する前に top で確認するには速すぎます。rsync が 32GB に達するまでには、他のプロセスは既にスワップに追い出されています (特にアイドル状態の場合)。おそらく、「free」と「top」を組み合わせると、より正確な状況がわかるでしょう。
(6) rsync が強制終了された後、mmap を FS にフラッシュするのに時間がかかります。OOM には十分な速さではなく、他の処理を強制終了し始めます (明らかにミッションクリティカルなものもあります)。つまり、mmap フラッシュと OOM が競合しています。または、OOM にバグがあります。そうでなければ、クラッシュは発生しません。
(7) 私の経験では、システムが「メモリの壁にぶつかる」と、Linux が完全に回復するまでに長い時間がかかります。また、完全に回復しないことがあり、それを解消するには再起動するしかありません。たとえば、私の RAM は 12GB です。40GB のメモリを使用するジョブ (大規模なジョブに対応するために 120GB のスワップがあります) を実行してからそれを強制終了すると、システムが通常の応答性に戻るまで約 10 分かかります (その間、ディスク ライトは点灯したままです)。
(8)rsyncを実行するそれなしオプション。これでうまくいきます。作業のベースライン例を入手します。次に、--inplace を戻して再テストします。次に、代わりに --append-verify を実行します。次に、両方を試します。どのオプションで rsync が巨大な mmap を実行するかを調べます。次に、それなしでも問題ないかを判断します。--inplace が原因である場合は、ディスク領域が十分にあるため、考える必要はありません。オプションが必要な場合は、rsync が実行する malloc/mmap に対応するためにスワップ領域を取得する必要があります。
2回目の更新:
上記の mem= および小さいファイルのテストを行ってください。
中心的な質問: rsync が OOM によって強制終了されるのはなぜですか? メモリを消費しているのは誰/何ですか?
システムが 32 ビットであることを読みましたが、忘れていました。したがって、rsync が直接原因ではない可能性があり (malloc/mmap 経由 - glibc は匿名/プライベート mmap 経由で大規模な malloc を実装)、rsync の mmap ページ フォールトが偶然 OOM をトリガーしただけであることに同意します。次に、OOM は rsync によって直接的および間接的に消費されるメモリの合計 (FS キャッシュ、ソケット バッファなど) を計算し、それが主な候補であると判断します。したがって、メモリ使用量の合計を監視すると役立つ場合があります。ファイル転送と同じ速度で徐々に増加すると思われます。明らかに、そうすべきではありません。
/proc または /proc/rsync_pid で監視できる項目は、高速ループ内の perl または python スクリプト (bash スクリプトではおそらく世界終焉イベントには十分速くない) で、次のすべてを 1 秒あたり数百回監視できます。これを rsync よりも高い優先度で実行して RAM 内に保持し、クラッシュ直前やできれば OOM 中に監視して、OOM がおかしくなる理由を確認できます。
/proc/meminfo -- 「衝撃の時点」でのスワップ使用量をより詳細に取得します。実際には、合計でどのくらいの RAM が使用されているかの最終的な数値を取得する方が便利です。top はこれを提供しますが、「ビッグバン」の直前の宇宙の状態 (たとえば、最後の 10 ミリ秒) を表示するには速度が足りない可能性があります。
/proc/rsync_pid/fd ディレクトリ。シンボリックリンクを読むことで、ターゲットファイルで開かれている fd を識別できます (例: /proc/rsync_pid/fd/5 の readlink --> target_file)。これはおそらく、fd 番号を取得するために 1 回だけ実行する必要があります [固定されたままになるはずです]
fd 番号がわかったら、/proc/rsync_pid/fdinfo/fd を確認します。これは次のようなテキスト ファイルです。
pos: <ファイル位置> フラグ: blah_blah mnt_id: blah_blah
「pos」値を監視すると、「最後のファイル位置」が役に立つ場合があります。さまざまなサイズと mem= オプションを使用して複数のテストを実行する場合、最後のファイル位置はこれらのいずれかを追跡しますか [どのように]? 通常の疑い: ファイル位置 == 使用可能な RAM
しかし、最も簡単な方法は、「rsync local_file server:remote_file」から始めて、それが機能するかどうかを確認することです。「ssh server rsync file_a file_b」を実行すると、同様の(ただしより高速な)結果が得られる場合があります(最初に 50 GB の file_a を作成する必要があります)。file_a を作成する簡単な方法は、scp local_system:original_file server:file_a です。これはそれ自体興味深いかもしれません(たとえば、rsync がクラッシュしたときにこれが機能するかどうか? scp は機能するが rsync が失敗する場合は、これが rsync を指します。scp が失敗する場合は、NIC ドライバーなどの他のものを指します)。ssh rsync を実行すると、NIC も方程式から外れるようになり、役立つ場合があります。これがシステムを台無しにする場合は、何かが本当に間違っています。成功した場合は、[前述したように] オプションを 1 つずつ追加し直してください。
この点について繰り返し述べるのは気が進みませんが、swap-to-file 経由でスワップを追加すると、クラッシュの動作が変わったり遅延したりすることがあり、診断ツールとして役立つ可能性があります。たとえば、16 GB のスワップを追加するとクラッシュが 32 GB から 46 GB に遅延する (メモリ使用量またはターゲット ファイルの位置で測定) 場合、それは何かを物語っています。
特定のプロセスではなく、メモリを消費している誤ったカーネル ドライバーである可能性があります。カーネルの内部 vmalloc がリソースを割り当て、スワップ アウトできます。私の記憶が正しければ、あらゆる状況でアドレス指定可能性に制限されるわけではありません。
明らかに、OOM は混乱/パニックに陥っています。つまり、rsync を強制終了しても、メモリがタイムリーに解放されたことに気づかず、他の犠牲者を探し始めます。犠牲者の中には、システムの動作に重大な影響を与えるものもあるでしょう。
malloc/mmap は別として、これはフラッシュされていない FS キャッシュに長い時間がかかることが原因で発生する可能性があります (たとえば、フラッシュされていないデータが 30 GB あり、ディスク速度が 300 MB/秒と仮定すると、フラッシュに 100 秒かかる可能性があります)。その速度でも、OOM が急ぎすぎる可能性があります。または、OOM が rsync を強制終了しても、FS フラッシュが十分に速く開始されない (またはまったく開始されない) 可能性があります。または、FS フラッシュは十分に速く行われますが、ページが空きプールに戻される「遅延」リリースがあります。FS キャッシュの動作を制御するために設定できる /proc オプションがいくつかあります (それが何だったか思い出せません)。
mem=4G または他の小さな数値で起動してみてください。これにより、FS キャッシュが削減され、フラッシュ時間が短縮されて、OOM が他の処理を探す必要がなくなります (たとえば、フラッシュ時間が 100 秒から 1 秒未満に短縮されます)。また、32 ビット システムなどで 4GB を超える物理 RAM を処理できない OOM バグが明らかになる可能性もあります。
また、重要な点として、非ルートとして実行します。ルート ユーザーはリソースを消費することがないため、より寛容な制限が与えられます (例: メモリの 99% に対して、非ルート ユーザーの場合は 95%)。これが、OOM がこのような状態になっている理由かもしれません。また、これにより、OOM などがメモリを再利用するための余裕が生まれます。
答え3
clamd? ClamAVを使用していて、オンアクセススキャンが有効になっているようです。オンアクセススキャンでは、ウイルス対策エンジンが開かれたファイルをウイルススキャンしようとします。他のプロセスによって開かれたすべてのファイルの内容全体をメモリにロードすることによって。
セキュリティ体制とこの転送の必要性に応じて、転送の実行中に ClamAV オンアクセス スキャンを無効にすることを検討する必要があります。