我不宅,我只是不出門

Murmur of a technical dude

Move swap files to a single partition in Mac OS X

with 7 comments

Tags: Mac OS X, Apple, swap, page file, partition, HFS.

Mac OS X 底下的 pagefiles 跟 windows 一樣, 是以檔案的形式存在, 放在 /private/var/vm/swapfile[0-9]. 對於系統預設安裝的一整個 partition, swap files 跟系統還有個人資料皆放於同一個 journaled HFS. 除此之外, Mac OS X 的 swap files 並不是固定大小, 他隨著記憶體使用需求來增減. 預設大小是 64MB, 第二次也是 64MB, 再來就會變成 128MB, 接著是 256MB, 如此增長下去.

64MB swapfile0
64MB swapfile1
128MB swapfile2
256MB swapfile3

因此對於整個 file system 和效能來說可能不是最好的方法. 在此提供一個把 swap files 放到獨立的 partition 的方法.

  • step 1: 首先需要有一個獨立的 partition, 因為無法動態調整 HFS partition size, 因此可能就需要重新安裝系統. 在安裝系統前使用 Disk Utility 來分割硬碟. 大概預估會使用多大的 swap, 可以從先前跑程式時所製造出來的 swapfiles 總和為參考. 不過像我是 768MB RAM, 大概預估是給他 1G. 再來 swap files 增長是以 double 為單位, 因此最好以這種方式估計一下, 不是隨便說 600M or 700M. 結果可能到時候要用也無法用到, 多餘的空間也不好給其他地方用. 計算方式為 1n+1n+2n+4n+8n… 而我是以 128MB 為開始單位, 預估 swap files 在跑很多程式下也差不多用到跟記憶體差不多. 所以 128+128+256+512 加起來是 1G, 所以就分割 1G 的空間. 另外 swap 可能因為 double 增加會浪費不少空間, 例如增加到 512M 之後, 1024M 的 swap file 可能只會用到一點點, 但卻浪費了不少空間當 swap. 所以假設要切割 1.5G, 那麼可以用剛剛的規則算一下一開始的 swap size 大概多少比較好.
    ps. 對於 swap 的 partition file system 可以使用 Unix or HFS 就好, 應該需要 journaled file. 且為了避免之後系統會把 swap 的 partition 一起列出來, 所以在命名上最好在前面加個 “." 也就是系統會把 “." 開頭的當作隱藏目錄.
  • step 2: 安裝系統完畢後, 開機進入系統, 系統會以 /private/var/vm 當作 swap 的存放地點. 這時候要修改 swap file 的目錄, 需要把先前的 swap partition mount 到特定的目錄. 首先使用 Disk Utility 來觀察 swap partition 的 information, 把 UUID copy 下來. 建立一個目錄例如 /swap 然後編輯 /etc/fstab, 格式如下.
    UUID=剛才複製的UUID /swap hfs rw 1 2

    這樣下次開機, 就會把 swap partition mount 到 /swap 而非 /Volumes

  • step 3: 修改 /etc/rc. search swapdir, 把他原本是 /private/var/vm 改成 /swap. 接著下面有 dynamic_pager 的地方, 可以照 step 1 提到如果需要修改預設的大小就可以在這修改. 加上 -S byte1 -H byte2 -L byte3, -S 是開始固定的大小 -H 是高水位的 bytes, 如果剩下的 swap byte byte3, 就會把該 swap 刪除. 而系統規定 byte3 要大於 byte1+byte2. 因此以我的設定是 byte1=128M, byte2=64M, byte3=196M. 所以要改為 dynamic_pager -S 134217728 -H 67108864 -L 205520896. 這樣 swap file 一開機就是 128MB, 接著需要會在分配 128M, 第三次為 256M, 以此類推.
  • step 4: 接著就可以重新開機, 系統就會把 swapfiles 擺到 /swap 裡面. 而 /private/var/vm 舊的 swap files 就可以把他刪除掉把空間還給系統. 這樣 swap files 就會全部都擺在獨立的 swap partition 裡面.至於效能可以提升多少, 可以自己試試看開機速度和程式執行的速度比較看看. 我的感覺是開機速度到 login 畫面, 然後進入後載入 finder/dock 和 startup 程式的速度快多了🙂

Written by jclin

2005/04/24 於 12:35 上午

張貼於talk

7 回應

Subscribe to comments with RSS.

  1. 你好:
    關於UUID 查詢的方法可否在說明清楚一點,我無法在Disk Utility裡找到UUID
    另外編輯rc 時,您通常都用什麼軟體呢?
    或者,我可否,直接在SWAP Partition 裡建立 /private/var/vm 的目錄 而 不修改 rc呢?
    謝謝

    John Chen

    2007/03/04 at 5:23 下午

  2. 1. 執行 Disk Utility,選擇一個 partition,然後按下 mouse right button,會跳出一個選單,上頭有 Information,選擇後會秀出一個新視窗,裡面會有更詳細的資訊,其中 Universal Unique Identifier 就是了。
    2. 編輯 rc 或是其他檔案,我比較常用 Terminal 和 vi 來作
    3. 也是可以,但是我通常不這麼做。因為 Darwin 並不是全靠 fstab 來掛載全部的 partition,像 linux 就是透過 fstab 指定 swap 在哪個 partition。如果當系統不正常重新啟動時,通常是 / 一定會被正常掛載,其他 partition 開完機後要 check 才會正常掛載,而非開機中就完全 check 完畢所有 partition 才會進入 Aqua GUI 等等。因此我是保留原始一些設定給這種時候使用,不完全更動系統的設定或目錄。包含 rc 那邊也是,也是檢查確定有掛載到才會把 swap 放在那個 partition。

    jclin

    2007/03/04 at 9:21 下午

  3. 你好
    1. 我用的 10.4.9 版,並沒有 fstab file 請問要如何掛載 ?
    (我試過新增此檔 但沒有用)
    2,可否將 你的 rc file 有關 swap memory 的設定貼出,
    讓初學者也能依樣畫葫蘆

    alex

    2007/04/28 at 8:58 上午

  4. Mac OS X 並不是靠 fstab 來掛載磁碟分割區
    首先在想要把 swap 放置的地方手動 mount 後,touch _fixed_swap_ 產生這檔案,
    用意是讓系統在啟動時可以辨識 swap partition 是否有掛載,否則沿用系統預設。
    啟動的地方寫在 /etc/rc,主要分成兩個部份
    echo “Mounting local filesystems"
    mount -uw /
    # 以下一行是我自己加的
    mount_hfs /dev/disk0s3 /.swap
    [ -f /etc/fstab ] && mount -vat nonfs

    #之後,還有一段內容,可以對照原始檔案看看修改過的地方
    echo “Starting virtual memory"

    swapdir=/private/var/vm
    swapsize=""
    if [ -f /.swap/_fixed_swap_ ]; then
    swapdir=/.swap
    swapsize="-S 1073741824 -H 4096 -L 1073750016″
    fi
    if [ “${NetBoot}" = “-N" ]; then
    sh /etc/rc.netboot setup_vm ${swapdir}
    fi

    if [ ! -d ${swapdir} ]; then
    echo “Creating default swap directory"
    mkdir -p -m 755 ${swapdir}
    chown root:wheel ${swapdir}
    else
    RMRF_ITEMS="${RMRF_ITEMS} ${swapdir}/swap*"
    fi

    echo Removing $RMRF_ITEMS
    rm -rf $RMRF_ITEMS

    if [ ${ENCRYPTSWAP:=-NO-} = “-YES-" ]; then
    encryptswap="-E"
    else
    encryptswap=""
    fi
    /sbin/dynamic_pager ${encryptswap} -F ${swapdir}/swapfile $swapsize

    jclin

    2007/04/28 at 2:27 下午

  5. 看來我 依樣畫葫蘆 並沒有成功 ,系統還是用預設目錄(我是用 ps -wax |grep dynamic_pager -m1 看的),不過還是 謝謝你的回文

    alex

    2007/04/29 at 7:49 上午

  6. 終於將 swapfile mount 在其它的partition , 謝謝你的幫忙 !

    alex

    2007/05/06 at 6:49 上午

  7. 10.6 按照您說的修改

    2009/10/11 上午2:35:08 com.apple.dynamic_pager[316] dynamic_pager: cannot create paging file /private/var/vm/swapfile0!
    2009/10/11 上午2:35:08 com.apple.launchd[1] (com.apple.dynamic_pager[316]) Exited with exit code: 1
    2009/10/11 上午2:35:08 com.apple.launchd[1] (com.apple.dynamic_pager) Throttling respawn: Will start in 10 seconds

    好像會完蛋,根本跑不起來..而且我過了兩三天才發現

    http://ksc91u.googlepages.com/com.apple.dynamic_pager_fail.plist

    ksc91u

    2009/10/11 at 2:41 上午


發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: