Pernyataan SELECT jarak jauh yang lambat karena "waktu pemrosesan klien" yang lama, tetapi cepat secara lokal

12

Ketika terhubung ke server produksi kami (SQL Server 2008, mesin yang sangat kuat), pernyataan SELECT ini membutuhkan waktu 2 detik , meludahkan kembali semua bidang (total data 4 MB).

SELECT TOP (30000) *
FROM person
WITH(NOLOCK);

Dari kotak lain di jaringan yang sama (menghubungkan menggunakan otentikasi SQL atau Windows Authentication), permintaan yang sama membutuhkan waktu 1 menit, 8 detik .

Saya menguji dengan pernyataan yang sangat sederhana ini untuk menggambarkan bahwa itu bukan masalah pengindeksan atau masalah terkait permintaan. (Kami memiliki masalah kinerja dengan semua permintaan saat ini ...)

Baris datang dalam potongan, dan tidak sekaligus. Saya mendapatkan baris pertama saya secara instan, dan kemudian menunggu lebih dari 1 menit untuk kumpulan baris masuk.

Berikut adalah Statistik Klien dari kueri, ketika dijalankan dari kotak jauh:

Query Profile Statistics
  Number of INSERT, DELETE and UPDATE statements 0
  Rows affected by INSERT, DELETE, or UPDATE statements 0
  Number of SELECT statements  2
  Rows returned by SELECT statements 30001
  Number of transactions 0

Network Statistics
  Number of server roundtrips 3
  TDS packets sent from client        3
  TDS packets received from server 1216
  Bytes sent from client         266
  Bytes received from server 4019800

Time Statistics
  Client processing time 72441 ms (72 seconds)
  Total execution time   72441 ms
  Wait time on server replies 0

Kita dapat melihat bahwa "Waktu Pemrosesan Klien" sama dengan total waktu eksekusi.

Adakah yang tahu langkah apa yang bisa saya ambil untuk mendiagnosis mengapa transfer data aktual memakan waktu lama?

Apakah ada parameter konfigurasi SQL yang membatasi atau membatasi kecepatan transfer data antara mesin?

FranticRock
sumber
Omong-omong, kami mencoba menyalin file dengan ukuran yang sama (4 MB) antara server DB dan kotak lain, dan itu membutuhkan waktu satu detik. Jadi sepertinya bukan masalah jaringan.
FranticRock
Apa aplikasi klien? SSMS di workstation pengguna akhir?
Thomas Stringer
Ya Microsoft SQL Server Management Studio 10.50.1600.1. 2008 R2
FranticRock
Masalah ini dimulai sejak kami memindahkan pusat data, dan seluruh mesin diinstal ulang (semuanya termasuk SQL). Kami bersama penyedia hosting yang sangat terhormat.
FranticRock

Jawaban:

5

Masalah Anda pasti terkait jaringan, berdasarkan info Anda. Karena itu, harus berurusan dengan profesional jaringan (saya bukan orangnya).

Hal-hal yang mungkin membantu:

  • Kartu NIC lebih cepat (di SQL server).
  • Menambahkan kartu / subnet NIC yang dialokasikan / spesifik antara server (web-server dan SQL Server).

Apakah server web di sub-net yang sama dengan server SQL?

Apakah ada router / jembatan dll di antara mereka?

Tidak banyak kemungkinan perubahan pada SQL server:

  • Output data sedang dikirim oleh SQL Server dengan MS "TDS protocol".
  • Ukuran standar dari buffer TDS adalah 4 KB. Lihat di MSDB: "Opsi ukuran paket jaringan"
  • Mengompresi data (dengan SQL Server atau aplikasi eksternal) - tergantung pada sifat data.

Anda menggunakan ukuran default: lihat statistik Anda: "Paket TDS diterima dari server 1216" (4MB / 1K = 4KB). Ya, ukuran buffer TDS dapat diubah: lihat di google: "ukuran batch protokol TDS"

Diskusi yang bagus tentang topik: "apakah ukuran paket jaringan sql benar-benar menentukan lalu lintas perjalanan pulang pergi?"

Namun, mengubah ukuran paket TDS akan (pasti) memiliki efek yang tidak dapat diprediksi dan hanya akan digunakan dalam produksi dalam kasus luar biasa.

Mengubah arsitektur atau pengenalan caching data pada mid-tier juga akan membantu.

Alexei
sumber
8

Masalah ini sekarang telah diatasi.

Itu adalah masalah jaringan, dan kotak SQL menggunakan kartu NIC 100 MB / s , bukannya kartu NIC 10 GB / s ...

Perubahan konfigurasi jaringan untuk menggunakan kartu jaringan yang benar telah menyelesaikan masalah. Sekarang kami mendapatkan kinerja yang sama untuk semua permintaan dari kotak SQL Produksi dan dari kotak lain di jaringan.

Terima kasih semuanya atas bantuan Anda.

FranticRock
sumber
Saya memiliki masalah yang sama persis seperti Anda dan saya ingin memeriksa kartu NIC yang digunakan SQL Server saya. Di mana saya bisa melihatnya?
Misha Zaslavsky
3

Pada pembacaan awal sepertinya Anda mengalami beberapa masalah latensi jaringan. Sudahkah Anda melihat beberapa penghitung Network Perfmon? Itu mungkin memberi Anda beberapa indikasi tentang apa yang terjadi dengan jaringan.

Kutipan dari Penghitung Perfmon apa yang harus saya monitor dan apa artinya masing-masing?

IO JARINGAN

Untuk mengukur I / O jaringan, Anda dapat menggunakan penghitung berikut:

Network InterfaceBytes Total / detik

Ambang Batas: Nilai berkelanjutan lebih dari 80 persen dari bandwidth jaringan.

Signifikansi: Penghitung ini menunjukkan tingkat pengiriman dan penerimaan byte pada setiap adapter jaringan. Penghitung ini membantu Anda mengetahui apakah lalu lintas di adaptor jaringan Anda sudah jenuh dan jika Anda perlu menambahkan adaptor jaringan lain. Seberapa cepat Anda dapat mengidentifikasi masalah tergantung pada jenis jaringan yang Anda miliki serta apakah Anda berbagi bandwidth dengan aplikasi lain.

Network InterfaceBytes Diterima / dtk

Penghitung ini menunjukkan tingkat penerimaan byte atas setiap adapter jaringan. Anda dapat menghitung tingkat data yang masuk sebagai bagian dari total bandwidth. Ini akan membantu Anda mengetahui bahwa Anda perlu mengoptimalkan data yang masuk dari klien atau bahwa Anda perlu menambahkan adaptor jaringan lain untuk menangani lalu lintas yang masuk.

Network InterfaceBytes Terkirim / dtk

Penghitung ini menunjukkan tingkat pengiriman byte ke setiap adapter jaringan. Anda dapat menghitung tingkat data yang masuk sebagai bagian dari total bandwidth. Ini akan membantu Anda mengetahui bahwa Anda perlu mengoptimalkan data yang dikirim ke klien atau Anda perlu menambahkan adaptor jaringan lain untuk menangani lalu lintas keluar.

ServerBytes Total / detik

Nilai ini tidak boleh lebih dari 50 persen dari kapasitas jaringan.

Penghitung ini menunjukkan jumlah byte yang dikirim dan diterima melalui jaringan. Nilai yang lebih tinggi menunjukkan bandwidth jaringan sebagai hambatan. Jika jumlah Bytes Total / detik untuk semua server kira-kira sama dengan kecepatan transfer maksimum jaringan Anda, Anda mungkin perlu melakukan segmentasi jaringan.

Prosesor% Waktu Interupsi

Penghitung ini menunjukkan persentase waktu yang dihabiskan prosesor untuk menerima dan memperbaiki perangkat keras. Nilai ini merupakan indikator tidak langsung dari aktivitas perangkat yang menghasilkan interupsi, seperti adapter jaringan.

Antarmuka Jaringan (*) Panjang Antrian Output

Penghitung ini memeriksa untuk melihat berapa banyak utas yang menunggu pada adaptor jaringan. Jika ada banyak utas menunggu pada adaptor jaringan, maka sistem kemungkinan besar menjenuhkan I / O jaringan kemungkinan besar karena latensi jaringan atau bandwidth jaringan.

Output Queue Length adalah panjang antrian paket output (dalam paket). Jika ini lebih lama dari dua, ada penundaan dan hambatan harus ditemukan dan dihilangkan, jika mungkin. Karena permintaan antri oleh Spesifikasi Antarmuka Driver Jaringan (NDIS) dalam implementasi ini, ini akan selalu 0.

jgardner04
sumber
Setelah memantau statistik ini di Perfmon, saya perhatikan beberapa hal. Total byte / detik tidak pernah naik lebih dari 700 ribu pada kartu jaringan apa pun. Bahkan jika saya menjalankan kueri yang meminta megabita data, angka ini tetap sekitar 500K / detik. Bandwidth kami adalah 100 MBPS, dan kami bahkan tidak mendapatkan 1% penggunaannya. Saya berpikir harus ada batas yang dikonfigurasi di suatu tempat yang memaksa ukuran paket, atau membatasi kecepatan transfer. Perangkat keras menyela / detik berada pada 700-2000. Antrian output kosong. Puncak penggunaan kartu jaringan mencapai sekitar 4%.
FranticRock
2
Mungkin ada ketidaksesuaian antara kecepatan kartu jaringan dan port switch. Sudahkah Anda melibatkan tim jaringan Anda untuk melihatnya dari sisi sakelar?
jgardner04
2

Beberapa pertanyaan awal: 1) Server memiliki klien SQL di Prod. mesin server diatur, kan? Jadi, jika Anda membuat permintaan yang sama dari klien yang berada di mesin yang sama, itu akan selesai dalam 2 detik? Apakah Anda mencoba melakukan ini? Apakah ini benar-benar 2 detik? 2) Anda menyebutkan bahwa konfigurasi lingkungan produksi Anda telah diubah (atau server produksi dipindahkan ke jaringan lain / total pembangunan kembali server), kan? Berapa waktu konsumsi permintaan di lingkungan produksi lama?

Dari kotak lain di jaringan yang sama ... kueri yang sama membutuhkan waktu 1 menit, 8 detik. 3) Anda mengatakan bahwa kueri kembali dan dikonsumsi dari klien, terletak pada mesin apa saja di jaringan yang diberikan (kecuali mesin khusus Anda) dalam waktu sekitar 70 detik? Saya mengerti dengan benar? 3.1 Secara kebetulan berapa waktu untuk konsumsi permintaan ini, dapat diterima oleh bisnis? 4) Namun, Anda menetapkan bahwa untuk mesin klien tertentu yang Anda gunakan waktu konsumsi output query adalah: Waktu Eksekusi Klien 15:30: 48 15 menit? (dan kali ini jelas tidak dapat diterima)? Benar? 5) jadi masalahnya terbatas pada mesin klien tunggal? Atau ke mesin klien APAPUN / mid-tier dll (di lingkungan baru)? 6) apa penundaan yang ditunjukkan oleh ping? dari komputer klien ke server? 7) Anda (atau admin jaringan) menjalankan tracert dua arah (dari klien ke server, dari server ke klien)? Berapa banyak hop? Apa waktu gabungannya? 8) Apakah jaringan produksi lama hidup? Bisakah Anda membandingkan menggunakan Ping dan Traceroute - berapa waktu dan lompatan antara klien dan server di sana?

Karena penasaran: ini adalah contoh dari permintaan? atau kata-kata persis dari query? Query benar-benar TIDAK mengandung klausa WHERE? Setuju dengan saya bahwa ini sangat tidak biasa .. Tabel ini memiliki indeks berkerumun atau heap? Tabel berisi berapa banyak baris semuanya? Meja terpecah-pecah? Karena penasaran: sudah mengapa SELECT TOP NNN? Mengapa tidak MENETAPKAN ROWCOUNT NNN - lalu SELECT *? Permintaan ini dikeluarkan berapa kali oleh klien per hari? 1? 100? 1MLN? Data yang mendasarinya statis atau dinamis dan banyak berubah? Berapa (0,01 persen per hari? 1 persen per hari? 10 persen per hari?) Output permintaan diproses secara programatik? (bukan oleh pengguna?) Mengapa tidak di-cache / tidak disimpan di mid-tier? terima kasih, Alexei

Alexei
sumber
Terima kasih banyak untuk informasinya. Tanggapan saya di bawah ini. 1. Benar Alat klien juga diinstal pada prod, dan permintaan yang sama yang saya sebutkan membutuhkan waktu 2 detik untuk mengembalikan semua 30.000 catatan (total berukuran 4 MB). Omong-omong, kueri yang saya gunakan hanyalah sebuah contoh. Ini bukan permintaan bisnis nyata. Itu hanya sarana untuk mendapatkan 4 MB data dari sebuah tabel. Saat ini kami memiliki masalah kinerja saat membaca beberapa megabita data dari tabel mana pun dengan kueri apa pun saat ini.
FranticRock
2. Waktu konsumsi dekat, jika tidak sama dengan permintaan yang sama dijalankan secara lokal dari kotak PROD. (IE 2 detik) 3. Benar 1 menit 8 detik adalah waktu eksekusi. Waktu ini bervariasi di antara berbagai mesin klien. Dari mesin pengembangan kami (terletak jauh lebih jauh dari mesin panggung), saya menjalankan kueri ini 8 kali berturut-turut, dan waktu berkisar antara 11 detik hingga 22 detik. (rata-rata 18 detik)
FranticRock
dari kotak dev tracert kami Prod_IP_Address 1 53 ms 52 ms 53 ms SQL2008 Dari mesin panggung, waktu secara konsisten lebih dari 1 menit. tracert Prod_IP_Address tracert: 1 1 ms <1 ms <1 ms SQL2008 Dari server web produksi: waktu eksekusi adalah 53 detik. tracert: 1 1 ms <1 ms <1 ms SQL2008
FranticRock
4. Kolom atas "Waktu Eksekusi Klien" hanya waktu mesin lokal (IE: 15:30:00) 5. Masalah terjadi pada setiap mesin yang memukul server DB produksi, termasuk pada server web produksi kami. 6. Penundaan ping adalah <1 MS dari kotak stage ke kotak SQL prod. 7. Silakan lihat di atas. 8. Sayangnya jaringan lama tidak ada lagi.
FranticRock
Sangat menarik bahwa meskipun DEV ping 53 MS, hanya butuh 11-22 detik untuk menjalankan kueri. Sementara, tahap ping 1 MS, dibutuhkan lebih dari 1 menit untuk mengembalikan data. Dev juga jauh lebih jauh secara geografis. Dan panggung ada di sana di sebelah kotak prod, namun membutuhkan waktu lebih lama.
FranticRock