일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 프로그래머스
- 디자인패턴
- 백준
- Eclipse
- JavaScript
- lambda calculus
- DesignPattern
- 스택
- exception
- Java
- Python
- JDBC
- 큐
- 자바
- 로버트마틴
- 파이썬
- Spring
- Rails
- tcp
- 함수형 프로그래밍
- design-pattern
- javscript
- 겨울카카오인턴
- solid
- 람다 칼큘러스
- Collections
- Network
- Pattern
- Collection
- functional programming
- Today
- Total
개발자 노트
메모리 문제해결(2) - python shell script 본문
python busy waiting 줄이기
개요
cached memory를 확인하여 삭제해주는 프로그램 만드려 한다. 이를 위해 프로그램이 항시 작동하여 cached memory를 계속 확인해줘야 한다. 이때, 잘못 작성하면 busy waiting이 발생하기 쉬우므로 python에서 프로세스를 어떻게 waitng 상태로 놓는지, 또는 어떻게 깨우는지에 대해 관련 자료를 찾고, 프로그램을 작성하려 한다.
초기에 shell 명령어를 이용하여 프로그램을 작성하려 했으나, 문자열 파싱 부분이 까다로워 python을 이용하기로 했다.
참고자료
1. python busy waiting 설명
출처 : https://blog.miguelgrinberg.com/post/how-to-make-python-wait
참고한 내용
쓰레드단위로 설명해주어 더욱 low level?로 busy waiting을 조정할 수 있다. 하지만,
내 경우엔 main thread만으로 time sleep을 해도 문제 없을 듯하다. cached memory를 parsing하여 값을 얻은 뒤에 일정 수치를 넘었는지 확인하는 작업은 같이 시도해줘야할 하나의 단위이기 때문. cached memory는 시간마다 값이 변하기 때문에 바로 값을 체크해줘야 한다.
2.thread 모듈 설명
출처 : http://pythonstudy.xyz/python/article/24-%EC%93%B0%EB%A0%88%EB%93%9C-Thread
참고한 내용
위 출처에서 thread 모듈을 이용했기 때문에 해당 모듈을 이해하기 위해 참고.
3.python time.sleep() process status
출처 : https://www.programiz.com/python-programming/time/sleep
참고한 내용
정말 time.sleep()이 process의 상태를 waiting으로 만드는지 알기 위해 참조하였다.
추가로 고려할 내용
프로세스를 얼마나 waiting할지, 그리고 몇 kb일 때 cached memory를 삭제할 지 결정해야 한다.
waiting time
waiting time은 너무 길면 메모리가 꽉 찰 때를 캐치못할 것이고, 너무 짧으면 busy waiting이 될 것이다. 따라서 임의로 적정 3분을 잡았다.
cached memory
3분으로 잡았을 때 cached memory가 몇일때 삭제 명령을 수행해야 안전할까?
- 내 방 인터넷 속도는 최대 100mbps로 약 초당 10mb를 다운받을 수 있다.
- 3분동안 계속 다운로드를 받았다 할 경우 3분은 180초로 100mb*180 = 1.8gb정도를 받을 수 있다.
- 이에 따라 cached memory가 1.8gb 미만일 경우 cached memory를 삭제한다면 안전하리라 본다.
구현
import subprocess
import time
sleepTime = 180
#1초당 최대 다운 받는 데이터 크기 (단위 kb)
downloadKBPerSecond = 10*1024
#삭제 임계점.
threadHold = sleepTime*downloadKBPerSecond
while True:
time.sleep(180)
memInfo = subprocess.check_out('head /proc/meminfo', shell= True)
#여분 메모리 parsing
memFree = str(memInfo)\
.split("\\n")[1]\
.replace(" ","")\
.split(":")[1]\
.rstrip("kB")
memFree = int(memFree)
if memFree<threadHold:
subprocess.call("echo 3 > /proc/sys/vm/drop_caches", shell = True)
한계 사항
- vsftpd에 대한 cached memory를 삭제하지 않았다.
- 다른 프로세스 cached memory도 삭제한다. 특정
- 모든 메모리를 사용하지 못한다.
- 1.8gb로 제한 건 것은 여분이 있음에도 1.8gb는 캐쉬 메모리로 사용하지 못하여 속도 저하를 유발할 수 있다는 점이다. 더 좋은 알고리즘이 있는지 생각해볼 필요가 있다.
'토이프로젝트 > 클라이언트-서버 폴더 동기화' 카테고리의 다른 글
실행화면 (0) | 2020.05.04 |
---|---|
메모리 문제해결(3)-command (0) | 2020.05.04 |
메모리 문제 해결(1) (0) | 2020.05.04 |
메모리 해결방안에 대한 모색 (0) | 2020.05.04 |
메모리 문제. (0) | 2020.05.01 |