Apakah pemanfaatan CPU mempengaruhi biaya akses NUMA asing?

21

Skenario

Mari kita asumsikan saya memiliki SQL Server dengan 4 soket dengan masing-masing 1 NUMA node. Setiap soket memiliki 4 inti fisik. Ada total memori 512 GB sehingga setiap NUMA node memiliki 128 GB RAM.

Tabel kunci dimuat ke dalam simpul NUMA pertama.

Pertanyaan

Mari kita asumsikan kita memiliki banyak traffic traffic dari tabel itu. Jika semua inti fisik soket yang memiliki simpul NUMA memiliki utilisasi CPU 100 persen, apakah hal itu memengaruhi biaya akses NUMA non-lokal yang berasal dari soket lain secara negatif? Atau di sisi lain apakah biaya akses NUMA non-lokal terlepas dari seberapa sibuk soket itu?

Saya harap pertanyaan saya masuk akal. Harap beri tahu saya jika tidak, saya akan coba klarifikasi.

Latar Belakang

Kami memiliki masalah basis data di server produksi kami minggu lalu dan beberapa bisnis kami yang diproses tampaknya lebih terpengaruh daripada yang lain. Kami memiliki pertanyaan dengan sedikit pembacaan logis yang membutuhkan waktu lebih dari 1 menit. Kami melihat pemanfaatan CPU secara keseluruhan yang sekitar 60 persen. Kami tidak melihat metrik CPU khusus soket. Metrik I / O rata-rata.

xav
sumber
Jika Anda dapat menghasilkan sesuatu seperti Kin telah disebutkan, itu akan sangat membantu. Selain itu, apa yang telah Anda atur MAXDOP?
user41207

Jawaban:

18

Sebuah pertanyaan yang lumayan :-) Saya akan menguraikan beberapa faktor yang terlibat. Dalam konteks apa pun, faktor-faktor ini dan lainnya dapat bervariasi dan menghasilkan hasil yang menarik.

Maaf saya tidak bisa membuat ini lebih pendek ...

  1. MS CPU terakreditasi vs IO logis
  2. Penyelarasan node memori logis SQL Server dengan node NUMA fisik
  3. Spinlock contention dalam alokasi memori ruang kerja kueri
  4. Penugasan tugas ke penjadwal
  5. Penempatan data yang relevan di buffer pool
  6. Penempatan memori fisik

  1. MS CPU terakreditasi vs IO logis

    Saya menggunakan grafik logis IO (atau dalam istilah perfmon "buffer pool page lookups") terhadap penggunaan CPU sangat sering, untuk mengukur efisiensi cpu dari beban kerja dan mencari kasus rawan spinlock.

    Tetapi SQL Server mengakumulasi waktu CPU dengan banyak aktivitas selain pencarian halaman dan spinlocks:

    • Paket dikompilasi dan disusun ulang.
    • Kode CLR dijalankan.
    • Fungsi dilakukan.

    Banyak kegiatan lain akan mengunyah waktu cpu yang signifikan tanpa tercermin dalam pencarian laman.

    Dalam beban kerja yang saya amati, kepala di antara aktivitas-aktivitas "intensif IO yang tidak logis tetapi melahap CPU" ini adalah aktivitas penyortiran / hashing.

    Itu masuk akal: pertimbangkan contoh dibuat-buat dari dua pertanyaan terhadap hashtable tanpa indeks nonclustered. Dua kueri memiliki resultset yang identik, tetapi salah satu dari resultset benar-benar tidak berurutan dan resultset kedua dipesan oleh lebih dari satu kolom yang dipilih. Kueri kedua diharapkan akan menghabiskan lebih banyak waktu CPU, meskipun akan mereferensikan jumlah halaman yang sama dalam kumpulan buffer.

    Lebih lanjut tentang memori ruang kerja, dan seberapa banyak ruang kerja yang diberikan telah digunakan, dalam posting ini:


  1. Penyelarasan node memori logis SQL Server dengan node NUMA fisik

    SQL Server (sejak menggabungkan strategi yang sadar NUMA) secara default membuat simpul memori SQLOS untuk setiap simpul NUMA di server. Saat alokasi memori bertambah, setiap alokasi dikendalikan oleh salah satu node memori SQLOS.

    Idealnya, node memori SQLOS sepenuhnya selaras dengan node NUMA fisik. Dengan kata lain, setiap simpul memori SQLOS berisi memori dari satu NUMA node, tanpa simpul memori SQLOS lain yang juga mengandung memori dari simpul NUMA yang sama.

    Namun, situasi ideal itu tidak selalu terjadi.

    Posting blog CSS SQL Server Engineers berikut (juga termasuk dalam respon Kin) merinci perilaku yang dapat mengarah pada alokasi memori node lintas-NUMA yang bertahan lama untuk node memori SQLOS. Ketika ini terjadi, dampak kinerja bisa sangat menghancurkan.

    Ada beberapa perbaikan untuk kasus nyeri referensi NUMA lintas-persisten yang menyakitkan. Mungkin yang lain selain keduanya, juga:


  1. Pertikaian spinlock selama alokasi memori ruang kerja

    Di sinilah mulai bersenang-senang. Saya sudah menggambarkan pekerjaan semacam itu dan hash di memori ruang kerja mengkonsumsi CPU tetapi tidak tercermin dalam angka pencarian bpool.

    Pertikaian spinlock adalah lapisan lain untuk kesenangan khusus ini. Ketika memori dicuri dari kumpulan buffer dan dialokasikan untuk digunakan terhadap permintaan memori kueri, akses memori diserialisasi dengan spinlock. Secara default, ini terjadi dengan sumber daya dipartisi di tingkat simpul NUMA. Jadi setiap query pada NUMA node yang sama menggunakan memori ruang kerja berpotensi mengalami pertikaian spinlock ketika mencuri memori terhadap hibah. Sangat penting untuk dicatat: ini bukan risiko pertikaian "satu kali per kueri", karena jika pertengkarannya adalah pada saat hibah yang sebenarnya. Sebaliknya, itu ketika memori dicuri terhadap hibah - jadi permintaan dengan hibah memori yang sangat besar akan memiliki banyak peluang untuk pertikaian spinlock jika menggunakan sebagian besar hibahnya.

    Bendera jejak 8048 melakukan pekerjaan yang baik untuk menghilangkan pertengkaran ini dengan lebih lanjut mempartisi sumber daya di tingkat inti.

    Microsoft mengatakan "pertimbangkan untuk melacak flag 8048 jika 8 atau lebih core per socket". Tapi ... itu tidak benar-benar berapa banyak core per socket (selama ada banyak), tetapi berapa banyak peluang untuk pertikaian dalam pekerjaan yang dilakukan pada satu NUMA node.

    Pada prosesor AMD yang direkatkan (12 core per socket, 2 NUMA node per socket) ada 6 core per node NUMA. Saya melihat sebuah sistem dengan 4 dari CPU tersebut (jadi delapan NUMA node, masing-masing 6 core) yang macet di konvoi spinlock sampai jejak flag 8048 diaktifkan.

    Saya telah melihat pertikaian spinlock ini menurunkan kinerja pada VM sekecil 4 vCPU. Bendera jejak 8048 melakukan apa yang seharusnya ketika diaktifkan pada sistem tersebut.

    Mempertimbangkan bahwa masih ada beberapa CPU yang dioptimalkan frekuensi 4 inti di luar sana, dengan beban kerja yang tepat, mereka akan mendapat manfaat dari jejak flag 8048 juga.

    CMEMTHREAD menunggu menemani jenis pertikaian spinlock yang melacak flag 8048 berkurang. Tapi satu kata peringatan: menunggu CMEMTHREAD adalah gejala yang menguatkan, bukan akar penyebab masalah khusus ini. Saya telah melihat sistem dengan CMEMTHREAD "tunggu mulai" yang tinggi di mana bendera jejak 8048 dan / atau 9024 ditunda dalam penyebaran karena akumulasi waktu tunggu CMEMTHREAD cukup rendah. Dengan spinlocks, akumulasi waktu tunggu biasanya merupakan hal yang salah untuk dilihat. Sebaliknya, Anda ingin melihat waktu CPU yang terbuang - diwakili terutama oleh putaran itu sendiri, kedua oleh menunggu terkait yang mewakili konteks yang berpotensi tidak perlu beralih.


  1. Penugasan tugas ke penjadwal

    Pada sistem NUMA, koneksi didistribusikan ke NUMA node (well - sebenarnya ke grup scheduler SQLOS yang terkait dengannya) round-robin, dengan asumsi tidak ada titik akhir koneksi yang terkait dengan NUMA node tertentu. Jika sesi mengeksekusi kueri paralel, ada preferensi yang kuat untuk menggunakan pekerja dari satu NUMA node. Hmmm ... pertimbangkan server NUMA 4 dengan kueri kompleks yang dipecah menjadi 4 jalur, dan default 0 MAXDOP. Bahkan jika kueri hanya menggunakan utas pekerja MAXDOP, akan ada 4 utas pekerja untuk setiap CPU logis pada NUMA node. Tetapi ada 4 jalur dalam rencana kompleks - sehingga setiap CPU logis pada NUMA node dapat memiliki 16 pekerja di dalamnya - semua untuk satu permintaan!

    Inilah sebabnya mengapa kadang-kadang Anda akan melihat satu NUMA bekerja keras sementara yang lain bermalas-malasan.

    Ada beberapa nuansa tugas penugasan lainnya. Namun hal utama yang perlu diperhatikan adalah bahwa CPU yang sibuk tidak perlu didistribusikan secara merata di seluruh NUMA node. (Juga baik untuk menyadari bahwa menyisipkan halaman bpool (membaca atau halaman pertama menulis) akan masuk ke bpool di node memori SQLOS yang terkait dengan penjadwal pekerja. Dan halaman yang dicuri biasanya akan berasal dari memori SQLOS "lokal" simpul juga.

    Saya mendapati bahwa membawa maxdop dari 0 hingga tidak lebih dari 8 sangat membantu. Bergantung pada profil beban kerja (terutama imo pada jumlah kueri yang berpotensi berjalan lama yang diharapkan bersamaan), bisa sampai ke MAXDOP = 2 dapat dijamin.

    Menyesuaikan ambang biaya untuk paralelisme juga dapat membantu. Sistem yang saya kerjakan cenderung dikonsumsi dengan kueri biaya tinggi dan jarang menemui rencana di bawah 50 atau 100, jadi saya memiliki lebih banyak daya tarik dengan menyesuaikan maxdop (bahkan pada level grup beban kerja) daripada menyesuaikan ambang biaya.


  1. Penempatan data yang relevan di bpool

    Ini adalah kondisi yang saya pikir paling intuitif ketika berhadapan dengan server NUMA. Ini juga, paling khas, tidak terlalu signifikan untuk kinerja beban kerja.

    Apa yang terjadi jika tabel dibaca ke bpool pada NUMA node 3, dan kemudian kueri pada NUMA node 4 memindai tabel yang melakukan semua pencarian bpool di seluruh NUMA node?

    Linchi Shea memiliki pos yang bagus tentang dampak kinerja ini:

    Mengakses memori di seluruh NUMA menimbulkan sedikit latensi memori tambahan. Saya yakin ada beberapa beban kerja yang perlu dihilangkan latensi memori dasar tambahan untuk kinerja optimal - ini bukan masalah pada sistem tempat saya bekerja.

    Tetapi - akses lintas-simpul juga membawa titik transfer lain yang berpotensi jenuh. Jika ada begitu banyak kegiatan sehingga bandwidth memori antara NUMA node jenuh, latensi memori antara node akan meningkat. Pekerjaan yang sama akan membutuhkan siklus CPU tambahan.

    Sekali lagi - saya yakin ada beban kerja sehingga bandwidth memori menjadi pertimbangan penting. Namun, untuk sistem saya, pertimbangan lain yang saya cantumkan lebih penting.


  1. Penempatan memori fisik

    Yang ini jarang tetapi ketika itu penting, itu benar-benar penting. Pada sebagian besar server, pemasangan memori hampir secara alami akan menyeimbangkan seluruh node NUMA. Tetapi dalam beberapa kasus, perhatian khusus diperlukan untuk menyeimbangkan memori melintasi node. Performa di beberapa sistem dapat benar-benar hancur jika memori ditempatkan sedemikian rupa sehingga tidak seimbang. Ini adalah set-it-and-forget-it. Sangat jarang menemukan masalah seperti ini setelah berbulan-bulan layanan produksi sebagai lawan setelah hari yang sangat sibuk pertama :-)


FINISH BESAR!

Orang lain menyatakan bahwa pilihan rencana yang buruk, mungkin karena statistik yang ketinggalan zaman, dapat mengakibatkan gejala yang Anda lihat. Itu tidak terjadi dalam pengalaman saya. Rencana yang buruk dapat dengan mudah membuat kueri memakan waktu lebih lama dari yang diharapkan - tetapi biasanya karena IO yang lebih logis daripada yang diperlukan sedang dilakukan. Atau karena tumpah ke tempdb. Tumpahan masif ke tempdb harus jelas ketika mengamati server - dan bukannya CPU yang tinggi, orang akan mengharapkan waktu tunggu yang terukur untuk disk yang terkait dengan tumpahan.

Alih-alih, jika situasi yang Anda amati terkait NUMA, saya berharap ini merupakan kombinasi dari faktor-faktor yang disebutkan di atas, sebagian besar:

  1. penggunaan memori ruang kerja (yang tidak akan muncul dalam jumlah IO logis)

  2. yang mungkin merupakan cross-NUMA node karena kondisi memori asing yang persisten (jika ini masalahnya, cari perbaikan yang relevan)

  3. dan yang mungkin menimbulkan pertengkaran spinlock dalam simpul NUMA setiap kali alokasi dilakukan terhadap hibah (perbaiki dengan T8048)

  4. dan dapat dilakukan oleh pekerja pada CPU logis yang kelebihan beban oleh pekerja kueri paralel lainnya (sesuaikan maxdop dan / atau ambang biaya paralelisme jika diperlukan)

sql_handle
sumber
7

( harap perbarui pertanyaan Anda dengan coreinfo -voutput (utilitas sistem internal) untuk mendapatkan konteks CPU / soket dan distribusi NUMA yang lebih baik )

Kami melihat pemanfaatan CPU secara keseluruhan yang sekitar 60 persen. Kami tidak melihat metrik CPU khusus soket. Metrik I / O rata-rata.

Menurut saya Anda menggonggong di pohon yang salah. SQL Server NUMAsadar. Ada penalti kinerja yang jauh lebih kecil untuk melakukan akses memori lintas NUMA . Anda juga dapat menggunakan kueri ini untuk melihat berapa banyak NUMAnode yang Anda miliki dan CPU dan core mana yang ditugaskanNUMA :

SELECT parent_node_id, scheduler_id, cpu_id
FROM sys.dm_os_schedulers WITH (NOLOCK) 
WHERE [status] = N'VISIBLE ONLINE';

Atau berapa banyak NUMA:

select COUNT(distinct Parent_node_id)
from sys.dm_os_schedulers
where [STATUS] = 'VISIBLE ONLINE'
    and Parent_node_ID < 64

Kami memiliki pertanyaan dengan sedikit pembacaan logis yang membutuhkan waktu lebih dari 1 menit.

Ini biasanya terjadi ketika Anda memiliki rencana kueri buruk yang dihasilkan karena statistik yang kedaluwarsa. Pastikan Anda memilikinya statistik diperbarui dan indeks Anda didefragmentasi dengan benar .

Juga, Anda perlu mengatur MAXDOP ke nilai yang lebih masuk akal untuk menghindari kelaparan pekerja .

Setel milik Anda cost threshold of parallelism dari default 5 ke nilai awal yang baik seperti 45 dan kemudian monitor nilai itu dan sesuaikan sesuai lingkungan Anda.

Jika Anda menjalankan banyak permintaan adhoc, hidupkan (setel ke 1) optimize for ad hoc workloads untuk mencegah kembung cache rencana.

Gunakan dengan hati-hati: Anda dapat menggunakan T8048 jika Anda menjalankan SQL Server 2008/2008 R2 di Mesin yang Lebih Baru dengan Lebih dari 8 CPU yang Disajikan per NUMA Node dan ada perbaikan terbaru jika Anda berada di SQL server 2012 atau 2014 .

Sangat menyarankan Anda untuk mulai mengumpulkan informasi Tunggu statistik tentang contoh server database Anda.

Lihat: Bagaimana Cara Kerjanya: SQL Server (NUMA Blok Memori Lokal, Asing dan Jauh)

Kin Shah
sumber
1

Murni dari perspektif perangkat keras, pengelolaan memori utama dari arsitektur Nehalem dan seterusnya dikelola oleh pengontrol memori terintegrasi, ini adalah pada bagian "Un-core" dari CPU die yang terpisah dari bagian tempat inti sebenarnya hidup, karena memori secara efektif 'Wired' untuk setiap CPU, akses memori asing AFAIK adalah melalui jalur cepat interkoneksi (lagi dari Nehalem dan seterusnya), oleh karena itu saya akan mengatakan bahwa saturasi inti CPU pada node NUMA lokal seharusnya tidak mempengaruhi akses jarak jauh ke memori tersebut.

Anda mungkin menemukan tautan ini berguna:

http://cs.nyu.edu/~lerner/spring10/projects/NUMA.pdf

Chris

Chris Adkin
sumber