Kinerja berjalan lambat terjadi ketika Anda menyalin data ke TCP server dengan menggunakan program Windows soket API

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 823764 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

Gejala

Ketika Anda menjalankan program yang menggunakan soket Windows API, Anda mungkin mengalami kinerja lambat ketika Anda menyalin data ke TCP server.

Jika Anda membuat jejak jaringan dengan jaringan aplikasi sniffer seperti Monitor jaringan Microsoft, TCP server mengirimkan TCP ACK segmen terakhir TCP segmen dalam sungai data TCP di tertunda pengakuan timer (juga dikenal sebagai timer ACK tertunda). secara asali, untuk sistem operasi Windows, nilai untuk timer ini adalah 200 milidetik (ms). alur data khas untuk mengirimkan 64 kilobyte (KB) data terlihat mirip dengan urutan menurun berikut:
Client->Server 1460 bytes
Client->Server 1460 bytes
Server->Client ACK
Client->Server 1460 bytes
Client->Server 1460 bytes
Server->Client ACK
....
Client->Server 1460 bytes
Client->Server 1460 bytes
Server->Client ACK-PUSH
Client->Server 1296 bytes
-> delayed ACK 200 ms


Penyebab

Masalah ini terjadi karena perilaku arsitektur Windows soket API dan Afd.sys. Masalah ini terjadi jika semua kondisi berikut ini benar:
  • Program Windows soket menggunakan soket non-blocking.
  • Satu Kirim panggilan atau WSASend panggilan mengisi seluruh mendasari soket kirim buffer.

    Sebagai contoh, program menggunakan soket Windows setsockopt fungsi untuk mengubah default soket mengirimkan buffer ke 32 KB selama soket inisialisasi rutin:
    setsockopt( sock, SOL_SOCKET, 32768, (char *) &val, sizeof( int ) );
    Kemudian, ketika program mengirimkan data, itu masalah Kirim panggilan atau WSASend panggilan dan mengirim 64 KB data selama masing-masing mengirimkan:
    send(socket, pWrBuffer, 65536, 0);
    Dalam skenario ini, setiap kali isu-isu program Kirim panggilan dari 64 KB data, hasil program SOCKET_ERROR kode galat jika buffer 32-KB soket mendasari benar-benar diisi. Setelah itu panggilan WSAGetLastError fungsi, program menerima WSAEWOULDBLOCK kode galat. Kebanyakan program menggunakan soket Windows Pilih fungsi untuk memeriksa status soket. Dalam skenario ini, Pilih fungsi tidak melaporkan soket sebagai ditulisi sampai klien menerima segmen TCP ACK yang luar biasa. secara asali di lingkungan Windows, ini dapat berlangsung selama 200 ms karena algoritma tertunda pengakuan.
  • Remote TCP server mengakui semua segmen TCP sebelum klien mengirimkan segmen TCP terakhir dengan mendorong bit set.

Teknik pemecahan masalah

Untuk mengatasi masalah ini, gunakan salah satu metode berikut.

Metode 1: Menggunakan soket memblokir

Masalah ini hanya terjadi dengan soket non-blocking. Bila Anda menggunakan soket memblokir, masalah ini terjadi karena Afd.sys menangani buffer soket berbeda. Untuk informasi lebih lanjut mengenai pemblokiran dan non-blocking socket pemrograman, lihat dokumentasi Microsoft Platform SDK.

Metode 2: Membuat soket kirim Buffer ukuran lebih besar dari ukuran Buffer kirim Program

Untuk memodifikasi soket kirim buffer, gunakan fungsi getsockopt Windows soket untuk menentukan soket kirim buffer ukuran saat ini (SO_SNDBUF), dan kemudian menggunakan setsockopt fungsi untuk mengatur soket kirim ukuran buffer. Setelah selesai, nilai SO_SNDBUF harus setidaknya 1 byte lebih besar dari ukuran buffer kirim program.

Mengubah panggilan mengirim atau panggilan WSASend untuk menentukan buffer ukuran setidaknya 1 byte lebih kecil daripada nilai SO_SNDBUF. Dalam contoh sebelumnya di bagian "Penyebab" dari artikel ini, Anda bisa mengubah panggilan setsockopt untuk nilai berikut,
setsockopt( sock, SOL_SOCKET, 65537, (char *) &val, sizeof( int ) );
atau Anda bisa memodifikasi mengirim panggilan ke nilai berikut:
send(socket, pWrBuffer, 32767, 0);
Anda juga bisa menggunakan kombinasi nilai-nilai ini.

Metode 3: Mengubah pengaturan TCP/IP di TCP Server

Penting Bagian ini, metode, atau tugas yang memuat langkah-langkah yang memberitahu Anda bagaimana untuk mengubah registri. Namun, masalah serius mungkin muncul saat Anda salah memodifikasi registri. Oleh karena itu, pastikan Anda mengikuti langkah-langkah ini dengan hati-hati. Untuk perlindungan tambahan, buat cadangan registri sebelum Anda memodifikasinya. Kemudian, Anda dapat memulihkan registri jika terjadi masalah. Untuk informasi lebih lanjut tentang cara membuat cadangan dan memulihkan registri, klik nomor artikel berikut ini untuk melihat artikel di dalam Pangkalan Pengetahuan Microsoft:
322756 Cara membuat cadangan dan memulihkan registri pada Windows


Mengubah pengaturan TCP/IP di server TCP segera mengakui masuk TCP segmen. Solusi ini bekerja lebih baik dalam lingkungan yang memiliki basis klien besar instalasi yang dan di mana Anda tidak dapat mengubah perilaku program. Untuk skenario mana TCP remote server berjalan pada server berbasis Windows, Anda harus memodifikasi registri server jauh. Untuk sistem operasi lain, lihat dokumentasi sistem operasi untuk informasi tentang cara mengubah timer tertunda pengakuan.

Pada server yang menjalankan Windows 2000, ikuti langkah berikut:
  1. Mulai Peninjau suntingan registri (Regedit.exe).
  2. Temukan dan kemudian klik subkunci registri berikut:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<Interface GUID>
  3. Pada Mengedit Menu, klik Nilai tambah, dan kemudian membuat nilai registri berikut:

    Nama nilai: TcpDelAckTicks
    tipe data: REG_DWORD
    Data nilai: 0
  4. Tutup penyunting registri.
  5. Me-restart Windows untuk perubahan ini diterapkan.
Pada server yang menjalankan Windows XP atau Windows Server 2003, ikuti langkah berikut:
  1. Mulai Editor registri.
  2. Temukan dan kemudian klik subkunci registri berikut:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<Interface GUID>
  3. Pada Mengedit Menu, titik untuk Baru, lalu klik Nilai DWORD.
  4. Nama nilai baru TcpAckFrequency, dan menetapkan nilai 1.
  5. Tutup penyunting registri.
  6. Me-restart Windows untuk perubahan ini diterapkan.

Metode 4: Mengubah perilaku penyangga di Afd.sys untuk non-blocking soket

Penting Bagian ini, metode, atau tugas yang memuat langkah-langkah yang memberitahu Anda bagaimana untuk mengubah registri. Namun, masalah serius mungkin muncul saat Anda salah memodifikasi registri. Oleh karena itu, pastikan Anda mengikuti langkah-langkah ini dengan hati-hati. Untuk perlindungan tambahan, buat cadangan registri sebelum Anda memodifikasinya. Kemudian, Anda dapat memulihkan registri jika terjadi masalah. Untuk informasi lebih lanjut tentang cara membuat cadangan dan memulihkan registri, klik nomor artikel berikut ini untuk melihat artikel di dalam Pangkalan Pengetahuan Microsoft:
322756 Cara membuat cadangan dan memulihkan registri pada Windows


Catatan Ini bukti kunci registri ini hanya tersedia untuk Windows Server 2003 dengan Service Pack 1 dan Service Pack berikutnya.
  1. Klik Mulai, jenis regedit.exe, lalu klik Oke.
  2. Temukan dan kemudian klik subkunci registri berikut:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters
  3. Pada Mengedit Menu, titik untuk Baru, lalu klik Nilai DWORD.
  4. Nama nilai baru NonBlockingSendSpecialBuffering, dan menetapkan nilai 1.
  5. keluar dari Registry Editor.
  6. Me-restart Windows untuk perubahan ini diterapkan.

Status

Microsoft telah mengkonfirmasi bahwa ini merupakan masalah di dalam produk Microsoft sebagaimana didaftar di dalam bagian "Applies to".

Referensi

328890 Entri registri baru untuk mengendalikan perilaku TCP pengakuan (ACK) pada Windows XP dan Windows Server 2003

Properti

ID Artikel: 823764 - Kajian Terakhir: 05 Maret 2013 - Revisi: 3.0
Berlaku bagi:
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003, Web Edition
  • Microsoft Windows XP Home Edition
  • Microsoft Windows XP Professional
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows 2000 Server
  • Windows Server 2008 Datacenter without Hyper-V
  • Windows Server 2008 Enterprise without Hyper-V
  • Windows Server 2008 for Itanium-Based Systems
  • Windows Server 2008 Standard without Hyper-V
  • Windows Server 2008 Datacenter
  • Windows Server 2008 Enterprise
  • Windows Server 2008 Standard
  • Windows Web Server 2008
  • Windows Server 2008 R2 Standard
  • Windows Server 2008 R2 Enterprise
  • Windows Server 2008 R2 Datacenter
  • Windows Server 2012 Datacenter
  • Windows Server 2012 Standard
  • Windows 8 Enterprise
  • Windows 8 Pro
  • Windows 7 Professional
  • Windows 7 Enterprise
  • Windows 7 Home Basic
  • Windows 7 Home Premium
Kata kunci: 
kbprb kbmt KB823764 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini: 823764

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com