프린트 하기

OS환경 : Oracle Linux 8.1 (64bit)

 

방법 :  Oracle Linux 8 더미 파일 대량 생성 및 대량 삭제

오라클 audit 파일을 지울때 양이 너무 많아서 Argument list too long 에러가 발생하는 경우가 있음

이 경우를 재현하기 위해서 대량으로 생성하는 스크립트를 실행하고 지우는 명령까지 테스트 해봄

 

 

더미 파일 생성용 스크립트 생성(1억개 파일 생성)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ vi create_dumy.sh
#!/bin/bash
 
# 동시 실행할 세션의 수
session_count=100
 
# PL/SQL 스크립트 파일 경로
 
for k in $(seq 1 $session_count)
do
   seq 1 10000 | xargs -n 1 -I {} touch /home/oracle/test/too_long_arg/tempfile_${k}_{}.aud &
done
 
wait
echo "Done."

 

 

권한 부여

1
$ chmod u+x create_dumy.sh

 

 

실행

1
$ sh create_dumy.sh

 

 

실행 중 에러 발생시

1
2
3
4
5
6
7
8
touch: cannot touch '/home/oracle/test/too_long_arg/tempfile_71_35260.aud': No space left on device
touch: cannot touch '/home/oracle/test/too_long_arg/tempfile_26_33134.aud': No space left on device
touch: cannot touch '/home/oracle/test/too_long_arg/tempfile_51_34507.aud': No space left on device
touch: cannot touch '/home/oracle/test/too_long_arg/tempfile_97_33201.aud': No space left on device
touch: cannot touch '/home/oracle/test/too_long_arg/tempfile_41_34698.aud': No space left on device
touch: cannot touch '/home/oracle/test/too_long_arg/tempfile_90_35590.aud': No space left on device
touch: cannot touch '/home/oracle/test/too_long_arg/tempfile_67_32829.aud': No space left on device
touch: cannot touch '/home/oracle/test/too_long_arg/tempfile_9_35411.aud':

 

 

top 명령으로 프로세스 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
$ top
top - 16:04:03 up 28 days,  5:46,  3 users,  load average: 104.34, 98.24, 63.23
Tasks: 603 total, 103 running, 496 sleeping,   0 stopped,   4 zombie
%Cpu(s): 29.4 us, 68.5 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.8 hi,  1.2 si,  0.0 st
MiB Mem :   7961.4 total,    149.3 free,   3571.0 used,   4241.1 buff/cache
MiB Swap:   3908.0 total,   3146.9 free,    761.0 used.   2888.6 avail Mem
 
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
29160 oracle    20   0 1480324 784452   1992 R  79.4   9.6   0:05.77 ls
30112 oracle    20   0    7716   1856   1736 S   0.3   0.0   0:02.51 xargs
30122 oracle    20   0    7716   1776   1656 S   0.3   0.0   0:02.57 xargs
30124 oracle    20   0    7716   1772   1652 S   0.3   0.0   0:02.41 xargs
30126 oracle    20   0    7716   1768   1648 R   0.3   0.0   0:02.48 xargs

 

 

pkill xargs 명령으로 xargs 명령을 사용중인 모든 세션 kill

1
$ pkill xargs

 

 

이후 os 용량확보(지울수 있는 파일 지우기)

 

 

파일시스템 용량 확인

1
2
3
4
5
6
7
8
9
10
11
$ df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             3.9G     0  3.9G   0% /dev
tmpfs                3.9G  1.5G  2.5G  39% /dev/shm
tmpfs                3.9G   26M  3.9G   1% /run
tmpfs                3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/ol-root   46G   45G  873M  99% /
/dev/sdb1             60G   46G   15G  76% /oradata1
/dev/sda1            471M  150M  322M  32% /boot
tmpfs                797M  1.2M  795M   1% /run/user/42
tmpfs                797M     0  797M   0% /run/user/0

root(/) 파일시스템이 99% 까지 참

 

 

생성된 파일 갯수 확인

1
2
$ ls | wc -l
3323884

300만개 정도 생성됨

 

 

파일 목록 확인

1
2
$ ls
^C(너무 오래 걸려서 취소)

 

 

목록을 신규파일로 넣어 확인

1
$ ls > file_list.txt

 

 

파일 목록 확인

1
2
3
4
5
6
7
8
9
10
11
$ more file_list.txt
create_dumy.sh
file_list.txt
tempfile_100_10000.aud
tempfile_100_10001.aud
tempfile_100_10002.aud
tempfile_100_10011.aud
tempfile_100_10012.aud
tempfile_100_10013.aud
.
.

 

 

rm 명령으로 파일 전체 삭제

1
2
$ rm ./tempfile_*.aud
-bash: /usr/bin/rm: Argument list too long

너무 많아서 에러가 발생함

 

 

find 명령으로 나눠서 삭제

1
2
3
4
$ find . -name '*.aud' -exec rm {} \;
 
(최근 기간만큼의 파일을 남길예정이라면 아래 명령 수행)
$ find . -name '*.aud' -mtime +30 -exec rm {} \;

 

 

21분 경과 후 오래걸려서 취소 후 파일 갯수 확인

1
2
$ ls | wc -l
2452558

100만개 정도 지워지고 200만개 정도 남음

 

 

find + delete 명령 수행

1
2
3
4
5
$ time find . -maxdepth 1 -name '*.aud' -delete
 
real    0m28.967s
user    0m1.512s
sys     0m26.120s

단 26초만에 다 지워짐

 

 

파일 갯수 확인

1
2
$ ls | wc -l
3

*.aud 파일이 다지워지고 다른 파일들만 남음

 

 

결론 : 

find 명령에서 rm을 사용하는것 보다 작업속도 측면에서는 delete 구문을 사용하는것이 좋을듯함

하지만 많이 써보지 않은 명령어라 기존에 사용하던 방식을 쓰는게 마음이 편하긴함

 

 

find + delete 명령이 빠른이유 by GPT
find 명령어를 사용할 때 -exec rm {} \;와 -delete 옵션 사이에 속도 차이가 발생하는 주된 이유는 두 방법이 파일을 삭제하는 방식의 차이에서 비롯됩니다.
-exec rm {} \; 사용 시
-exec rm {} \; 옵션을 사용하면 `find` 명령어는 찾은 각 파일마다 rm 명령어를 개별적으로 실행합니다. 이 방식은 다음과 같은 단계를 거칩니다:
1. find가 파일 시스템을 검색해 조건에 맞는 파일을 찾습니다.
2. 찾은 각 파일마다 rm 명령을 새로운 프로세스로 실행합니다 (-exec).
3. rm 명령이 파일을 삭제하고 종료됩니다.
4. 다음 파일에 대해 2~3단계를 반복합니다.
이 과정에서 매번 새로운 프로세스를 생성하고 종료하는 데에 상당한 오버헤드가 발생합니다. 특히 파일의 수가 많을 경우 이 오버헤드는 전체 작업 시간에 큰 비중을 차지하게 됩니다. 
따라서 3백만 개의 파일을 삭제하는 데 상당한 시간이 소요됩니다.

-delete 사용 시
-delete 옵션을 사용하면 find 명령어는 내부적으로 파일을 직접 삭제합니다. 이 방식은 다음과 같은 이점을 제공합니다:
1. 별도의 프로세스를 생성하지 않고 `find` 프로세스 내에서 파일을 바로 삭제합니다.
2. 파일 시스템을 검색하면서 조건에 맞는 파일을 찾은 직후에 즉시 삭제 처리를 합니다.
-delete 옵션이 -exec rm {} \;보다 훨씬 효율적인 이유는 파일 삭제 작업을 find 명령어가 직접 처리하기 때문에, 별도의 프로세스를 생성하고 통신하는 데 드는 오버헤드가 없기 때문입니다. 
결과적으로, 동일한 작업을 훨씬 빠르게 수행할 수 있습니다.

gpt 결론
find . -maxdepth 1 -name '*.aud' -delete 명령어가 find . -name '*.aud' -exec rm {} \; 명령어보다 빠른 이유는 -delete 옵션이 파일 삭제 작업을 더 효율적으로 처리하기 때문입니다. 
-delete는 별도의 프로세스 호출 없이 find 프로세스 내에서 파일을 직접 삭제하므로, 많은 수의 파일을 처리할 때 훨씬 더 빠른 속도를 제공합니다.

 

 

참조 : 

https://positivemh.tistory.com/553

 

-bash: /bin/rm: Argument list too long

OS환경 : Oracle Linux 7.4 (64bit) DB 환경 : Oracle Database 19.3.0.0 에러 : -bash: /bin/rm: Argument list too long asm 환경의 싱글 db 사용 중 asm audit 로그가 많이 쌓여 삭제하려던 중 발생한 메세지 1 2 3 $ cd /oracle/app/19.

positivemh.tistory.com


https://positivemh.tistory.com/554

 

ASM audit file 증가 현상

OS환경 : Oracle Linux 7.4 (64bit) DB 환경 : Oracle Database 19.3.0.0 에러 : ASM audit file 증가 현상 /oracle 파일시스템 full 로 인해 db 접속 불가 현상이 발생하여 원인을 찾던 중 1 2 3 4 5 6 7 8 9 10 $ df -h Filesystem Size

positivemh.tistory.com

https://iambeginnerdeveloper.tistory.com/197