최근에 이상한 문제가 발생했습니다.
때로는(의도적으로 재현할 수 없음) 사용 가능한 RAM이 충분함에도 불구하고 시스템이 스왑 공간을 모두 사용하는 경우가 있습니다. 이런 일이 발생하면 시스템은 몇 분 동안 응답하지 않게 되고 OOM 킬러는 별로 도움이 되지 않는 "무작위" 프로세스를 종료하거나 X 서버를 종료합니다. "무작위" 프로세스를 종료하면 시스템은 응답하지 않습니다(여전히 스왑 공간은 없지만 여유 RAM이 많음). X를 종료하면 스왑 영역이 해제되고 시스템이 다시 응답하게 됩니다.
free 발생 시 출력:
$ free -htl
total used free shared buff/cache available
Mem: 7.6G 1.4G 60M 5.7G 6.1G 257M
Low: 7.6G 7.5G 60M
High: 0B 0B 0B
Swap: 3.9G 3.9G 0B
Total: 11G 5.4G 60M
이름-a:
Linux fedora 4.4.7-300.fc23.x86_64 #1 SMP Wed Apr 13 02:52:52 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
교환성:
cat /proc/sys/vm/swappiness
5
dmesg의 관련 섹션:http://pastebin.com/0P0TLfsC
임시 파일 시스템:
$ df -h -t tmpfs
Filesystem Size Used Avail Use% Mounted on
tmpfs 3.8G 1.5M 3.8G 1% /dev/shm
tmpfs 3.8G 1.7M 3.8G 1% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
tmpfs 3.8G 452K 3.8G 1% /tmp
tmpfs 776M 16K 776M 1% /run/user/42
tmpfs 776M 32K 776M 1% /run/user/1000
메모리 정보: http://pastebin.com/CRmitCiJ
상단 -o SHR -n 1 미션: 총 231개, 달리기 1개, 수면 230개, 정지 0개, 좀비 0개 %Cpu(들): 8.5 us, 3.0 sy, 0.3 ni, 86.9 id, 1.3 wa, 0.0 hi, 0.0 si, 0.0 st KiB 메모리: 총 7943020개, 무료 485368개, 사용됨 971096개, 버프/캐시 6486556개 교환된 KiB: 총 4095996개, 무료 1698992개, 사용된 2397004개. 989768 사용 가능한 메모리 PID 사용자 PR NI VIRT RES SHR S %CPU %MEM TIME+ 명령 2066 mkamlei+ 20 0 8342764 163908 145208 S 0.0 2.1 0:59.62 Xorg 2306 mkamlei+ 20 0 1892816 138536 27168 S 0.0 1.7 1:25.47 노움 껍데기 3118 mkamlei+ 20 0 596392 21084 13152 S 0.0 0.3 0:04.86 그놈 터미널 - 1646 gdm 20 0 1502632 60324 12976 S 0.0 0.8 0:01.91 그놈 쉘 2269 mkamlei+ 20 0 1322592 22440 8124 S 0.0 0.3 0:00.87 그놈 설정- 486 루트 20 0 47048 8352 7656 S 0.0 0.1 0:00.80 시스템 로그 2277 메캄레+ 9 -11 570512 10080 6644 S 0.0 0.1 0:15.33 2581 mkamlei+ 20 0 525424 19272 5796 S 0.0 0.2 0:00.37 적색편이 gtk 1036 루트 20 0 619016 9204 5408 S 0.0 0.1 0:01.70 네트워크 관리자 1599 gdm 20 0 1035672 11820 5120 S 0.0 0.1 0:00.28 gnome-setup- 2386 mkamlei+ 20 0 850856 24948 4944 S 0.0 0.3 0:05.84 고아 데몬 2597 mkamlei+ 20 0 1138200 13104 4596 S 0.0 0.2 0:00.28 진화 경보 2369 mkamlei+ 20 0 1133908 16472 4560 S 0.0 0.2 0:00.49 진화 소스 2529 mkamlei+ 20 0 780088 54080 4380 S 0.0 0.7 0:01.14 그놈 소프트웨어 2821 mkamlei+ 20 0 1357820 44320 4308 S 0.0 0.6 0:00.23 진화력 2588 mkamlei+ 20 0 1671848 55744 4300 S 0.0 0.7 0:00.49 진화력 2525 mkamlei+ 20 0 613512 8928 4188 S 0.0 0.1 0:00.19 abrt 애플릿
IPC:
[mkamleithner@fedora ~]$ ipcs -m -t ------공유 메모리 연결/분리/변경 시간------- shmid 소유자 추가 분리가 변경됨 294912 mkamleithn 4월 30일 20:29:16 설정되지 않음 4월 30일 20:29:16 393217 mkamleithn 4월 30일 20:29:19 4월 30일 20:29:19 4월 30일 20:29:17 491522 mkamleithn 4월 30일 20:42:21 4월 30일 20:42:21 4월 30일 20:29:18 524291 mkamleithn 4월 30일, 20:38:10 4월 30일, 20:38:10 4월 30일, 20:29:18 786436 mkamleithn 4월 30일 20:38:12 설정되지 않음 4월 30일 20:38:12 [mkamleithner@fedora ~]$ ipcs ------ 메시지 대기열--------- 주요 msqid 소유자 권한은 바이트 메시지를 사용했습니다. ------공유 메모리 세그먼트--------- 키 shmid 소유자 권한 바이트 nattch 상태 0x00000000 294912 mkamleithn 600 524288 2 대상 0x00000000 393217 mkamleithn 600 2576 2 목적지 0x00000000 491522 mkamleithn 600 4194304 2 대상 0x00000000 524291 mkamleithn 600 524288 목적지 2개 0x00000000 786436 mkamleithn 600 4194304 2 대상 ------세마포어 배열-------- 주요 semid 소유자 권한 nsems
[mkamleithner@fedora ~]$ ipcs -m -t ------공유 메모리 연결/분리/변경 시간------- shmid 소유자 추가 분리가 변경됨 294912 mkamleithn 4월 30일 20:29:16 설정되지 않음 4월 30일 20:29:16 393217 mkamleithn 4월 30일 20:29:19 4월 30일 20:29:19 4월 30일 20:29:17 491522 mkamleithn 4월 30일 20:42:21 4월 30일 20:42:21 4월 30일 20:29:18 524291 mkamleithn 4월 30일, 20:38:10 4월 30일, 20:38:10 4월 30일, 20:29:18 786436 mkamleithn 4월 30일 20:38:12 설정되지 않음 4월 30일 20:38:12
[mkamleithner@fedora ~]$ sudo grep 786436 /proc/*/maps /proc/2084/maps:7ff4a56cc000-7ff4a5acc000 rw-s 00000000 00:05 786436 /SYSV00000000 (삭제됨) /proc/3984/maps:7f4574d00000-7f4575100000 rw-s 00000000 00:05 786436 /SYSV00000000 (삭제됨)
[mkamleithner@fedora ~]$ sudo grep 524291 /proc/*/maps /proc/2084/maps:7ff4a4593000-7ff4a4613000 rw-s 00000000 00:05 524291 /SYSV00000000 (삭제됨) /proc/2321/maps:7fa9b8a67000-7fa9b8ae7000 rw-s 00000000 00:05 524291 /SYSV00000000 (삭제됨)
[mkamleithner@fedora ~]$ sudo grep 491522 /proc/*/maps /proc/2084/maps:7ff4a4ad3000-7ff4a4ed3000 rw-s 00000000 00:05 491522 /SYSV00000000 (삭제됨) /proc/2816/maps:7f2763ba1000-7f2763fa1000 rw-s 00000000 00:05 491522 /SYSV00000000 (삭제됨)
[mkamleithner@fedora ~]$ sudo grep 393217 /proc/*/maps /proc/2084/maps:7ff4b1a60000-7ff4b1a61000 rw-s 00000000 00:05 393217 /SYSV00000000 (삭제됨) /proc/2631/maps:7fb89be79000-7fb89be7a000 rw-s 00000000 00:05 393217 /SYSV00000000 (삭제됨)
[mkamleithner@fedora ~]$ sudo grep 294912 /proc/*/maps /proc/2084/maps:7ff4a5510000-7ff4a5590000 rw-s 00000000 00:05 294912 /SYSV00000000 (삭제됨) /proc/2582/maps:7f7902dd3000-7f7902e53000 rw-s 00000000 00:05 294912 /SYSV00000000 (삭제됨)
프로세스 이름을 얻으십시오:
[mkamleithner@fedora ~]$ ps aux |쿼리 2084 mkamlei+ 2084 5.1 2.0 8149580 159272 tty2 Sl+ 20:29 1:10 /usr/libexec/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -nolisten tcp -Background none -noreset -keeptty - verbose 3 mkamlei+ 5261 0.0 0.0 118476 2208 포인트/0 S+ 20:52 0:00 grep --color=auto 2084 [mkamleithner@fedora ~]$ ps aux grep 3984 | mkamlei+ 3984 11.4 3.6 1355100 293240 tty2 Sl+ 20:38 1:38 /usr/lib64/firefox/firefox mkamlei+ 5297 0.0 0.0 118472 2232 포인트/0 S+ 20:52 0:00 grep --color=auto 3984
결과를 게시해야 하는 다른 shmid가 있습니까? 출력을 해석하는 방법을 잘 모르겠습니다.
이 문제를 어떻게 해결할 수 있나요?
편집: "파일을 생성해 주세요" 게임을 시작하면 항상 잠시 후 이 문제가 발생하는 것 같습니다. 하지만 게임이 시작되지 않았을 때 이런 일이 가끔 발생합니다.
Edit2: X 문제인 것 같습니다. Wayland에서는 이런 일이 발생하지 않습니다. 아마도 xorg.conf의 사용자 정의 설정 때문일 것입니다.
최종 편집: 같은 문제가 발생하는 사람을 위해: 저는 DRI 2를 사용하고 있습니다. DRI 3으로 전환하면 문제가 해결될 수도 있습니다. 내 xorg.conf의 관련 부분은 다음과 같습니다.
'장치' 섹션 식별자 "인텔 그래픽" 드라이버 "인텔" 옵션 "AccelMethod" "sna"# 옵션 "백라이트" "intel_backlight" 버스 ID "PCI:0:2:0" 옵션 "DRI" "3" #여기 옵션 "TearFree" "true" 끝 부분
내 시스템의 관련 파일은 /usr/share/X11/xorg.conf.d/에 있습니다.
답변1
tmpfs에서 사용하는 공유 메모리(주로)(/proc/meminfo의 Shmem, 커널 2.6.32에서 사용 가능, 사용 가능하지 않은 경우 0) >
따라서 맨페이지 정의는 Shared
예상만큼 도움이 되지 않습니다. :(. tmpfs가 실제로 사용하는 경우아니요Shared에 대한 높은 값을 반영하려면 해당 값은 MAP_SHARED|MAP_ANONYMOUS(또는 System V 공유 메모리)로 mmap()한 프로세스를 나타내야 합니다.
8G 시스템의 6G 공유 메모리는 여전히많은. 진지하게, 적어도 데스크탑에서는 원하지 않습니다.
이상하게도 "버프/캐시"에도 도움이 되는 것 같습니다. 하지만 저는 Python으로 간단한 테스트를 해보았는데 이것이 작동하는 방식입니다.
공유 메모리가 가장 많은 프로세스를 표시하려면 를 사용하십시오 top -o SHR -n 1
.
시스템 V 공유 메모리
마지막으로 System V 공유 메모리 세그먼트를 사용하는 끔찍한 레거시 소프트웨어가 있을 수 있습니다. 만약 그들이 얻는다면방법을 제공, 그들은 나타나지 않습니다 top
:(.
를 사용하여 나열할 수 있습니다 ipcs -m -t
. 가장 최근에 생성된 것이 여전히 사용되고 있기를 바랍니다. 예를 들어 shmid 번호를 가져옵니다.
$ ipcs -m -t
------ Shared Memory Attach/Detach/Change Times --------
shmid owner attached detached changed
3538944 alan Apr 30 20:35:15 Apr 30 20:35:15 Apr 30 16:07:41
3145729 alan Apr 30 20:35:15 Apr 30 20:35:15 Apr 30 15:04:09
4587522 alan Apr 30 20:37:38 Not set Apr 30 20:37:38
# sudo grep 4587522 /proc/*/maps
-> 그러면 /proc 경로에 표시되는 숫자는 SHM을 사용하는 프로세스의 pid입니다. (따라서 ps의 출력을 grep하여 pid 번호를 찾을 수 있습니다.)
명백한 모순
Xorg에는 8G 매핑이 있습니다. 전용 그래픽 카드 RAM이 없더라도 마찬가지입니다. 주민 수는 1억 5천만명에 불과합니다. 스왑 공간이 부족해서 나머지를 교체하는 것과는 다릅니다.
표시된 SHM 세그먼트는
ipcs
모두 두 프로세스에 모두 연결되어 있습니다. 따라서 그 중 어느 것도 유출되지 않았으며 모두 SHR 열top
(짝수)에 표시되어야 합니다. 사용된 페이지 수가 메모리 세그먼트의 크기보다 작더라도 상관없습니다. 이는 단지 사용되지 않는 페이지가 있다는 의미일 뿐입니다. 하지만free
우리가 점유해야 하는 6GB의 할당된 공유 메모리가 있지만 찾을 수 없다고 가정해 보겠습니다.
답변2
shared
tmpfs에서 사용하는 메모리(주로)(/proc/meminfo의 Shmem, 커널 2.6.32에서 사용 가능, 사용 가능하지 않은 경우 0)
tmpfs는 교체 가능합니다. tmpfs 파일 시스템이 안전 한도를 초과하여 채워졌습니다. 비교를 위해 제가 이 글을 쓰고 있는 시스템에는 200M의 공유 공간이 있습니다. 6G는 데스크톱을 실행하고 Dropbox 및 Steam과 같은 것도 실행할 수 있는 8G 시스템에 비해 너무 많습니다.
일반 도구를 사용하여 문제를 일으키는 파일을 찾을 수 있습니다. 이론적으로는 X 세션이 종료되면 이러한 파일이 사라질 수 있습니다.
$ df -h -t tmpfs
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.9G 1.7M 1.9G 1% /dev/shm
tmpfs 1.9G 1.6M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 1.9G 80K 1.9G 1% /tmp
tmpfs 376M 20K 376M 1% /run/user/42
tmpfs 376M 20K 376M 1% /run/user/1000
문제를 해결하고 분석할 기회를 얻고 문제를 채우는 소프트웨어에서 유용한 오류 메시지를 트리거할 수도 있도록 tmpfs 마운트를 제한하십시오.
기본적으로 각 tmpfs는 사용 가능한 RAM의 1/2로 제한됩니다.
따라서 기본 제한 미만으로 여러 tmpfs 마운트를 추가하지 않는 것이 가장 좋습니다. 위에서 볼 수 있듯이 배포판은 내 4GB 시스템과 관련하여 그다지 좋지 않습니다.
확실히제한은 런타임 시 변경될 수 있습니다 mount -oremount,size=10% /tmp
.
예를 들어 시작 시 실행되는 위치에 다시 설치 명령을 넣을 수 있습니다 /etc/rc.local
(필요할 수 있음 systemctl enable rc-local
). /run/user/*
이는 스크립트가 실행된 후에 설치될 수 있습니다. 적절한 제한이 있기를 바랍니다 .
기본 tmpfs 설치는 /etc/fstab
. systemd에서는 다음을 사용하여 /tmp
마운트를 수정할 수 있습니다 . systemctl edit tmp.mount
그렇지 않으면 시스템 스크립트를 grep하여 /tmp가 마운트된 위치를 찾을 수 있으며 편집할 수 있는 구성 파일을 사용할 수도 있습니다. 또 다른 유효한 옵션 /tmp
은 tmpfs 마운트를 완전히 비활성화하고( systemctl disable tmp.mount
) 프로그램이 루트 파일 시스템에만 쓸 수 있도록 하는 것입니다.