ID Artikel: 823764 - Kajian Terakhir: 07 Oktober 2011 - Revisi: 2.0

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

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

GEJALA

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

Jika Anda membuat jejak jaringan dengan sniffer jaringan seperti Microsoft Monitor Jaringan, TCP server mengirimkan TCP ACK segmen terakhir segmen TCP dalam aliran data TCP dalam pengakuan tertunda timer (juga dikenal sebagai tertunda ACK timer). Secara default, untuk sistem operasi Windows, nilai untuk timer ini adalah 200 milidetik (ms). Aliran data khas untuk mengirimkan 64 kilobyte (KB) data terlihat mirip dengan urutan 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 non-blocking soket.
  • Satu Kirim panggilan atau WSASend panggilan mengisi seluruh mendasari soket Kirim buffer.

    Misalnya, program menggunakan soket Windows setsockopt fungsi untuk mengubah default soket mengirim penyangga untuk 32 KB selama soket inisialisasi rutin:
    setsockopt( sock, SOL_SOCKET, 32768, (char *) &val, sizeof( int ) );
    Kemudian, ketika program mengirim data, itu masalah Kirim panggilan atau WSASend panggilan dan mengirim 64 KB data selama masing-masing mengirim:
    send(socket, pWrBuffer, 65536, 0);
    Dalam skenario ini, setiap kali isu-isu program Kirim panggilan dari 64 KB data, program kembali SOCKET_ERROR kode kesalahan jika buffer 32 KB soket mendasari benar-benar penuh. Setelah itu panggilan WSAGetLastError fungsi, program menerima WSAEWOULDBLOCK kode kesalahan. Sebagian besar program menggunakan soket Windows Pilih fungsi untuk memeriksa status soket. Dalam skenario ini, Pilih fungsi tidak melaporkan soket sebagai dapat ditulis sampai klien menerima segmen TCP ACK luar biasa. Secara default pada lingkungan Windows, ini mungkin mengambil selama 200 ms karena algoritma pengakuan tertunda.
  • Server TCP jauh 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 menghalangi

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

Metode 2: Membuat soket Kirim Buffer ukuran lebih besar daripada ukuran Buffer Program Kirim

Untuk mengubah soket Kirim buffer, menggunakan soket Windows getsockopt fungsi untuk menentukan saat ini soket Kirim ukuran buffer (SO_SNDBUF), dan kemudian gunakan setsockopt fungsi untuk menetapkan soket mengirim ukuran buffer. Ketika Anda selesai, nilai SO_SNDBUF harus setidaknya 1 byte yang lebih besar daripada ukuran buffer Kirim program.

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

Metode 3: Mengubah pengaturan TCP/IP pada TCP Server

Penting Bagian ini, metode, atau tugas yang memuat langkah-langkah yang memberitahu Anda bagaimana memodifikasi registri. Namun, masalah yang serius dapat terjadi apabila Anda salah memodifikasi registri. Oleh karena itu, pastikan Anda mengikuti langkah-langkah tersebut dengan seksama. Untuk perlindungan tambahan, buat cadangan registri sebelum Anda memodifikasi. Kemudian, Anda dapat memulihkan registri apabila terjadi masalah. Untuk informasi selengkapnya tentang cara membuat cadangan dan memulihkan registri, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
322756  (http://support.microsoft.com/kb/322756/ ) Cara membuat cadangan dan memulihkan registri di Windows


Mengubah pengaturan TCP/IP pada TCP server untuk segera mengakui masuk segmen TCP. Solusi ini bekerja lebih baik di lingkungan yang memiliki besar klien instalasi dasar dan di mana Anda tidak dapat mengubah perilaku program. Untuk skenario di mana server TCP jauh 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 pengakuan tertunda.

Pada server yang menjalankan Windows 2000, ikuti langkah berikut:
  1. Jalankan Peninjau Suntingan Registri (Regedit.exe).
  2. Cari kemudian klik subkunci registri berikut ini:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<interface guid=""></interface>
  3. Pada Mengedit menu, klik Tambahkan nilai, 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 berlaku.
Pada server yang menjalankan Windows XP atau Windows Server 2003, ikuti langkah berikut:
  1. Mulai Penyunting Registri.
  2. Cari kemudian klik subkunci registri berikut ini:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<interface guid=""></interface>
  3. Pada Mengedit menu, titik 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 berlaku.

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 memodifikasi registri. Namun, masalah yang serius dapat terjadi apabila Anda salah memodifikasi registri. Oleh karena itu, pastikan Anda mengikuti langkah-langkah tersebut dengan seksama. Untuk perlindungan tambahan, buat cadangan registri sebelum Anda memodifikasi. Kemudian, Anda dapat memulihkan registri apabila terjadi masalah. Untuk informasi selengkapnya tentang cara membuat cadangan dan memulihkan registri, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
322756  (http://support.microsoft.com/kb/322756/ ) Cara membuat cadangan dan memulihkan registri di Windows


Catatan Ini kunci registri ini hanya tersedia untuk Windows Server 2003 dengan Paket Layanan 1 dan paket layanan berikutnya.
  1. Klik Mulai, jenis Regedit.exe, lalu klik Oke.
  2. Cari kemudian klik subkunci registri berikut ini:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters
  3. Pada Mengedit menu, titik Baru, lalu klik Nilai DWORD.
  4. Nama nilai baru NonBlockingSendSpecialBuffering, dan menetapkan nilai 1.
  5. Keluar dari Penyunting Registri.
  6. Me-restart Windows untuk perubahan ini berlaku.

STATUS

Microsoft telah mengkonfirmasi bahwa ini adalah masalah di dalam produk Microsoft sebagaimana tercantum di bagian "Berlaku untuk".

REFERENSI

328890  (http://support.microsoft.com/kb/328890/ ) Entri registri baru untuk mengendalikan perilaku TCP pengakuan (ACK) pada Windows XP dan Windows Server 2003

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
Kata kunci: 
kbprb kbmt KB823764 KbMtid
Penerjemahan MesinPenerjemahan 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  (http://support.microsoft.com/kb/823764/en-us/ )