
最初の症状
2016 OCaml 4.03.0 OCaml () : , OCaml OCaml 4.03.0, . , segfault, . , , Intel Skylake (Skylake — Intel. Kaby Lake).
25 OCaml, . Skylake? , Inria, Intel. ? I/O, , , segfault, .
, : ? ? , - GUI, . , , Hyper-Threading. HT Skylake AVX, HT (. ).
. (), CPU /, , OCaml. , , , . . - , , HT . ( , ).
OCaml, C, OCaml, . . OCaml 4.03, , 4.02.3. GCC, Clang. — Linux Windows, MacOS. MacOS Clang Windows- GCC, OCaml 4.03 GCC.
, : , OCaml 4.03 — , — - GCC , C . , GCC . , . .
, . GCC - , - . , , Address Space Layout Randomization (ASLR) — , . OCaml - , -. ASLR, , GDB.
2016 , , — Skylake. OCaml 4.03 ( ) OCaml. , . , GDB ( , ), OCaml, 1000 .
OCaml — , . 30 segfault , OCaml GC, . 50%
mark_slice
OCaml. OCaml : , , Caml, Caml, ( ). 15
mark_slice
4.
, ,
mark_slice
. , . , OCaml !
, , : « !». , , , . OCaml N . OCaml, . , , :
N | |||
---|---|---|---|
1 | 3+epsilon | 0 | 0 |
2 | 4+epsilon | 1 | 3 |
4 | 6+epsilon | 12 | 19 |
8 | 10+epsilon | 17 | 23 |
16 | 18+epsilon | 16 |

1000 . ? ? , Skylake. 4 8 , HT. ( ), . , , — , .
, , . , . 4, HT, . . 8 , . .
, Hyper-Threading, , , OCaml ( ) .
, , . HT . : .
? ! ? . , Intel - , , OCaml c Clang, « !». , , ( Intel -, ), , (, , ).
2016- , , (sky, , Skylake — ) - OCaml 4.03, ( ).
, 6 2017 Ahrefs ( OCaml, Caml ) OCaml 4.03.0: PR#7452 - Caml.
ocamlopt.opt , . , ocamlopt.opt OCaml, ocamlopt.byte, .
PR#7452 , , Ahrefs . .
- 12 , 19 , , « , , Intel Skylake».
- (Hyper-Threading).
- , Hyper-Threading.
- , OCaml
gcc -O2
,gcc -O1
. , OCaml OCaml 4.02,gcc -O1
. - :
,
gcc -O2
OCaml 4.03 , (- ) Skylake Hyper-Threading? , . , Hyper-Threading Skylake () - Intel .
5 , …
26 2017 "ygrek" «» Debian:
* New upstream microcode datafile 20170511 [...]
* Likely fix nightmare-level Skylake erratum SKL150. Fortunately,
either this erratum is very-low-hitting, or gcc/clang/icc/msvc
won't usually issue the affected opcode pattern and it ends up
being rare.
SKL150 - Short loops using both the AH/BH/CH/DH registers and
the corresponding wide register *may* result in unpredictable
system behavior. Requires both logical processors of the same
core (i.e. sibling hyperthreads) to be active to trigger, as
well as a "complex set of micro-architectural conditions"
SKL150 Intel 2017 65 Intel 6- . SKW144, SKX150, SKZ7 Skylake KBL095, KBW095 Kaby Lake. « » Intel, .
(« », !) : Hyper-Threading? ! ? ! , ? ! , , , Debian . , . Skylake ( Inria) , , 10 , 2,5 .
, SKL150 — . , , , GCC OCaml. ,
byterun/major_gc.c
sweep_slice
C:
hd = Hd_hp (hp);
/*...*/
Hd_hp (hp) = Whitehd_hd (hd);
:
hd = *hp;
/*...*/
*hp = hd & ~0x300;
Clang , :
movq (%rbx), %rax
[...]
andq $-769, %rax # imm = 0xFFFFFFFFFFFFFCFF
movq %rax, (%rbx)
GCC 8-
%ah
8 15
%rax
, :
movq (%rdi), %rax
[...]
andb $252, %ah
movq %rax, (%rdi)
. GCC , : 8-
$252
, 32-, 64 ,
$-769
4 . , GCC
%rax
,
%ah
, , , , SKL150.
, , - . !
Intel Skylake Kaby Lake, . Debian , .
, OCaml . , Lwt, Coq Coccinelle.
, , Ars Technica, HotHardware, Tom's Hardware Hacker's News [ GeekTimes — . .].