15 votes

Mac OS X ne crée pas de fichier d'échange (swap)

J'ai récemment commencé à rencontrer de nombreux problèmes de mémoire sur mon mac fonctionnant sous High Sierra. Plutôt que de faire apparaître la fenêtre de sortie forcée, mon système se figeait complètement et la seule façon de le récupérer était de forcer un redémarrage.

Après quelques recherches, j'ai découvert que mon système ne crée pas de fichiers d'échange même lorsque la pression mémoire est critique. Il n'y a rien dans le /private/var/vm/ répertoire.

J'ai déjà essayé sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist .

Existe-t-il un autre moyen d'activer le swapping ? Ou d'effectuer des diagnostics ?

Détails supplémentaires :

Je démarre depuis un SSD Thunderbolt externe (je ne sais pas si c'est la cause).

Voici le résultat de vm_stat . Si je fais quelque chose d'intensif en mémoire à ce stade, mon système se fige.

Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free:                                4116.
Pages active:                            854231.
Pages inactive:                          825841.
Pages speculative:                        27754.
Pages throttled:                              0.
Pages wired down:                        606483.
Pages purgeable:                          22070.
“Translation faults”:                  75731290.
Pages copy-on-write:                     401121.
Pages zero filled:                     49766457.
Pages reactivated:                     17690835.
Pages purged:                           1577284.
File-backed pages:                       503400.
Anonymous pages:                        1204426.
Pages stored in compressor:             6563399.
Pages occupied by compressor:           1875311.
Decompressions:                        21012443.
Compressions:                          32102441.
Pageins:                                2172708.
Pageouts:                                 35123.
Swapins:                                      0.
Swapouts:                                     0.

Editar:

Quelques détails supplémentaires :

C'est la sortie de diskutil ap list

APFS Container (1 found)
|
+-- Container disk4 6BE5FDB5-A68F-4CBF-A404-68AE73E61C10
    ====================================================
    APFS Container Reference:     disk4
    Capacity Ceiling (Size):      499898105856 B (499.9 GB)
    Capacity In Use By Volumes:   452259872768 B (452.3 GB) (90.5% used)
    Capacity Available:           47638233088 B (47.6 GB) (9.5% free)
    |
    +-< Physical Store disk3s2 39853349-6B62-4961-99DE-811BA56465EC
    |   -----------------------------------------------------------
    |   APFS Physical Store Disk:   disk3s2
    |   Size:                       499898105856 B (499.9 GB)
    |
    +-> Volume disk4s1 99688E85-E9EF-3688-A324-913D00FF6A0E
    |   ---------------------------------------------------
    |   APFS Volume Disk (Role):   disk4s1 (No specific role)
    |   Name:                      System (Case-insensitive)
    |   Mount Point:               /
    |   Capacity Consumed:         449420767232 B (449.4 GB)
    |   FileVault:                 No
    |
    +-> Volume disk4s2 729366E4-48AA-45A3-95DA-8871B8A29778
    |   ---------------------------------------------------
    |   APFS Volume Disk (Role):   disk4s2 (Preboot)
    |   Name:                      Preboot (Case-insensitive)
    |   Mount Point:               Not Mounted
    |   Capacity Consumed:         20357120 B (20.4 MB)
    |   FileVault:                 No
    |
    +-> Volume disk4s3 431C0191-2B1F-480C-94D0-AF4748E6D213
    |   ---------------------------------------------------
    |   APFS Volume Disk (Role):   disk4s3 (Recovery)
    |   Name:                      Recovery (Case-insensitive)
    |   Mount Point:               Not Mounted
    |   Capacity Consumed:         509820928 B (509.8 MB)
    |   FileVault:                 No
    |
    +-> Volume disk4s4 5DE0EA6B-CA57-4226-B038-2E256FCC5B98
        ---------------------------------------------------
        APFS Volume Disk (Role):   disk4s4 (VM)
        Name:                      VM (Case-insensitive)
        Mount Point:               Not Mounted
        Capacity Consumed:         2147504128 B (2.1 GB)
        FileVault:                 No

Et la sortie de mount :

/dev/disk4s1 on / (apfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
/dev/disk2 on /Volumes/Storage (hfs, local, journaled)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)

Solution (mise à jour) : Un certain nombre de bonnes solutions ont été suggérées. Après avoir réexaminé la question, je recommande la solution de lint ci-dessous. C'est la solution la plus générale qui tient compte des changements de noms de volumes.

1voto

chrisgooley Points 111

J'ai rencontré ce problème lors de la mise à jour vers Mojave. Mon système d'exploitation est installé sur un SSD externe. Ma solution a été similaire à celle de Michael Golban, mais j'avais besoin d'une commande supplémentaire.

J'ai fini par écrire un petit bash script et le charger avec un LaunchDaemon.

/usr/local/sbin/mount_swap.sh

#!/bin/bash
/sbin/mount_apfs disk3s4 /private/var/vm
diskutil mount -mountPoint /private/var/vm disk3s4

com.local.mountswap.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
     <key>Label</key>
     <string>com.local.mountswap</string>
     <key>ProgramArguments</key>
     <array>
          <string>/usr/local/sbin/mount_swap.sh</string>
     </array>
     <key>KeepAlive</key>
     <dict>
    <key>SuccessfulExit</key>
    <false/>
     </dict>
</dict>
</plist>

Dès que ces commandes étaient exécutées pendant les tests, la ligne "Swap Used" du moniteur d'activité commençait à afficher des valeurs positives.

1voto

José Points 11

J'ai rencontré ce même problème à une occasion et je l'ai résolu avec la méthode de Michael Golban. la solution la plus simple ci-dessus c'est-à-dire l'ajout d'un plist pour monter directement le volume APFS VM.

Malheureusement, cette solution n'a pas fonctionné avec d'autres Macs, car la numérotation des volumes de disque a changé de façon aléatoire pour une raison non identifiée. C'est alors que j'ai commencé à essayer les différents scripts ci-dessus, mais je n'ai pas pu en trouver un 100% fiable. Proposition de Lint ne fonctionne pas si /private/var/vm/sleepimage existe avant de monter le volume APFS VM sur /private/var/vm/, ce qui était mon cas. J'ai donc commencé à écrire mon propre script et j'ai remarqué que le volume VM n'était toujours pas monté après le démarrage, et j'ai réalisé que le volume pouvait être démonté pendant le processus de démarrage. Après de nombreuses réécritures et tests, je suis maintenant heureux de partager une solution fonctionnelle.

/Bibliothèque/LaunchDaemons/local.mountvm.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
        <string>local.mountvm</string>
  <key>Program</key>
        <string>/usr/local/bin/mountvm.sh</string>
        <key>KeepAlive</key>
        <dict>
                <key>Crashed</key>
                <true/>
                <key>SuccessfulExit</key>
                <false/>
        </dict>
</dict>
</plist>

/usr/local/bin/mountvm.sh

#!/bin/bash
# set -x

# This script is intended to fix a problem where macOS (above 10.13) won't mount its dedicated virtual memory APFS volume 
# when run from an external SSD drive. Should work using macOS 10.13 and above (10.14.6 successfully tested). It logs its activity in /Library/Logs/mountvm.log.

# Just to make the rest more readable, -n is used to trigger echo -n and -c is used to clear the logfile
Log_input () {
    case $1 in
    "-c")
        echo "$(date) : $2" > /Library/Logs/mountvm.log 
        ;;
    "-n")
        echo -n "$(date) : " >> /Library/Logs/mountvm.log
        ;;
    *)
        echo "$(date) : $1" >> /Library/Logs/mountvm.log 
        ;;
    esac
}

# Makes sure we have an APFS Volume onboard, otherwise exits
if [ "$(/usr/sbin/diskutil ap list)" == "No APFS Containers found" ]; then
    Log_input "-c" "No APFS Volume found, exiting."
    exit 255
fi

# Grabs VM volume string from system disk (should work even with several OS disks connected)
ROOT_DISK=$(/usr/sbin/diskutil ap list | grep -B 2 -E '/$' | grep disk | awk '{ print $6 }' | cut -c 1-5)
VM_VOLUME=$(/usr/sbin/diskutil ap list | grep -A5 $ROOT_DISK | grep "(VM)" | awk '{ print $5 }')

# Makes sure we have a VM Volume to mount (if anyone can help with a regex matching disk0s1, disk1s4 etc. please reach out)
if [ "$(echo $VM_VOLUME | cut -c 1-4)" != "disk" ]; then
    Log_input "-c" "Unable to find a VM Volume to mount, exiting."
    exit 255
fi

# From here we should be safe to proceed

# Mount attemps counter
MOUNT_ATTEMPTS=0

# Clears log previous entries
Log_input "-c" "Starting mount_vm.sh, VM Volume is $VM_VOLUME"

# Mounts the VM volume, then keeps checking it remains so every ten seconds during 5 minutes 
while [ $SECONDS -lt 300 ]
do 
    /usr/sbin/diskutil ap list | grep -A5 $VM_VOLUME | grep "Not Mounted" >> /dev/null
    VM_status=$?
    case $VM_status in
    "0")
        ((MOUNT_ATTEMPTS++))
        Log_input "Attempt to mount $VM_VOLUME #$MOUNT_ATTEMPTS"
        Log_input "-n"
        /usr/sbin/diskutil mount -mountPoint /private/var/vm/ $VM_VOLUME >> /Library/Logs/mountvm.log
        ;;
    "1")
        Log_input "$VM_VOLUME is already mounted, waiting..."
        ;;
    *)
        Log_input "grep command error, exiting."
        exit 255
        ;;
    esac
    sleep 10
done

# Wait another 10 seconds...
sleep 10

# before writing final log input
case $VM_status in
"1")
    if [ $MOUNT_ATTEMPTS -eq 0 ]; then
        Log_input "$VM_VOLUME was alreaddy mounted at script startup and remained so until script exited after $SECONDS seconds elapsed." 
    else
        Log_input "$VM_VOLUME remained mounted after $MOUNT_ATTEMPTS attempt(s), exiting after $SECONDS seconds elapsed." 
    fi
    ;;
"0")
    if [ $MOUNT_ATTEMPTS -gt 0 ]; then
        Log_input "$VM_VOLUME kept getting unmounted after $MOUNT_ATTEMPTS attempts, exiting after $SECONDS seconds elapsed." 
    fi
    ;;
esac

exit 0

Notes :

  • sur certains Macs, j'ai remarqué que mountvm.log peut se terminer sans ses dernières entrées, ce qui signifie que le script a été tué. Il semble que les conditions KeepAlive définies dans local.mountvm.plist ne soient pas suffisantes pour relancer le script, ce qui peut conduire à une situation de mémoire virtuelle non fonctionnelle.

  • J'ai également remarqué que le dossier /private/var/vm et son contenu peuvent appartenir au compte administrateur local au lieu de Root, ce que je n'ai pas pu corriger même en désactivant SIP.

1voto

Kwadz Points 291

La commande suivante a réglé le problème sur mon MacOS Mojave (10.14.6). J'utilise également un disque dur externe amorçable .

sudo defaults write /Library/Preferences/SystemConfiguration/autodiskmount AutomountDisksWithoutUserLogin -bool true

Cette commande permet au système de monter le lecteur plus tôt dans le processus (avant la connexion). Ainsi, je pense qu'elle la rend disponible lorsque le système a besoin (normalement trop tôt) de mettre à jour le chemin par défaut du swap.

enter image description here

0voto

Je suis également dans cette situation, en démarrant à partir d'un SSD Samsung T5 connecté en USB3. J'ai essayé la solution de Lint, mais dans mon cas la commande

/usr/sbin/diskutil list | grep "VM" | awk '{ print $7 }'

génère deux réponses, car le disque dur interne et le SSD externe contiennent tous deux une partition swap (VM). Je n'arrive pas à trouver moi-même une solution à ce problème (automatiser le processus de montage au démarrage), alors quelqu'un peut-il m'aider ?


[Bizarrement, je ne peux pas ajouter de commentaire, je vais donc modifier votre "réponse" à la place. J'étais dans une situation similaire (MacOS Mojave démarrant à partir d'un Samsung T5 1GB SSD). Je vois également deux réponses lorsque j'exécute la commande ci-dessus diskutil donc je pense que la réponse de lint ne fonctionnera pas pour moi (de plus, je vois un fichier nommé /private/var/vm/sleepimage même si la VM n'est pas montée). Cependant, j'ai essayé la réponse de Michael Golban et cela a fonctionné avec un minimum d'effort. Tout d'abord, j'ai dû déterminer quelle VM devait être montée lorsque je démarre à partir du SSD Samsung. Je l'ai fait avec la commande suivante et j'ai ensuite regardé sur quel disque était monté / .

/usr/sbin/diskutil ap list

Le résultat pertinent pour moi était :

+-> Volume disk5s1 14706492-442E-3E44-84D8-C3A216EAB040
|   ---------------------------------------------------
|   APFS Volume Disk (Role):   disk5s1 (No specific role)
|   Name:                      Ext macOS (Case-insensitive)
|   Mount Point:               /
|   Capacity Consumed:         417911861248 B (417.9 GB)
|   FileVault:                 No

Donc maintenant je sais que la VM doit être sur le disque 5. Je regarde plus bas dans la sortie de diskutil et je vois :

+-> Volume disk5s4 8FF45FA5-EDB8-4812-947A-C1163BBDF5C4
    ---------------------------------------------------
    APFS Volume Disk (Role):   disk5s4 (VM)
    Name:                      VM (Case-insensitive)
    Mount Point:               Not Mounted
    Capacity Consumed:         10737463296 B (10.7 GB)
    FileVault:                 No

Viola ! Il devrait monter le disque 5s4 comme espace de pagination. J'ai donc suivi la réponse de Michael Golban, en substituant disk5s4 partout où il a utilisé disk3s4 dans son exemple spécifique. Après un redémarrage, diskutil ap list montre que disk5s4 est correctement monté.

+-> Volume disk5s4 8FF45FA5-EDB8-4812-947A-C1163BBDF5C4
    ---------------------------------------------------
    APFS Volume Disk (Role):   disk5s4 (VM)
    Name:                      VM (Case-insensitive)
    Mount Point:               /private/var/vm
    Capacity Consumed:         10737463296 B (10.7 GB)
    FileVault:                 No

Aussi, vm_stat indique des valeurs non nulles pour les swapins et les swapouts.

Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free:                               15355.
Pages active:                           1504355.
Pages inactive:                         1006398.
Pages speculative:                       593600.
Pages throttled:                              0.
Pages wired down:                        695931.
Pages purgeable:                         217108.
"Translation faults":                  20908140.
Pages copy-on-write:                     566900.
Pages zero filled:                     14492420.
Pages reactivated:                      1136316.
Pages purged:                            693655.
File-backed pages:                      1424716.
Anonymous pages:                        1679637.
Pages stored in compressor:             1427995.
Pages occupied by compressor:            378113.
Decompressions:                          426681.
Compressions:                           3751860.
Pageins:                                2715810.
Pageouts:                                 14437.
Swapins:                                 438359.
Swapouts:                                917646.

0voto

RFerreira.DBA Points 1

J'ai eu une expérience similaire, mais ma configuration est un peu inhabituelle. J'ai :

  1. À l'origine, il s'agissait d'un disque Fusion (128SSD+1TBHDD), dont j'ai remplacé le disque dur par un SSD tiers (Crucial MX500 (1TB)). Et oui, j'ai recréé le lecteur Fusion après l'échange. Donc, maintenant, je suis de retour à l'original Fusion Drive de 1,2 To, mais composé de deux SSD (tous deux APFS).
  2. Un peu plus de RAM que la plupart des systèmes, avec 32 Go (16 Go à l'origine, mis à niveau vers 32 Go).
  3. Trois disques externes, 2 SSD connectés via USB 3.0 (AKA 3.1v1), l'un à 500 Go (APFS) et l'autre à 256 Go (HFS+), et le troisième disque est un disque dur ordinaire à 3 To (HFS+), également connecté via le même bus USB.
  4. Exécution de Mojave.

Maintenant, voici où/quand le problème s'est présenté : J'ai décidé de convertir le SSD de 256 Go en APFS. La conversion s'est bien passée. Aucun problème. CEPENDANT, dès que cela a été fait, mon outil de surveillance (iStat) a commencé à montrer un lecteur supplémentaire appelé "VM". Je me suis méfié... C'est aussi unique dans mon cas : J'exécute des machines virtuelles à l'aide de Parallels. Comme je l'ai dit, j'étais curieux de savoir ce que ce nouveau lecteur nommé VM faisait dans mon menu iStat... J'ai continué à fouiller et j'ai réalisé que c'était censé être le fichier d'échange. J'ai ouvert Activity Monitor et à ma grande surprise, ma mémoire était presque au maximum et la valeur du fichier d'échange était de 0, ce qui n'est PAS correct. OS X est censé commencer à paginer les choses sur le lecteur de swap, au lieu de se retrouver à court de mémoire.

J'ai eu l'intuition que le système d'exploitation manque quelque chose lorsqu'il convertit un volume en APFS et que le redémarrage était tout ce dont j'avais besoin pour remettre les choses en ordre. Eh bien, dans MON cas, cela a fait l'affaire. Après le redémarrage, le système a recommencé à paginer vers le fichier d'échange comme il le devait, et iStat n'a plus affiché le "mystérieux" lecteur VM. Et tous mes lecteurs étaient dans leurs versions respectives correctes du système de fichiers.

Désolé. Je sais que cela n'aide probablement pas à résoudre la question initiale, mais cela pourrait éclairer le fonctionnement interne du problème.

Portez-vous bien, Rapha.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X