Penyebab fragmentasi halaman pada server "besar" dengan xfs, 20 disk dan Ceph

18

Setiap wawasan dari seseorang dengan sedikit pengalaman dalam sistem IO linux akan sangat membantu. Inilah kisah saya:

Baru-baru ini memunculkan sekelompok enam Dell PowerEdge rx720xds untuk melayani file melalui Ceph. Mesin-mesin ini memiliki 24 core di atas dua soket dengan dua zona numa dan 70 gigabytes aneh. Disk diformat sebagai penggerebekan dari masing-masing disk (kita tidak bisa melihat cara untuk mengeksposnya secara langsung jika tidak). Jaringan disediakan oleh mellanox infiniband IP over IB (paket IP diubah menjadi IB di tanah kernel, bukan perangkat keras).

Kami memasang masing-masing drive SAS kami seperti ini:

# cat /proc/mounts | grep osd
/dev/sdm1 /var/lib/ceph/osd/ceph-90 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdj1 /var/lib/ceph/osd/ceph-87 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdu1 /var/lib/ceph/osd/ceph-99 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdd1 /var/lib/ceph/osd/ceph-82 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdk1 /var/lib/ceph/osd/ceph-88 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdl1 /var/lib/ceph/osd/ceph-89 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdh1 /var/lib/ceph/osd/ceph-86 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdo1 /var/lib/ceph/osd/ceph-97 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdc1 /var/lib/ceph/osd/ceph-81 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdb1 /var/lib/ceph/osd/ceph-80 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sds1 /var/lib/ceph/osd/ceph-98 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdn1 /var/lib/ceph/osd/ceph-91 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sde1 /var/lib/ceph/osd/ceph-83 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdq1 /var/lib/ceph/osd/ceph-93 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdg1 /var/lib/ceph/osd/ceph-85 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdt1 /var/lib/ceph/osd/ceph-95 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdf1 /var/lib/ceph/osd/ceph-84 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdr1 /var/lib/ceph/osd/ceph-94 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdi1 /var/lib/ceph/osd/ceph-96 xfs rw,noatime,attr2,inode64,noquota 0 0
/dev/sdp1 /var/lib/ceph/osd/ceph-92 xfs rw,noatime,attr2,inode64,noquota 0 0

IO melalui mesin-mesin ini meledak pada beberapa ratus MB / s, tetapi sebagian besar waktu cukup menganggur dengan banyak 'colekan':

# iostat -x -m
Linux 3.10.0-123.el7.x86_64 (xxx)   07/11/14    _x86_64_    (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       1.82    0.00    1.05    0.11    0.00   97.02
Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.11    0.25    0.23     0.00     0.00    27.00     0.00    2.07    3.84    0.12   0.61   0.03
sdb               0.02     0.57    3.49    2.28     0.08     0.14    77.18     0.01    2.27    2.99    1.18   1.75   1.01
sdd               0.03     0.65    3.93    3.39     0.10     0.16    70.39     0.01    1.97    2.99    0.79   1.57   1.15
sdc               0.03     0.60    3.76    2.86     0.09     0.13    65.57     0.01    2.10    3.02    0.88   1.68   1.11
sdf               0.03     0.63    4.19    2.96     0.10     0.15    73.51     0.02    2.16    3.03    0.94   1.73   1.24
sdg               0.03     0.62    3.93    3.01     0.09     0.15    70.44     0.01    2.06    3.01    0.81   1.66   1.15
sde               0.03     0.56    4.35    2.61     0.10     0.14    69.53     0.02    2.26    3.00    1.02   1.82   1.26
sdj               0.02     0.73    3.67    4.74     0.10     0.37   116.06     0.02    1.84    3.01    0.93   1.31   1.10
sdh               0.03     0.62    4.31    3.04     0.10     0.15    67.83     0.02    2.15    3.04    0.89   1.75   1.29
sdi               0.02     0.59    3.82    2.47     0.09     0.13    74.35     0.01    2.20    2.96    1.03   1.76   1.10
sdl               0.03     0.59    4.75    2.46     0.11     0.14    70.19     0.02    2.33    3.02    1.00   1.93   1.39
sdk               0.02     0.57    3.66    2.41     0.09     0.13    73.57     0.01    2.20    3.00    0.97   1.76   1.07
sdm               0.03     0.66    4.03    3.17     0.09     0.14    66.13     0.01    2.02    3.00    0.78   1.64   1.18
sdn               0.03     0.62    4.70    3.00     0.11     0.16    71.63     0.02    2.25    3.01    1.05   1.79   1.38
sdo               0.02     0.62    3.75    2.48     0.10     0.13    76.01     0.01    2.16    2.94    0.99   1.70   1.06
sdp               0.03     0.62    5.03    2.50     0.11     0.15    68.65     0.02    2.39    3.08    0.99   1.99   1.50
sdq               0.03     0.53    4.46    2.08     0.09     0.12    67.74     0.02    2.42    3.04    1.09   2.01   1.32
sdr               0.03     0.57    4.21    2.31     0.09     0.14    72.05     0.02    2.35    3.00    1.16   1.89   1.23
sdt               0.03     0.66    4.78    5.13     0.10     0.20    61.78     0.02    1.90    3.10    0.79   1.49   1.47
sdu               0.03     0.55    3.93    2.42     0.09     0.13    70.77     0.01    2.17    2.97    0.85   1.79   1.14
sds               0.03     0.60    4.11    2.70     0.10     0.15    74.77     0.02    2.25    3.01    1.10   1.76   1.20
sdw               1.53     0.00    0.23   38.90     0.00     1.66    87.01     0.01    0.22    0.11    0.22   0.05   0.20
sdv               0.88     0.00    0.16   28.75     0.00     1.19    84.55     0.01    0.24    0.10    0.24   0.05   0.14
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00    1.84    1.84    0.00   1.15   0.00
dm-1              0.00     0.00    0.23    0.29     0.00     0.00    23.78     0.00    1.87    4.06    0.12   0.55   0.03
dm-2              0.00     0.00    0.01    0.00     0.00     0.00     8.00     0.00    0.47    0.47    0.00   0.45   0.00

Masalah:

Setelah sekitar 48 jam kemudian, halaman-halaman yang berdekatan menjadi terfragmentasi sehingga magniutde empat (16 halaman, 65536 byte) alokasi mulai gagal dan kami mulai menjatuhkan paket (karena kalloc gagal ketika SLAB ditanam).

Inilah tampilan server yang relatif "sehat":

# cat /sys/kernel/debug/extfrag/unusable_index
Node 0, zone      DMA 0.000 0.000 0.000 0.001 0.003 0.007 0.015 0.031 0.031 0.096 0.225 
Node 0, zone    DMA32 0.000 0.009 0.015 0.296 0.733 0.996 0.997 0.998 0.998 1.000 1.000 
Node 0, zone   Normal 0.000 0.000 0.019 0.212 0.454 0.667 0.804 0.903 0.986 1.000 1.000 
Node 1, zone   Normal 0.000 0.027 0.040 0.044 0.071 0.270 0.506 0.772 1.000 1.000 1.000 

Ketika fragmentasi menjadi jauh lebih buruk, sistem tampaknya mulai berputar dalam ruang kernel dan semuanya berantakan. Satu anomali selama kegagalan ini adalah bahwa xfsaild tampaknya menggunakan banyak CPU dan terjebak dalam kondisi tidur yang tidak pernah terputus. Saya tidak ingin langsung mengambil kesimpulan dengan keanehan selama kegagalan total sistem.

Penanganannya sejauh ini.

Untuk memastikan bahwa alokasi ini tidak gagal, bahkan di bawah fragmentasi, saya menetapkan:

vm.min_free_kbytes = 16777216

Setelah melihat jutaan blkdev_requests dalam cache SLAB, saya mencoba mengurangi halaman kotor melalui:

vm.dirty_ratio = 1
vm.dirty_background_ratio = 1
vm.min_slab_ratio = 1
vm.zone_reclaim_mode = 3

Mungkin mengubah terlalu banyak variabel sekaligus, tetapi untuk berjaga-jaga jika inode dan gigi palsu menyebabkan fragmentasi, saya memutuskan untuk membuatnya seminimal mungkin:

vm.vfs_cache_pressure = 10000

Dan ini sepertinya membantu. Fragmentasi masih tinggi, dan berkurangnya masalah inode dan dentry berarti saya melihat sesuatu yang aneh yang membuat saya ...

Pertanyaan saya:

Mengapa saya memiliki begitu banyak blkdev_requests (yang aktif tidak kurang), yang hilang begitu saja ketika saya menjatuhkan cache?

Inilah yang saya maksud:

# slabtop -o -s c | head -20
 Active / Total Objects (% used)    : 19362505 / 19431176 (99.6%)
 Active / Total Slabs (% used)      : 452161 / 452161 (100.0%)
 Active / Total Caches (% used)     : 72 / 100 (72.0%)
 Active / Total Size (% used)       : 5897855.81K / 5925572.61K (99.5%)
 Minimum / Average / Maximum Object : 0.01K / 0.30K / 15.69K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
2565024 2565017  99%    1.00K  80157       32   2565024K xfs_inode              
3295194 3295194 100%    0.38K  78457       42   1255312K blkdev_requests        
3428838 3399527  99%    0.19K  81639       42    653112K dentry                 
5681088 5680492  99%    0.06K  88767       64    355068K kmalloc-64             
2901366 2897861  99%    0.10K  74394       39    297576K buffer_head            
 34148  34111  99%    8.00K   8537        4    273184K kmalloc-8192           
334768 334711  99%    0.57K  11956       28    191296K radix_tree_node        
614959 614959 100%    0.15K  11603       53     92824K xfs_ili                
 21263  19538  91%    2.84K   1933       11     61856K task_struct            
 18720  18636  99%    2.00K   1170       16     37440K kmalloc-2048           
 32032  25326  79%    1.00K   1001       32     32032K kmalloc-1024           
 10234   9202  89%    1.88K    602       17     19264K TCP                    
 22152  19765  89%    0.81K    568       39     18176K task_xstate

# echo 2 > /proc/sys/vm/drop_caches                                                                                                                                                   :(
# slabtop -o -s c | head -20       
 Active / Total Objects (% used)    : 965742 / 2593182 (37.2%)
 Active / Total Slabs (% used)      : 69451 / 69451 (100.0%)
 Active / Total Caches (% used)     : 72 / 100 (72.0%)
 Active / Total Size (% used)       : 551271.96K / 855029.41K (64.5%)
 Minimum / Average / Maximum Object : 0.01K / 0.33K / 15.69K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
 34140  34115  99%    8.00K   8535        4    273120K kmalloc-8192           
143444  20166  14%    0.57K   5123       28     81968K radix_tree_node        
768729 224574  29%    0.10K  19711       39     78844K buffer_head            
 73280   8287  11%    1.00K   2290       32     73280K xfs_inode              
 21263  19529  91%    2.84K   1933       11     61856K task_struct            
686848  97798  14%    0.06K  10732       64     42928K kmalloc-64             
223902  41010  18%    0.19K   5331       42     42648K dentry                 
 32032  23282  72%    1.00K   1001       32     32032K kmalloc-1024           
 10234   9211  90%    1.88K    602       17     19264K TCP                    
 22152  19924  89%    0.81K    568       39     18176K task_xstate            
 69216  59714  86%    0.25K   2163       32     17304K kmalloc-256            
 98421  23541  23%    0.15K   1857       53     14856K xfs_ili                
  5600   2915  52%    2.00K    350       16     11200K kmalloc-2048           

Ini mengatakan kepada saya bahwa penumpukan blkdev_request sebenarnya tidak terkait dengan halaman kotor, dan lebih jauh bahwa objek aktif tidak benar-benar aktif? Bagaimana bisa benda-benda ini dibebaskan jika sebenarnya tidak digunakan? Apa yang terjadi disini?

Untuk beberapa latar belakang, inilah yang dilakukan drop_caches:

http://lxr.free-electrons.com/source/fs/drop_caches.c

Memperbarui:

Berhasil bahwa mereka mungkin bukan blkdev_requests, tetapi mungkin entri xfs_buf muncul di bawah 'tajuk' itu? Tidak yakin cara kerjanya:

/sys/kernel/slab # ls -l blkdev_requests(
lrwxrwxrwx 1 root root 0 Nov  7 23:18 blkdev_requests -> :t-0000384/

/sys/kernel/slab # ls -l | grep 384
lrwxrwxrwx 1 root root 0 Nov  7 23:18 blkdev_requests -> :t-0000384/
lrwxrwxrwx 1 root root 0 Nov  7 23:19 ip6_dst_cache -> :t-0000384/
drwxr-xr-x 2 root root 0 Nov  7 23:18 :t-0000384/
lrwxrwxrwx 1 root root 0 Nov  7 23:19 xfs_buf -> :t-0000384/

Saya masih tidak tahu mengapa ini dihapus oleh 'drop_slabs', atau bagaimana mencari tahu apa yang menyebabkan fragmentasi ini.

Pertanyaan bonus: Apa cara yang lebih baik untuk mendapatkan sumber fragmentasi ini?

Jika Anda membaca sejauh ini, terima kasih atas perhatian Anda!

Informasi tambahan yang diminta:

Info memori dan xfs: https://gist.github.com/christian-marie/f417cc3134544544a8d1

Kegagalan alokasi halaman: https://gist.github.com/christian-marie/7bc845d2da7847534104

Tindak lanjut: info perf dan hal-hal terkait pemadatan

http://ponies.io/raw/compaction.png

Kode pemadatan tampaknya sedikit tidak efisien ya? Saya telah mengumpulkan beberapa kode untuk mencoba mereplikasi kompaksi yang gagal: https://gist.github.com/christian-marie/cde7e80c5edb889da541

Ini sepertinya mereproduksi masalah.

Saya juga akan mencatat bahwa jejak acara memberi tahu saya bahwa ada banyak pengambilan kembali yang gagal, berulang-ulang:

<...>-322 [023] .... 19509.445609: mm_vmscan_direct_reclaim_end: nr_reclaimed=1

Output Vmstat juga memprihatinkan. Sementara sistem dalam kondisi beban tinggi ini, kompaksi akan melewati atap (dan sebagian besar gagal):

pgmigrate_success 38760827 pgmigrate_fail 350700119 compact_migrate_scanned 301784730 compact_free_scanned 204838172846 compact_isolated 18711615 compact_stall 270115 compact_fail 244488 compact_success 25212

Memang ada sesuatu yang serba salah dengan reklamasi / pemadatan.

Saat ini saya ingin mengurangi alokasi pesanan tinggi dengan menambahkan dukungan SG ke pengaturan ipoib kami. Masalah sebenarnya muncul kemungkinan terkait vmscan.

Ini menarik, dan merujuk pertanyaan ini: http://marc.info/?l=linux-mm&m=141607142529562&w=2

pingu
sumber
2
Heck ya !! Kami tidak mendapatkan banyak pertanyaan bagus ini. Akan saya lihat apa yang bisa kita lakukan.
ewwhite
1
Bisakah Anda memberikan hasil /proc/buddyinfodan hasil free -m? Permintaan blockdev mungkin direpresentasikan sebagai buffer di free. Oh, dan distro yang Anda gunakan akan bagus juga. Selain itu, apakah Anda memiliki page allocation failurepesan yang muncul dmesg? Jika demikian tolong berikan output ditambah konteks relevan apa pun.
Matthew Ife
1
Juga, apakah Anda menggunakan mkfs.xfsbaris perintah tertentu ? Hugepages diaktifkan?
ewwhite
Juga hasil dari/proc/meminfo
Matthew Ife
Mencoba menonaktifkan hugepage transparan sendiri (mengaturnya untuk tidak pernah), kegagalan masih terjadi. Tidak mencoba ini bersamaan dengan 'perbaikan' lainnya.
pingu

Jawaban:

4

Saya pikir saya akan memberikan jawaban dengan pengamatan saya karena ada banyak komentar.

Didasarkan pada output Anda di https://gist.github.com/christian-marie/7bc845d2da7847534104

Kami dapat menentukan yang berikut:

  1. GFP_MASK untuk alokasi memori yang dicoba diizinkan untuk melakukan hal berikut.
    • Dapat mengakses kolam darurat (saya pikir ini berarti mengakses data di bawah tanda air tinggi untuk zona)
    • Jangan gunakan cadangan darurat (saya pikir ini berarti jangan izinkan akses untuk memroy di bawah tanda air min)
    • Alokasikan dari salah satu zona normal.
    • Dapat bertukar untuk memberi ruang.
    • Dapat menjatuhkan cache untuk memberi ruang.

Fragmentasi zona adalah lokasi di sini:

[3443189.780792] Node 0 Normal: 3300*4kB (UEM) 8396*8kB (UEM) 4218*16kB (UEM) 76*32kB (UEM) 12*64kB (M) 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 151056kB
[3443189.780801] Node 1 Normal: 26667*4kB (UEM) 6084*8kB (UEM) 2040*16kB (UEM) 96*32kB (UEM) 22*64kB (UEM) 4*128kB (U) 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 192972kB

Dan pemanfaatan memori pada saat itu ada di sini:

[3443189.780759] Node 0 Normal free:149520kB min:40952kB low:51188kB high:61428kB active_anon:9694208kB inactive_anon:1054236kB active_file:7065912kB inactive_file:7172412kB unevictable:0kB isolated(anon):5452kB isolated(file):3616kB present:30408704kB managed:29881160kB mlocked:0kB dirty:0kB writeback:0kB mapped:25440kB shmem:743788kB slab_reclaimable:1362240kB slab_unreclaimable:783096kB kernel_stack:29488kB pagetables:43748kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
[3443189.780766] Node 1 Normal free:191444kB min:45264kB low:56580kB high:67896kB active_anon:11371988kB inactive_anon:1172444kB active_file:8084140kB inactive_file:8556980kB unevictable:0kB isolated(anon):4388kB isolated(file):4676kB present:33554432kB managed:33026648kB mlocked:0kB dirty:0kB writeback:0kB mapped:45400kB shmem:2263296kB slab_reclaimable:1606604kB slab_unreclaimable:438220kB kernel_stack:55936kB pagetables:44944kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no

Fragmentasi setiap zona buruk dalam output kegagalan alokasi halaman. Ada banyak halaman pesanan gratis 0 dengan halaman pesanan jauh lebih sedikit hingga tidak ada yang lebih tinggi. Hasil yang 'baik' akan menjadi halaman gratis berlimpah di sepanjang setiap pesanan, secara bertahap semakin rendah ukurannya semakin tinggi urutan Anda pergi. Memiliki 0 halaman pesanan tinggi 5 dan di atas menunjukkan fragmentasi dan kelaparan untuk alokasi pesanan tinggi.

Saat ini saya tidak melihat bukti yang meyakinkan untuk menunjukkan bahwa fragmentasi selama periode ini ada hubungannya dengan cache slab. Dalam statistik memori yang dihasilkan, kita bisa melihat yang berikut ini

Node 0 = active_anon:9694208kB inactive_anon:1054236kB
Node 1 = active anon:11371988kB inactive_anon:1172444kB

Tidak ada halaman besar yang ditetapkan dari userspace, dan userspace akan selalu mengklaim memori 0 pesanan. Jadi di kedua zona sama sekali ada lebih dari 22GiB memori yang dapat didefragmentasi.

Perilaku yang tidak bisa saya jelaskan

Ketika alokasi pesanan tinggi gagal, saya memahami bahwa pemadatan memori selalu dicoba untuk memungkinkan daerah-daerah dengan alokasi memori tingkat tinggi berlangsung dan berhasil. Mengapa ini tidak terjadi? Jika itu memang terjadi, mengapa tidak dapat menemukan memori untuk defragment ketika ada 22GiB dari itu matang untuk menata ulang?

Perilaku saya pikir saya bisa menjelaskan

Ini perlu penelitian lebih lanjut untuk dipahami dengan benar, tetapi saya percaya kemampuan alokasi untuk secara otomatis menukar / menjatuhkan beberapa pagecache untuk berhasil mungkin tidak berlaku di sini karena masih ada banyak memori bebas yang tersedia, sehingga tidak ada reklamasi terjadi. Hanya tidak cukup dalam pesanan yang lebih tinggi.

Sementara ada banyak memori bebas dan beberapa pesanan 4 permintaan tersisa di setiap zona, masalah "total semua memori bebas untuk setiap pesanan dan dikurangi dari memori bebas nyata" menghasilkan masalah 'memori bebas' di bawah tanda air 'min' yang merupakan apa yang menyebabkan kegagalan alokasi aktual.

Matthew Ife
sumber
Tampaknya aneh bahwa cache SLAB kecil yang relatif (untuk total memori) akan memecah semua memori. Saya akan berharap bahwa dengan semua halaman bebas digusur itu hanya akan mengusir beberapa dan selesai dengan itu. Saya menduga NUMA mungkin ada hubungannya dengan keanehan ini.
pingu
Apakah numadberjalan di sistem ini?
ewwhite
@white numad tidak berjalan, tidak.
pingu
@pingu Jika perilaku ini dapat direproduksi, coba aktifkan numadlayanan dan catat tindakan di /var/log/numad.log. Anda juga mungkin perlu libcgroup diinstal.
ewwhite
@white Oke, saya punya satu berjalan sekarang. Saya tidak yakin apa yang saya harapkan untuk dilakukan atau informasi apa yang mungkin kita dapat darinya. Apa yang kamu harapkan akan terjadi?
pingu