Làm thế nào để giải phóng một không gian trao đổi bằng tay mà không cần khởi động lại?


13

Tôi đang sử dụng High Sierra trên MacBook Pro với 16GB RAM với SSD.

Có 15G tệp hoán đổi, có phương pháp nào giải phóng không gian / tệp hoán đổi mà không cần khởi động lại không?

$ sysctl -a | grep swap
vm.swapusage: total = 15360.00M  used = 14468.75M  free = 891.25M  (encrypted)
vm.compressor_swapout_target_age: 0
vm.swapfileprefix: /private/var/vm/swapfile
debug.intel.swapCount: 0
$ ll -h /var/vm/swap*
-rw------- 1 root wheel 1.0G Apr 30 16:10 /var/vm/swapfile0
-rw------- 1 root wheel 1.0G Apr 30 17:16 /var/vm/swapfile1
-rw------- 1 root wheel 1.0G May 11 21:28 /var/vm/swapfile10
-rw------- 1 root wheel 1.0G May 11 21:46 /var/vm/swapfile11
-rw------- 1 root wheel 1.0G May 11 22:04 /var/vm/swapfile12
-rw------- 1 root wheel 1.0G May 11 23:00 /var/vm/swapfile13
-rw------- 1 root wheel 1.0G May 11 23:01 /var/vm/swapfile14
-rw------- 1 root wheel 1.0G May 11 23:02 /var/vm/swapfile15
-rw------- 1 root wheel 1.0G May  2 12:45 /var/vm/swapfile2
-rw------- 1 root wheel 1.0G May  4 14:02 /var/vm/swapfile3
-rw------- 1 root wheel 1.0G May  4 05:50 /var/vm/swapfile4
-rw------- 1 root wheel 1.0G May  8 11:05 /var/vm/swapfile5
-rw------- 1 root wheel 1.0G May  9 16:18 /var/vm/swapfile6
-rw------- 1 root wheel 1.0G May 10 03:02 /var/vm/swapfile7
-rw------- 1 root wheel 1.0G May 11 13:03 /var/vm/swapfile8
-rw------- 1 root wheel 1.0G May 11 21:07 /var/vm/swapfile9

Tôi muốn bằng cách nào đó thả các tệp này mà không vô hiệu hóa dynamic_pager.


Tôi đã cố gắng:

  • chạy sudo purge(buộc bộ đệm đĩa bị xóa);
  • thoát khỏi tất cả các ứng dụng mà tôi không sử dụng;
  • lừa hệ thống bằng cách tạo các tệp hoán đổi giả trước khi chúng được tạo:

    cd /var/vm
    sudo touch swapfile{0..20} 2>/dev/null; sudo chmod 000 swapfile{0..20} 2>/dev/null
    

    nhưng nó không hoạt động, vì hệ thống vẫn tạo / thay đổi tập tin bất chấp sự 000cho phép, kỳ lạ.

Vì một số lý do, htophiển thị bộ nhớ ảo là 532G, nhưng tôi tin rằng đó là một lỗi, vì topnó hiển thị ít được sử dụng hơn.

htop vs top, PID USER PRI NI VIRT RES S CPU% MEM% TIME + Lệnh, trao đổi, bộ nhớ, CPU, macOS

Ở trên htop/ topchỉ hiển thị 2 tác vụ đang chạy, 445 đang ngủ, CPU không được sử dụng nhiều, nhưng kernel đang bận với việc hoán đổi giữa 15G tệp.

Tôi có thể khởi động lại nó nhưng sau vài ngày vấn đề này lặp lại mỗi tuần. Lý tưởng nhất là tôi muốn giết và hủy (loại bỏ) các tệp hoán đổi và bắt đầu lại trên cùng một lần chạy, nhưng macOS không cho phép tôi làm điều đó.

$ sudo rm -fr swapfile*
Password:
rm: cannot remove 'swapfile0': Operation not permitted

Có bất kỳ hack nào có sẵn để buộc dynamic_pagerphải bỏ các tập tin này? Tôi không cần nhiều đến thế.

Btw. Các tập tin trao đổi là trống rỗng! Xem:

$ sudo strings swapfile*
swapfile0
swapfile1
swapfile10
swapfile11
swapfile12
swapfile13
swapfile2
swapfile3
swapfile4
swapfile5
swapfile6
swapfile7
swapfile8
swapfile9
/var/vm$ sudo gzip swapfile*
/var/vm $ ll -h *.gz
-rw------- 1 root wheel 1.6M Apr 30 16:10 swapfile0.gz
-rw------- 1 root wheel 1.6M Apr 30 17:16 swapfile1.gz
-rw------- 1 root wheel 1.6M May 11 21:28 swapfile10.gz
-rw------- 1 root wheel 1.6M May 11 21:46 swapfile11.gz
-rw------- 1 root wheel 1.6M May 11 22:04 swapfile12.gz
-rw------- 1 root wheel 1.6M May 11 23:00 swapfile13.gz
-rw------- 1 root wheel 1.6M May  2 12:45 swapfile2.gz
-rw------- 1 root wheel 1.6M May  4 14:02 swapfile3.gz
-rw------- 1 root wheel 1.6M May  4 05:50 swapfile4.gz
-rw------- 1 root wheel 1.6M May  8 11:05 swapfile5.gz
-rw------- 1 root wheel 1.6M May  9 16:18 swapfile6.gz
-rw------- 1 root wheel 1.6M May 10 03:02 swapfile7.gz
-rw------- 1 root wheel 1.6M May 11 13:03 swapfile8.gz
-rw------- 1 root wheel 1.6M May 11 21:07 swapfile9.gz

Nếu chúng trống, tại sao macOS không thể xóa chúng. Tôi khá chắc chắn rằng sự chậm chạp của hệ thống (như tải avg và thường xuyên đóng băng chuột) là do việc tạo và xóa các tệp này liên tục, vì tôi không có bất kỳ quy trình nào khác sử dụng CPU của tôi nhiều.

Ví dụ, trước khi viết bài đăng này, tôi đã có 13G tệp hoán đổi (mỗi tệp 1G), trong quá trình viết và dán ở trên đầu ra, tôi đã kết thúc với 15G (bằng cách không làm gì cả), sau đó macOS thực sự bị xóa swapfile14swapfile15(vì vậy 13G trao đổi) viết cái này Sau đó loại bỏ swapfile13khi viết câu này. Sau đó tạo ra tới swapfile16(16G) khi viết câu này. Và loại bỏ swapfile16một lần nữa khi viết câu này. Và như vậy. Thật là một mớ hỗn độn. Nếu đây là các tệp trống, tại sao macOS cứ tiếp tục tạo chúng, khi nó không điền gì vào đó.


Thông tin khác:

$ sudo launchctl list | grep pager
-   0   com.apple.dynamic_pager
$ launchctl print system | grep dynamic_pager
               0      0     com.apple.dynamic_pager
$ ps wuax | grep dynamic_pager
# No running?!
$ launchctl dumpstate | grep -A20 com.apple.dynamic_pager
               0      0     com.apple.dynamic_pager
--
com.apple.dynamic_pager = {
    active count = 0
    path = /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
    state = waiting

    program = /sbin/dynamic_pager
    arguments = {
        /sbin/dynamic_pager
    }

    default environment = {
        PATH => /usr/bin:/bin:/usr/sbin:/sbin
    }

    environment = {
        XPC_SERVICE_NAME => com.apple.dynamic_pager
    }

    domain = com.apple.xpc.launchd.domain.system
    minimum runtime = 10
    exit timeout = 5
    runs = 1
    successive crashes = 0
    excessive crashing = 0
    last exit code = 0

Dưới đây là mẫu WindowServerquy trình 1 giây , trong đó ít nhất nửa giây được dành cho trao đổi:

Command:         WindowServer
Parent:          launchd [1]
Duration:        1.01s
Steps:           10 (100ms sampling interval)
Active cpus:     8
Fan speed:       2159 rpm

  Thread 0x1ab              Thread name "VM_cswap_trigger"                      10 samples (1-10)         priority 91 (base 91)     cpu time 0.222s
  <IO tier 0>
 *10  call_continuation + 23 (kernel + 2098423) [0xffffff80004004f7] 1-10
   *10  ??? (kernel + 2882629) [0xffffff80004bfc45] 1-10
     *6  ??? (kernel + 2883102) [0xffffff80004bfe1e] 1-6
       *6  thread_block_reason + 175 (kernel + 2530911) [0xffffff8000469e5f] 1-6
         *6  ??? (kernel + 2534903) [0xffffff800046adf7] 1-6
           *6  machine_switch_context + 205 (kernel + 3578125) [0xffffff800056990d] 1-6
     *1  ??? (kernel + 2883122) [0xffffff80004bfe32] 7
       *1  ??? (kernel + 2885317) [0xffffff80004c06c5] 7
         *1  c_seg_do_minor_compaction_and_unlock + 303 (kernel + 2886351) [0xffffff80004c0acf] 7
           *1  c_seg_minor_compaction_and_unlock + 344 (kernel + 2887576) [0xffffff80004c0f98] (running) 7
     *2  ??? (kernel + 2883102) [0xffffff80004bfe1e] 8-9
       *2  thread_block_reason + 175 (kernel + 2530911) [0xffffff8000469e5f] 8-9
         *2  ??? (kernel + 2534903) [0xffffff800046adf7] 8-9
           *2  machine_switch_context + 205 (kernel + 3578125) [0xffffff800056990d] 8-9
     *1  ??? (kernel + 2883122) [0xffffff80004bfe32] 10
       *1  ??? (kernel + 2885317) [0xffffff80004c06c5] 10
         *1  c_seg_do_minor_compaction_and_unlock + 303 (kernel + 2886351) [0xffffff80004c0acf] 10
           *1  c_seg_minor_compaction_and_unlock + 633 (kernel + 2887865) [0xffffff80004c10b9] 10
             *1  kernel_memory_depopulate + 194 (kernel + 2976354) [0xffffff80004d6a62] 10
               *1  pmap_remove_options + 1124 (kernel + 3488404) [0xffffff8000553a94] 10
                 *1  pmap_remove_range_options + 1988 (kernel + 3485812) [0xffffff8000553074] (running) 10

  Thread 0x1ac              Thread name "VM_compressor"                         10 samples (1-10)         priority 91 (base 91)     cpu time 0.201s
  <IO tier 0>
 *6  call_continuation + 23 (kernel + 2098423) [0xffffff80004004f7] 1-6
   *6  vm_pageout_iothread_internal_continue + 1129 (kernel + 3134345) [0xffffff80004fd389] 1-6
     *6  vm_pageout_compress_page + 268 (kernel + 3135052) [0xffffff80004fd64c] 1-6
       *6  vm_compressor_pager_put + 160 (kernel + 2903904) [0xffffff80004c4f60] 1-6
         *6  vm_compressor_put + 1389 (kernel + 2900045) [0xffffff80004c404d] 1-6
           *1  WKdm_compress_new + 736 (kernel + 2092960) [0xffffff80003fefa0] (running) 1
           *1  WKdm_compress_new + 776 (kernel + 2093000) [0xffffff80003fefc8] (running) 2
           *1  WKdm_compress_new + 781 (kernel + 2093005) [0xffffff80003fefcd] (running) 3
           *1  WKdm_compress_new + 303 (kernel + 2092527) [0xffffff80003fedef] (running) 4
           *1  WKdm_compress_new + 748 (kernel + 2092972) [0xffffff80003fefac] (running) 5
           *1  WKdm_compress_new + 771 (kernel + 2092995) [0xffffff80003fefc3] (running) 6
 *1  vm_pageout_iothread_internal_continue + 0 (kernel + 3133216) [0xffffff80004fcf20] 7
 *1  call_continuation + 23 (kernel + 2098423) [0xffffff80004004f7] 8
   *1  vm_pageout_iothread_internal_continue + 1129 (kernel + 3134345) [0xffffff80004fd389] 8
     *1  vm_pageout_compress_page + 268 (kernel + 3135052) [0xffffff80004fd64c] 8
       *1  vm_compressor_pager_put + 127 (kernel + 2903871) [0xffffff80004c4f3f] (running) 8
 *2  vm_pageout_iothread_internal_continue + 0 (kernel + 3133216) [0xffffff80004fcf20] 9-10

  Thread 0x1ad              Thread name "VM_compressor"                         10 samples (1-10)         priority 91 (base 91)     cpu time 0.144s
  <IO tier 0>
 *3  call_continuation + 23 (kernel + 2098423) [0xffffff80004004f7] 1-3
   *3  vm_pageout_iothread_internal_continue + 1129 (kernel + 3134345) [0xffffff80004fd389] 1-3
     *3  vm_pageout_compress_page + 268 (kernel + 3135052) [0xffffff80004fd64c] 1-3
       *3  vm_compressor_pager_put + 160 (kernel + 2903904) [0xffffff80004c4f60] 1-3
         *3  vm_compressor_put + 1389 (kernel + 2900045) [0xffffff80004c404d] 1-3
           *1  WKdm_compress_new + 280 (kernel + 2092504) [0xffffff80003fedd8] (running) 1
           *1  WKdm_compress_new + 286 (kernel + 2092510) [0xffffff80003fedde] (running) 2
           *1  WKdm_compress_new + 309 (kernel + 2092533) [0xffffff80003fedf5] (running) 3
 *1  vm_pageout_iothread_internal_continue + 0 (kernel + 3133216) [0xffffff80004fcf20] 4
 *2  call_continuation + 23 (kernel + 2098423) [0xffffff80004004f7] 5-6
   *1  vm_pageout_iothread_internal_continue + 1187 (kernel + 3134403) [0xffffff80004fd3c3] 5
     *1  vm_page_free_list + 124 (kernel + 3219628) [0xffffff80005120ac] 5
       *1  vm_page_free_prepare_object + 146 (kernel + 3207826) [0xffffff800050f292] (running) 5
   *1  vm_pageout_iothread_internal_continue + 1129 (kernel + 3134345) [0xffffff80004fd389] 6
     *1  vm_pageout_compress_page + 304 (kernel + 3135088) [0xffffff80004fd670] (running) 6
 *4  vm_pageout_iothread_internal_continue + 0 (kernel + 3133216) [0xffffff80004fcf20] 7-10

Bạn chỉ hiển thị nhiệm vụ của mình trong đầu những gì về người dùng khác. Ngoài ra những gì giám sát hoạt động cho thấy?
Đánh dấu

@kenorb Bạn đã tìm thấy câu trả lời chưa? Trao đổi cao là lý do duy nhất macos cần khởi động lại. Nâng cao câu hỏi này 100 lần.
Wade Williams

Câu trả lời:


2

Đối với cách giải quyết, việc khởi động lại / tắt tiến trình WindowServer tạm thời giúp:

# sudo pkill -HUP -u _windowserver

Tuy nhiên, điều này sẽ giết tất cả các quy trình, đăng xuất bạn và mở lại tất cả các cửa sổ, vì vậy chỉ sử dụng nó khi hệ thống của bạn có hình dạng rất xấu. Tuy nhiên, nó đã dọn sạch / xóa tất cả các tệp hoán đổi mà không cần khởi động lại (ít nhất là trong một thời gian) cho đến khi nó ra khỏi tầm kiểm soát một lần nữa.


Để theo dõi, những gì tạo / cập nhật các tệp hoán đổi này, hãy chạy:

$ sudo fs_usage | grep swapfile

Hoặc để vào / ra trang, hãy chạy:

$ sudo fs_usage | grep PAGE_

Để xem WindowServerchính xác quá trình đang làm gì, hãy chạy:

$ sudo spindump -reveal $(pgrep WindowServer)

hoặc cho kernel_task, chạy:

$ sudo spindump -reveal 0

1
giết WindowServer không hiệu quả với tôi. Hoán đổi là 600 GB và giảm xuống 150 GB sau khi giết Window Server. Thật không may, điều duy nhất làm thay đổi quá trình trao đổi là khởi động lại.
SpaceDog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.