I just found a compatibility issue when I was migrating an elderly VM to a new host. The VM is running Windows Server 2008 SP2, and it has the EDB build of PostgreSQL 9.4.5 on it. (9.4.6 behaves the same.) It is also not dependent on running in a VM; it would fail on the hardware as well.

Backends (and possibly other processes) crash at the slightest provocation, such as "SELECT * FROM pg_stat_activity;" or VACUUM. The log says either "exception 0xC0000005" (segfault) or "exception 0xC000001D" (illegal instruction).

The interesting reason: The old host had a Core-generation CPU, which does not support the AVX2 instruction set. The new one has a Haswell-generation one, and this one does. The EDB distribution of 9.4 was built with the Visual Studio 2013 compiler, whose CRT (aka libc) has a bug where it uses AVX2 instructions if the *CPU* supports them, but does not care whether the *OS* does, and 2008 doesn't. That support was added in SP1 for 7/2008R2.

There is a workaround, see <https://connect.microsoft.com/VisualStudio/feedback/details/811093/visual-studio-2013-rtm-c-x64-code-generation-bug-for-avx2-instructions>. It consists of a single function call, required only if the OS does not support AVX2.

I just tried it, and it appears to work. If there is any interest in fixing this, I'll be happy to prepare a patch. (Where would be the best place to put a function call from <math.h> that has to be done during startup of each server process, on Windows only?)

Otherwise, it may be time to update the manual (15.6 Supported Platforms) where it says PostgreSQL "can be expected to work on these operating systems: [...] Windows (Win2000 SP4 and later), [...]". Perhaps we could add "except Windows before 7 SP1/2008R2 SP1 when running in x64 mode on Intel CPUs introduced after May 2013 (Haswell and later)"?


Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:

Reply via email to