Matlab 용 Ubuntu의 가상 메모리 및 / 또는 스왑을 늘리는 방법은 무엇입니까?


16

상황 : Out of MemoryUbuntu Matlab
목표 의 오류 수정 : 외부 HDD / SSD에 일부 가상 메모리 및 / 또는 스왑을 할당하십시오. 읽기 / 쓰기가 20GBps에서 0.1GBps로 감소했습니다.
용어 : 스왑 메모리와 가상 메모리 여기

아니요, 스왑과 가상 메모리는 완전히 다릅니다. 예를 들어, 1GB 파일의 메모리 매핑은 추가 1GB의 가상 메모리를 사용하지만 스왑 사용에는 변경이 없습니다. 스왑은 일종의 백업 저장소입니다. 가상 메모리의 많은 용도는 백업 저장소와 관련이 없습니다. (그리고 가상 메모리가없고 스왑이없는 시스템뿐만 아니라 가상 메모리가 있고 스왑이없는 시스템이있었습니다.)

소비자 하드웨어는 제한적이므로 더 많은 가상 메모리를 사용하거나 외장 HDD와 교체해야합니다. Matlab은 스왑 메모리에 대해 말합니다 (가상 메모리를 제외한 TODO?)

Linux 시스템 — mkswapswapon명령 을 사용하여 스왑 공간을 변경하십시오 .

시스템의 특성

  • 당신은 당신이 그것을 얼마나 볼 수 있습니다 swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • Matlab의 구성

    % /programming//a/35971040/54964
    com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB
    
    % TODO cannot find ways how to put Matlab use /dev/sda3
    
  • 내 Matlab이 사용하지 않는 것을 알 수 있습니다. Out of MemoryMatlab에서 큰 행렬로 오류 가 발생합니다. reshape행렬을 벡터 에 '하고 병렬 코드를 작성하는 데 실패했습니다 . 작업을 완료해야하기 때문에 가상 메모리를 사용하고 싶습니다. 속도는 중요하지 않습니다.

의사 코드

  1. 스왑을 생성하고 MATLAB을 시작하며 MATLAB이 종료되면 스왑을 삭제하는 셸 스크립트 ( MichaelHooreman )
  2. 외장 HDD에서 스왑을 활성화합니다. sudo swapon -a여기서 어떻게 사용 합니까?
  3. Matlab을 시작하십시오.
  4. Matlab을 스왑으로 사용하십시오.
  5. Matlab이 종료되면 스왑을 삭제하십시오.

Micheal의 스크립트에서 임시 스왑, 클라이언트 실행 및 스왑 닫기 / 제거

상황 : 환경 설정 (1), Matlab 실행 (2) 및 환경 종료 (3)
스크립트 오류를 제어 할 수 없음

#!/usr/bin/env bash

# /programming//a/69808/54964
set -e 
# TODO How to do swapoff if any error?

SWAP_FILE="/media/masi/SamiSwapVirtual/.swap_file_20.7.2016"
SIZE_MB=16000
TO_RUN="matlab"

dd if="/dev/zero" of=${SWAP_FILE} bs="1M" count=${SIZE_MB} status="progress"
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
sudo chown 0.0 ${SWAP_FILE} # /unix//a/297153/16920
sudo swapon -v ${SWAP_FILE}
echo "Swap enabled. Press enter to continue"; read
${TO_RUN}
echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v ${SWAP_FILE}
rm -vf ${SWAP_FILE}

Transcend 25M3 1TB의 반복 1과 파일 시스템이 거의없는 상태에서 반복 사용 ext4

  1. 스크립트 시작 후 로그

    sh start_matlab_with_swap.sh 
    16000+0 records in
    16000+0 records out
    16777216000 bytes (17 GB, 16 GiB) copied, 134.489 s, 125 MB/s
    Setting up swapspace version 1, size = 15.6 GiB (16777211904 bytes)
    no label, UUID=48c2835b-4499-4534-aa49-0648e15bd5d9
    [sudo] password for masi: 
    swapon /media/masi/SamiWeek/tmp/swap_file_18.7.2016
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: insecure file owner 1000, 0 (root) suggested.
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: found swap signature: version 1d, page-size 4, same byte order
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: pagesize=4096, swapsize=16777216000, devsize=16777216000
    Swap enabled. Press enter to continue
    start_matlab_with_swap.sh: 11: read: arg count
    
  2. 클라이언트 실행

    • 명령 기록을 스왑 메모리 (티켓 번호 02075943)에서 처음 시작할 때 명령 기록이 사라졌습니다 . 명령 기록을 읽는 중에 문제가 발생했습니다-- . Matlab을 다시 시작하면 기본 설정이되어 있으면 문제가 해결됩니다. 명령 prefdir/home/masi/.matlab/R2016a기본 위치를 나타냅니다 ( /home/{username}/.matlab/R2016a. 파일 /home/masi/.matlab/R2016a/matlab.prf은 재시작 후 존재합니다 ( 여기)) .

    • ... [기타 오류] ...

  3. 터미널에서 Matlab을 닫고 암호를 다시 입력

    [sudo] password for masi: 
    swapoff /media/masi/SamiWeek/tmp/swap_file_18.7.2016
    [ bugs here! ]
    

Open : 오류 트래핑의 더 나은 오류 처리를 어떻게 적용합니까? 소스의 예제는 내 스크립트를 참조하십시오. Thread 오류 / 경고시 오류 트래핑 및 스왑 오프를 수행하는 방법은 무엇입니까?

영구 스왑 = 실행중인 클라이언트와 스왑 설정 분리

스왑 설정

# /unix//q/297767/16920
masi@masi:~$ sudo fallocate -l 20G /mnt/.swapfile

masi@masi:~$ sudo mkswap /mnt/.swapfile 
Setting up swapspace version 1, size = 20 GiB (21474832384 bytes)
no label, UUID=45df9e48-1760-47e8-84d7-7a14f56bbd72

masi@masi:~$ sudo swapon /mnt/.swapfile
swapon: /mnt/.swapfile: insecure permissions 0644, 0600 suggested.

masi@masi:~$ sudo chmod 600 /mnt/.swapfile

masi@masi:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:           7925        1494         175         196        6255        5892
Swap:         28610           0       28610

/etc/fstab영구적 인 변경 을 위해 다음을 마무리 하십시오

# /unix//a/298212/16920
# /unix//a/298543/16920

# If swap is on SSD, trim blocks each time at startup.
#/mnt/.swapfile  none    swap    defaults,discard      0        0

# If swap on External HDD, just use sw.
/media/masi/SamiWeek/.swapfile  none    swap    sw      0        0

시스템 : Linux Ubuntu 16.04 64 비트
Linux 커널 : 4.6
Linux 커널 옵션 : wl
Matlab : 2016a
공식 Matlab 문서 : "메모리 부족"오류 해결
외부 HDD : Transcend 1 TB StoreJet 25M3 review , Transcend 2 TB StoreJet 25M3
외장 HDD 파일 시스템 : ext4
외부 HDD 버퍼 : 8 MB
관련 스레드 : 우분투에서 MATLAB 메모리 제한을 늘리는 방법은 무엇입니까? (MATLAB에 mkswap, swapon을 사용하는 방법?) , Matlab에서 실제 메모리 증가를 줄이는 방법은 무엇입니까? , Matlab에서 메모리 부족 오류를 해결하는 방법? , 10800x10800 매트릭스 용 Matlab의 메모리 부족 오류를 수정하는 방법? ,Matlab r2012b에서 메모리 제한 (연속 및 전체)을 어떻게 늘리나요? , Matlab 2009b에서 어레이 블록을 늘리고 메모리 부족 오류를 해결하는 방법은 무엇입니까? , Matlab의 작은 변수에 대한 메모리 부족 문제를 해결하는 방법은 무엇입니까? , 매트랩 '메모리 부족'. 느리지 만 영구적 인 해결책?


4
죄송합니다. 질문에 대한 답변이 아닙니다. 그러나 당신은 이것을 정말로 확신합니까? 스왑에서 계산하는 데는 시간이 오래 걸립니다. Ram은 초당 최소 20GB를 읽고 외부 HDD는
0.1GBps

1
@Anake 예, 알고 있습니다. 문제가되지 않습니다. 32 / 64GB로 계산할 수 있지만 현재 8GB 울트라 북으로는 계산할 수없는 거대한 행렬이 있습니다. 나는 휴일에 여전히 계산을해야합니다.
Léo Léopold Hertz 준영

1
쓸모없는 또 다른 의견 죄송합니다. 집에서 컴퓨터를 켜 두어 SSH로 연결하여 집이나 유니에서 실행할 수 있습니까?
Anake

@Anake 현재로서는 불가능합니다. 죄송합니다. 또한 Matlab은 로컬 계산이 필요합니다. 또한 현재 충분한 키가 없습니다.
Léo Léopold Hertz 준영

이 맥락에서 MATLAB의 특별한 점은 무엇입니까? 스왑 공간을 늘리는 방법과
스틸 드라이버

답변:


2

좋아, 당신이 가지고있는 목록. 인라인으로 응답하겠습니다

  1. 여기서 오류 트래핑의 더 나은 오류 처리를 적용하는 방법은 무엇입니까? 소스의 예제는 내 스크립트를 참조하십시오. Thread 오류 / 경고시 오류 트래핑 및 스왑 오프를 수행하는 방법?

이 스크립트의 개념이 전혀 마음에 들지 않습니다. 스왑으로 사용하려는 외장 하드 드라이브가 있다는 것은 나쁜 생각입니다. 이 작업을 정기적으로 수행하려는 경우 파티션의 크기를 조정하여 적절한 스왑 파티션을 넣거나 스왑 파일을 추가하거나 더 큰 내부 디스크를 구입하십시오.

  1. 매트릭스 크기가 스왑 크기를 초과하는 경우 경고를 표시하는 방법은 무엇입니까?

그냥 수학하세요. 프로그램이 시작되기 전에 행렬의 크기를 알고 있다면 MiB로 크기를 계산하여 사용 가능한 스왑과 비교하십시오.

  1. Matlab에서 거대한 행렬을 계산할 때 진행률 표시 줄을 얻는 방법은 무엇입니까?

matlab에 API 권한이 있습니까? 나는 이것이 그 질문에 대한 올바른 포럼이라고 생각하지 않습니다. API가 있더라도 스왑을 통해 IO를 차단하므로 실제로는 현실을 반영하지 않는 거친 진행 막대 일뿐입니다.

  1. 반복에서 바쁜 진행 및 / 또는 swapon -s / swapoff를 죽이는 방법 (2)?

당신은하지 않습니다. 계산이 완료되었다고해서 운영 체제가 할당 한 리소스로 완료된 것은 아닙니다. 스왑을 위해 작성을 마치면 해제됩니다. 많은 메모리를 소비하여 많은 응용 프로그램이 필요한 메모리를 얻지 못하여 스왑을 사용하고 있습니다. 그대로두고 운영 체제에서 작동하게하십시오. 다음 실행을 수행하기 전에 캐시를 지우십시오.

echo 3 > /proc/sys/vm/drop_caches 

아마도 그보다 더 많은 것이있을 것입니다. 나는 Linux VM 전문가가 아닙니다. SLAB / SLUB 할당자가 작동하는 방식과 대용량 메모리 요구 사항에 맞게 조정하는 방법을 조사하는 것이 좋습니다. matlab을 메모리에 MLOCK 할 수 있습니다. 이로 인해 OS가 메모리를 예약하거나 시작되지 않으며 완료되면 잠금을 해제해야합니다. C API를 사용 하여이 작업을 수행 할 수는 있지만 다시 컴파일 할 수없는 프로세스 외부에서 수행하는 방법을 모르겠습니다. 연구가 필요합니다.

마지막으로, 이것은 EC2를 위해 만들어진 것들입니다. 16G가 필요한 것 같습니다. m4.4xlarge에는 시간당 $ 0.958에서 64G 램이 있습니다. 컵 커피보다 적습니다. juju charm 또는 이와 유사한 것을 사용하여 matlab 설치를 스크립팅하고 전체를 서비스로 계산하십시오.

16G 16GB입니까?

  • 예, 일반적으로 접미사를 제외하면 바이트 단위의 base2 숫자를 의미합니다. 간결하게하려면 16GiB를 작성하십시오.

"100GB보다 큰 매트릭스가 필요합니다. EC2로 수행 할 수 있는지 모르겠습니다."

캐시를 삭제해야합니까 echo 3 > /proc/sys/vm/drop_caches?

  • 예, 항상 그렇게하는 것이 아프지 않습니다. Linux 커널의 Documentation / sysctl / vm.txt를 참조하십시오.

Matlab을 메모리에 어떻게 고정시킬 수 있습니까?

  • man mlock. 나는 그것을 인용했을 때 바보가되었지만. 이 호출은 원하는 모든 메모리를 할당하고 스왑 아웃되지 않도록 유지하며 가상 메모리를 사용하지 않습니다. 그것은 당신이 원하는 것이 아닙니다.

C API를 Matlab에 바인딩 할 수 있다고 생각합니다. -프로세스에 오류가있는 경우 스왑을 해제 할 생각이 있습니까?

  • 솔직히 말하면, 제안한 방식으로 스왑 파일을 미세 관리한다는 개념은 말도 안됩니다. 운영 체제의 업무는 리소스를 관리하고 공정하고 일관된 방식으로 리소스를 배포하는 것입니다. 더 많은 자원을 제공하면 적합하다고 생각되는대로 사용할 것입니다. 완료되면 알려주지 않고 그 아래에서 리소스를 빼 내면 OS가 완료되면 알려줍니다.

OS에 메모리 주소 공간을 요청할 때 가끔 성공하지는 않습니다. 다시 시도 할 수 없다는 의미는 아닙니다. matlab이 malloc을 두 번 호출 할 수 없다는 것은 matlab의 문제입니다.

따라서 100G의 공간이 실제로 프리미엄 이라면 원하는 변경에 영향을 미칩니다. 인 경우 운영 체제에 메모리 공간을 자르도록 (시작 용 캐시를 비워서) 메모리 관리자가하지 않도록 지시하는 방법을 알아야합니다 제공된 추가 스왑 공간을 사용해야 할 필요성을 느끼십시오. 그런 다음에 만 메모리 관리자에게 스왑 파일을 해제하도록 요청할 수 있습니다.

메모리 및 디스크와 같은 것을 쉽게 확장 할 수 있으며 축소하기가 훨씬 어렵습니다. 축소는 해당 공간에 리소스가 할당 된 모든 사용자의 재조정을 강제합니다. 대신 "100TB 스토리지 배열이 있지만 60TB 만 필요하면 40TB의 디스크를 제거 할 때 배열이 작동하지 않는 이유는 무엇입니까?" 대답은 분명할까요?

내가 볼 수있는 옵션은 다음과 같습니다.

  1. matlab C API를 조사하여 이러한 대규모 작업 세트에 메모리가 할당되는 방식을보다 잘 제어 할 수 있는지 확인하십시오.

  2. 하위 행렬 또는 다른 희소 데이터 표현을 사용하여 현재 계산 한 것을 계산하기 위해 계산을 리팩터링하십시오.

  3. 계산을 수행하고 필요한 주소 공간을 할당하기 위해 익명을 사용 malloc하거나 무수한 선형 대수 라이브러리를 사용하여 C / C ++로 자신의 프로그램을 작성하십시오 mmap.


예, 그러나 충분하지 않을 수 있으며 성공하기 전에 기다렸다가 다시 시도해야 할 수도 있습니다.
ppetraki

1
허, 귀하의 나머지 의견은 스마트 폰에 나타나지 않았습니다. 대신 에코를 sudo 할 수 없습니다. echo 3 | sudo tee /proc/sys/vm/drop_caches
ppetraki

이 답변은 올바른 의미를 갖기 때문에이 답변을 수락합니다. 환경 설정과 동일한 스크립트에서 클라이언트를 실행하면 오류가 발생하기 쉽습니다. 여기에 대한 더 많은 논의 unix.stackexchange.com/a/298543/16920-- 몸을 조금만 닦으면 좋을 것입니다.
Léo Léopold Hertz 준영

12

소프트웨어 스왑을 전용으로 사용할 수 없습니다. 스왑을 생성하고 MATLAB을 시작하고 MATLAB이 종료 될 때 스왑을 삭제하는 셸 스크립트를 만들 수 있습니다.

다음은 / tmp 디렉토리에 10Mb의 스왑을 생성하고 마운트하고 R을 시작하고 (matlab이 없음) R이 종료 될 때까지 기다렸다가 스왑 파일을 마운트 해제하고 삭제하는 예제 스크립트입니다.

참고 :-루트가 스왑 파일을 소유하지 않기 때문에 경고가 표시됩니다. 시스템이 어떤 소프트웨어에 대해서도 실행하지 않을 수도 있고이 파일을 읽을 수 있기 때문에이 파일을 읽을 수 있기 때문입니다. -[ctrl]-[c] 스크립트 또는 로그 오프 등을 수행하면 스왑이 마운트 된 상태로 유지됩니다. 나도 고쳐 줄게

#!/usr/bin/env bash

SWAP_FILE=/tmp/my_swap_file
SIZE_MB=10
TO_RUN="R"

dd if=/dev/zero of=${SWAP_FILE} bs=1M count=${SIZE_MB}
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
sudo swapon -v ${SWAP_FILE}
echo "Swap enabled. Press enter to continue"; read
${TO_RUN}
echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v ${SWAP_FILE}
rm -vf ${SWAP_FILE}

1
음, 그것은 실제로 MATLAB에 전념하는 것이 아니라 일시적으로 더 많은 RAM이 필요한 상황에 적합합니다. swapon / swapoff는 루트 권한이 필요합니다 (그래서 sudo)
Michael Hooreman

1
네 당신이 그랬어요. 그것이 뿌리가되는 방법입니다.
Michael Hooreman

좋은 대답입니다. 나는 개인적으로 이것에 접근하고 메모리가 소모 될 때 멋진 순간을 위해 내 자신의 add-swap.sh 스크립트를 유지합니다
Sergiy Kolodyazhnyy

나는 그것이 올바른 길을 만들었 기 때문에 현상금을 수여했습니다. 그러나 오류 관리가 매우 어렵고 불완전하기 때문에 대답을 수락 할 수 없습니다. Matlab을 실행하는 것과 별도로 스왑을 설정하는 것이 가장 좋습니다. 여기에서 답변을 참조하십시오 unix.stackexchange.com/a/298543/16920
Léo Léopold Hertz 준영

1

다음은 외장 하드 드라이브를 사용하여 SWAP 메모리를 확장하는 방법입니다 .

  • 먼저 다음을 실행하여 실제 SWAP 메모리를 기록하십시오.

    free -m
    
  • 둘째, HDD 폴더를 준비하십시오. 다음과 같아야 /media/myhdd합니다.

  • 추가하려는 추가 SWAP의 크기를 결정하십시오. X GB 라고 가정 해 봅시다 .
  • 수량이 바이트의 양을 계산하십시오. GB를 사용하면 Y = X * 1024 ^ 3입니다 . 여기서 Y 는 계산 결과입니다.
  • 파일의 블록 크기를 선택하십시오 (바이트 단위). 여기에서 기본값을 사용합시다 : 4096 ( 여기 에 대한 자세한 내용은 여기 참조 ).
  • 파일의 블록 수를 계산하십시오. Z = Y / 4096
  • 크기의 파일을 만듭니다 X 터미널에서 다음 명령을 사용하여 GB를 :

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • 다음을 사용하여 파일에 SWAP을 작성하십시오.

    sudo mkswap /media/myhdd/swapfile -f
    
  • 마지막으로 SWAP을 활성화하십시오.

    sudo swapon -p 1000 /media/myhdd/swapfile
    

이제 SWAP이 증가했습니다. 로 다시 확인free -m


우리는 이것을 비 대화식 스크립트 ( sudo전원 필요)로 설정할 수 있습니다 :

#!/bin/bash

### Inputs ###

swap_GB=$(expr 1) # Enter here size of the swap memory to create, in GB.
swap_bs=$(expr 4096) # Enter here block size, in bytes (must be a multiple of 8).
HDD_folder="/media/myhdd/" # Enter absolute path of HDD inside the brackets.

### Swap creation ###

swap_size=$(expr $swap_GB \* 1024 \* 1024 \* 1024 / $swap_bs)
dd if=/dev/zero of=${HDD_folder}"/swapfile" bs=$swap_bs count=$swap_size
mkswap ${HDD_folder}"/swapfile" -f
swapon -p 1000 ${HDD_folder}"/swapfile"

### EOF ###

추신 : 가능한 경우 최적화 / 수정하십시오. 말했듯이, 그것은 내 첫 번째 스크립트입니다 :)


글쎄, 스왑은 이미 느리지 만 USB 드라이브에 스왑이 있다고 상상할 수 없습니다. 지옥 IMHO처럼 느려질 것입니다
Michael Hooreman

요약으로 스크립트가 좋을 것입니다.
Léo Léopold Hertz 준영

1
나는 스크립트를 만든 적이 없지만 그것을 줄 것이다.

1

최소한 압축 RAM (zram 커널 모듈, 커널 버전 3.14부터 사용 가능)이 얼마나 잘 수행되는지 테스트합니다.

archlinux wiki 지시 사항 따르기

modprobe zram
echo lz4 > /sys/block/zram0/comp_algorithm
echo 4G > /sys/block/zram0/disksize
mkswap --label zram0 /dev/zram0
swapon --priority 100 /dev/zram0

압축 된 RAM은 디스크 I / O보다 빠르다고 생각합니다.

다시 시작한 후에도 변경 사항을 유지하려면 부팅 시간 명령을 /etc/rc.local넣고 실행하십시오 sudo systemctl enable rc-local.service.


메모리 크기와 페이징 속도에 대한 zram의 영향을 위해 스레드 unix.stackexchange.com/q/297752/16920에 대한 답변을 확장했습니다 . 메모리 크기, 아마도 대부분 페이징에 영향을 미치지 않습니다. 그러나 rund에 따라 systemd / ... 경고가 증가했습니다. zram의 오류율에 대해 아는 것이 좋습니다.
Léo Léopold Hertz 준영

zram0의 경우 orig_data_sizecompr_data_size 파일의 / sys / block / zram0 에 사용 가능한 일부 통계가 있습니다 . 나는 많은 데이터를 교환하지 않았지만 거기에 대한 비율은 약 0.35입니다. 이 비율로 11GB의 데이터는 4GB의 RAM에 맞을 수 있습니다. 이는 7GB의 데이터가 디스크로 스왑되지 않았 음을 의미 할 수 있습니다.
JJ Hakala

1
부팅 시간 명령을 /etc/rc.local에 배치 한 다음sudo systemctl enable rc-local.service
JJ Hakala

나는 zramHDD / SSD의 스왑에 적용 할 수 없다는 것을 알았 으므로 zram여기에 해당하지 않습니다. 스레드 askubuntu.com/a/472227/25388
Léo Léopold Hertz 준영

1

zswapHDD / SSD에 스왑 부분이있는 경우 사용하십시오 . 이 모듈 zram은 HDD / SSD에 스왑 부분이 없으므로 Hakala의 답변은 해당되지 않습니다. 설명을 위해 스레드 zram vs zswap vs zcache Ultimate 안내서를 참조하십시오 . Ubuntu 16.04에서 Matlab 계산을 위해 Zswap을 성공적으로 활성화하는 방법zswap 스레드에 설명 된 설정 ?

  • 해당 줄을 다음 줄로 바꿉니다. /etc/default/grub

    # https://wiki.archlinux.org/index.php/Zswap
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash zswap.enabled=1 zswap.max_pool_percent=25 zswap.compressor=lzo"
    
  • 를 실행하십시오 sudo update-grub.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.