Table des matières

Adapter finement son installation

Ceci s'adresse à ceux qui installent leur FreeBSD à partir des sources et peuvent ainsi donner à Clang/llvm des billes pour compiler au plus près de l'architecture processeur. C'est surtout important lorsque vous utilisez des poudrieres, donc lorsque vous compiler pour une cible différente de l'hôte.

quel processeur ?

Le premier échelon est de regarder ce que donnent les première lignes au boot:

david:~>dmesg | grep 'CPU:' -A 10
CPU: Intel(R) Core(TM) i3-4170 CPU @ 3.70GHz (3700.23-MHz K8-class CPU)
  Origin="GenuineIntel"  Id=0x306c3  Family=0x6  Model=0x3c  Stepping=3
  Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
  Features2=0x7fdafbbf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,SDBG,FMA,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,F16C,RDRAND>
  AMD Features=0x2c100800<SYSCALL,NX,Page1GB,RDTSCP,LM>
  AMD Features2=0x21<LAHF,ABM>
  Structured Extended Features=0x27ab<FSGSBASE,TSCADJ,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,NFPUSG>
  XSAVE Features=0x1<XSAVEOPT>
  VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID
  TSC: P-state invariant, performance statistics
real memory  = 17179869184 (16384 MB)
--
CPU: Intel(R) Core(TM) i3-4170 CPU @ 3.70GHz (3700.00-MHz K8-class CPU)
  Origin="GenuineIntel"  Id=0x306c3  Family=0x6  Model=0x3c  Stepping=3
  Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
  Features2=0x7fdafbbf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,SDBG,FMA,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,F16C,RDRAND>
  AMD Features=0x2c100800<SYSCALL,NX,Page1GB,RDTSCP,LM>
  AMD Features2=0x21<LAHF,ABM>
  Structured Extended Features=0x27ab<FSGSBASE,TSCADJ,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,NFPUSG>
  Structured Extended Features3=0x9c000600<MCUOPT,MD_CLEAR,IBPB,STIBP,L1DFL,SSBD>
  XSAVE Features=0x1<XSAVEOPT>
  VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID
  TSC: P-state invariant, performance statistics

Installez cpuc pour plus de précisions, ou llvm-tblgen.

Ici, c'est un modèle dit haswell d'après la documentation.

Obtenez la topologie de votre système:

sysctl kern.sched.topology_spec
 
kern.sched.topology_spec: <groups>
 <group level="1" cache-level="3">
  <cpu count="12" mask="fff,0,0,0">0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11</cpu>
  <children>
   <group level="2" cache-level="2">
    <cpu count="2" mask="3,0,0,0">0, 1</cpu>
    <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
   </group>
   <group level="2" cache-level="2">
    <cpu count="2" mask="c,0,0,0">2, 3</cpu>
    <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
   </group>
   <group level="2" cache-level="2">
    <cpu count="2" mask="30,0,0,0">4, 5</cpu>
    <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
   </group>
   <group level="2" cache-level="2">
    <cpu count="2" mask="c0,0,0,0">6, 7</cpu>
    <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
   </group>
   <group level="2" cache-level="2">
    <cpu count="2" mask="300,0,0,0">8, 9</cpu>
    <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
   </group>
   <group level="2" cache-level="2">
    <cpu count="2" mask="c00,0,0,0">10, 11</cpu>
    <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
   </group>
  </children>
 </group>
</groups>

Makefile

Consultez /usr/share/mk/bsd.cpu.mk pour déterminer le code de votre architecture processeur et précisez le CPUTYPE dans make.conf de vos poudrières par exemples.

Pensez à conserver la syntaxe ?=, sinon un make buildworld peut échouer.
grep 'CPUTYPE.*==' /usr/share/mk/bsd.cpu.mk | less -X
david:~>grep 'CPUTYPE.*==.*haswell.*' /usr/share/mk/bsd.cpu.mk 
    ${CPUTYPE} == "haswell"
    ${CPUTYPE} == "haswell"

Dans l'exemple précédent, c'est un haswell, ce qui donne les options suivantes:

/usr/share/mk/bsd.cpu.mk
MACHINE_CPU = avx2 avx sse42 sse41 ssse3 sse3

Puisque l'on est sur de l'architecture (MACHINE_CPUARCH) amd64.

Résultat

root@machine:~ # find /usr/local/etc/poudriere.d/*make.conf -exec grep CPUTYPE {} +
/usr/local/etc/poudriere.d/ampache-default-make.conf:CPUTYPE?=haswell
/usr/local/etc/poudriere.d/flarum-default-make.conf:CPUTYPE?=sandybridge
/usr/local/etc/poudriere.d/llanura-default-make.conf:CPUTYPE?=haswell
/usr/local/etc/poudriere.d/machine-default-make.conf:CPUTYPE?=haswell
/usr/local/etc/poudriere.d/owncloud-default-make.conf:CPUTYPE?=haswell
/usr/local/etc/poudriere.d/popeye13-default-make.conf:CPUTYPE?=sandybridge

Machine est donné comme CPU E3-1246, soit un Xeon. Il suffit de consulter la datasheet pour y voir le modèle haswell.

Popeye est donné comme i7-3930K, soit un Intel Core (à ne pas confondre avec core2). Il suffit de consulter la datasheet pour y voir le modèle sandybridge.

Micro-codes

Les architectures de type x86 (Intel ou AMD) sont composés de couches successive dont un micro-code qui émule les fonctions les plus complexes. Ce micro-code est souvent mis à jour dans le cadre de correctifs, notamment lors de la découverte de failles de sécurités.

Installez le port sysutils/cpu-microcode ou sysutils/cpu-microcode-rc pour mettre à jour automatiquement au démarrage ce code, au besoin. Notez qu'il existe des ports séparés selon le constructeur:

Le port -rc ne permet une mise à jour qu'à la fin du processus de démarrage. C'est un service qui se règle dans /etc/rc.conf:

/etc/rc.conf
microcode_update_enable="YES"

Lancez le:

service microcode_update onestart

Le premier port permet aussi une mise à jour dès le début du processus de démarrage et se règle dans le /boot/loader.conf:

/boot/loader.conf
cpu_microcode_load="YES"
cpu_microcode_name="/boot/firmware/intel-ucode.bin"
# cpu_microcode_name="/boot/firmware/amd-ucode.bin"

Lancez une mise jour sans redémarrer:

service microcode_update onestart