내맘대로긍정이 알려주는
Oracle 23ai 신기능
무료 세미나 발표자료
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
https://positivemh.tistory.com/554
https://iambeginnerdeveloper.tistory.com/197
'Linux, Unix > Tip' 카테고리의 다른 글
Oracle Linux 8 프로세스 강제 종료 스크립트 (0) | 2024.04.19 |
---|---|
Oracle Linux 6 서버 cpu, memory 사용량 확인 (0) | 2023.09.06 |
Oracle Linux 7 특정 날짜에 생성(수정)된 파일 개수 확인 (0) | 2023.07.05 |
Oracle Linux 7 cpu 나 memory 많이 사용하는 프로세스 찾기 (0) | 2023.02.12 |
Oracle Linux 4 새로넣은 디스크 mount 시키기 (0) | 2021.07.19 |