Re: PATCH:do not set Win32 server-side socket buffer size on windows 2012 - Mailing list pgsql-hackers

From Heikki Linnakangas
Subject Re: PATCH:do not set Win32 server-side socket buffer size on windows 2012
Date
Msg-id 5595A570.7030409@iki.fi
Whole thread Raw
In response to PATCH:do not set Win32 server-side socket buffer size on windows 2012  (chenhj <chjischj@163.com>)
Responses Re: PATCH:do not set Win32 server-side socket buffer size on windows 2012
Re: PATCH:do not set Win32 server-side socket buffer size on windows 2012
List pgsql-hackers
On 04/10/2015 01:46 PM, chenhj wrote:
> 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.

Seems reasonable. I edited the comment somewhat, and added #ifdefs on
the new variables to avoid compiler warnings on other platforms.

> 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@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

I was about to commit the attached, but when I tested this between my
Windows 8.1 virtual machine and Linux host, I was not able to see any
performance difference. It may be because the case is hobbled by other
inefficiencies, in the virtualization or somewhere else, but I wonder if
others can reproduce the speedup?

- Heikki

Attachment

pgsql-hackers by date:

Previous
From: Andres Freund
Date:
Subject: Re: Add checksums without --initdb
Next
From: Magnus Hagander
Date:
Subject: Re: Information of pg_stat_ssl visible to all users