PATCH:do not set Win32 server-side socket buffer size on windows 2012

From: chenhj <chjischj(at)163(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Subject: PATCH:do not set Win32 server-side socket buffer size on windows 2012
Date: 2015-04-10 10:46:14
Message-ID: 337161aa.1dfd8.14ca2efec52.Coremail.chjischj@163.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,all

PostgreSQL set Win32 server-side socket buffer size to 32k since 2006, for performance reasons.

While,on the newer version of Windows,such as windows 2012,the default socket buffer size is 64k,
and seem has better performance(high throughput).
So, i propose to apply the attached patch(based on the snapshot of 9.5dev) to set Win32 server-side
socket buffer size to 32k only when the default value is less than 32k.

OSdefault socket buffer size(get from getsockopt(SO_SNDBUF))
Window7: 8k
Windows2003:8k
Windows2008:8k
Windows8: 64k
Windows2012:64k

The following is my performance test for various SO_SNDBUF setting.

Test method:
Use psql to fetch about 100MB data from PostgreSQL(Windows) with various SO_SNDBUF setting.
[chenhj(at)node2 ~]$ time psql -h dbsvr -p 5432 -U postgres -A -t -c "select '1'::char(10000000),generate_series(1,10)">/dev/null

real0m3.295s
user0m0.222s
sys0m0.250s

Environment1(default SO_SNDBUF >32k):
Client: PostgreSQL 9.4.1 at RHEL6(x64)
Server: PostgreSQL 9.4.1 at Windows 2012(x64)
Network:1Gbit LAN

Result(execute time):
default(64K), 1.118s
set SO_SNDBUF to 32K, 3.295s(the current implement)
set SO_SNDBUF to 64K, 2.048s
set SO_SNDBUF to 128K, 1.404s
set SO_SNDBUF to 256K, 1.290s

1)When use Windows as client OS,the result is similar,but there's no "/dev/null" used by my test in windows.
2)I think the reason that the default(64K) is fast than "set SO_SNDBUF to 64K" is
that dynamic send buffering was disabled after set SO_SNDBUF option.
https://msdn.microsoft.com/en-us/library/windows/desktop/bb736549(v=vs.85).aspx
------------------------------------------------------------
Dynamic send buffering for TCP was added on Windows 7 and Windows Server 2008 R2. By default,
dynamic send buffering for TCP is enabled unless an application sets the SO_SNDBUF socket option on the stream socket.
------------------------------------------------------------
Environment2(default SO_SNDBUF <32k):
Client: PostgreSQL 9.4.1 at RHEL6(x64)
Server: PostgreSQL 9.4.1 at Windows 2008 R2(x64)
Network:1Gbit LAN

Result(execute time):
default(8K), 7.370s
set SO_SNDBUF to 32K, 4.159s(the current implement)
set SO_SNDBUF to 64K, 2.875s
set SO_SNDBUF to 128K, 1.593s
set SO_SNDBUF to 256K, 1.324s

Best regards,
Chen Huajun

Attachment Content-Type Size
not_set_sndbuf_for_win2012.patch application/octet-stream 1.7 KB

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Andrew Gierth 2015-04-10 11:01:21 Re: Support UPDATE table SET(*)=...
Previous Message Magnus Hagander 2015-04-10 09:39:57 Re: SSL information view