python GIL

자바나 C 계열의 언어를 접하다가 파이썬을 하다보면 이해가 안되는 것이 GIL 이다.

이 글은 예전에 파이썬 2.7의 GIL에 대해공부한 내용을 정리한 것이다. 현재 NewGIL이 나온걸로 아는데 아직 공부를 안해봤고, NewGIL을 공부하기전 알고 있는 내용을 정리해보고자 이 글을 작성한다.

파이썬에서 멀티 쓰레드 동작은 조금 이상하게 보인다.

파이썬 쓰레드 동작 결과

위의 그림에서 루프를 동작하는 경우 기대와는 다르게 쓰레드를 늘릴수록 시간이 늘어나게 된것을 알수 있다. 이것은 파이썬이 GIL을 사용하기 때문이다.

GIL 때문에 파이썬 쓰레드는 한 쓰레드에서 CPU점유를 마칠때까지 기다렸다가 다음 쓰레드가 동작한다. 그러므로 I/O가 많고 CPU Idle이 많은 경우에 좋은 성능을 발휘하고, 각 쓰레드 당 작업이 CPU작업이 많을 경우 성능이 느려진다.

  1. GIL(Global Interpreter Lock)

파이썬은 자원배분을 단순하게 한다. 자원 배분을 한 쓰레드에게 할당하고, 끝날때까지 다른 쓰레드가 접근하게 못하는 것이다.

GIL

GIL의 동작을 살펴보면 쓰레드 1번이 자원을 사용중일때, GIL을 쓰레드 1번이 잡고 있어서 다른 쓰레드는 자원을 점유하지 못한다.

쓰레드 1번이 파일 I/O (open), 네트워크 I/O 등의 I/O를 발생시키면 쓰레드 1번은 자신의 GIL을 풀어버리고 자원점유를 멈추게 되고, 대기중인 쓰레드 2번이 GIL을 잡고 , 자원을 점유하게 된다.

마찬가지로 쓰레드 2번이 I/O를 발생시키면 GIL을 풀어버리고, 자원 점유를 멈추게 된다. 이후 GIL을 획득하는 쓰레드는 쓰레드 1번이 될수도 있고, 쓰레드 3번이 될수도 있다. 각 쓰레드가 원하는 시점에서 GIL을 획득하지 못해 실행이 지연될수 있다는 뜻이다.

이런 GIL의 특성으로 CPU사용이 많은 작업에는 쓰레드의 성능이 나타나지 않게 되는 것이다.

2. 테스트

GIL의 특성을 회피하여 멀티 프로세싱이나 Gevent와 같은 것을 사용하게 되는데, 이에 따른 성능을 테스트 해보았다. 관련된 내용은 추후에 정리하도록 하겠다.

2–1. 테스트 시나리오

레디스 디비에 데이터가 100,000건있다고 가정한다. 루프를 이용해서 데이터를 꺼내는 함수를 만들고, 쓰레드를 1, 2, 4, 5, 8, 10개 로 하여 테스트를 진행하였다.

적절한 비교인지 모르겠지만, SLEEP함수는 GIL을 강제로 풀어버리기 때문에 루프에 SLEEP함수를 넣어서 강제로 GIL을 풀어가면서 쓰레드 시간의 변화를 측정했다.

(테스트 했던 코드가 없어졌네요 ㅠㅠ)

2–2. 결과

  • 쓰레드 갯수에 따른 루프 동작 시간의 변화
  • SLEEP함수를 적용
  • 결과 분석

수행시간에 대한 절대비교는 적절하지 않다. 왜냐하면 두번째 테스트 결과는 SLEEP함수를 이용해서 강제로 루프 수행을 지연시켰기 때문이다.

중요한것은 SLEEP함수를 사용했을때는 쓰레드 갯수에 따라 수행 시간이 감소했고, SLEEP함수를 적용하지 않았을 경우 수행 시간이 증가했다는 것이다.

파이썬이 이런 동작 방식을 갖고도 각광 받는 것은

  1. 분산처리가 발전하면서 한 컴퓨터내의 자원에 묶일 필요가 없고,
  2. 하드웨어의 발전으로 네트워크 I/O가 프로그램 지연의 대부분을 차지하기 때문

이다.

또한 GIL을 모른 상태에서 작성을 해도 “잘” 동작하기 때문에 언어의 진입장벽이 상대적으로 낮다. 빅데이터 관련 내용이 발전하면서, 수학자 / 통계학자 / 분석가 분들이 파이썬을 이용해서 쉽게 작업을 하기 때문에 빅데이터 관련 기술로 자리매김하게 된 것이다.

하지만 파이썬이 모든 것의 Silver Bullet이 될 순 없다. pycon 2016에서 이야기 나왔듯이 파이썬에서 안되는건 깔끔하게 포기하는게 정신건강에 매우 좋다.

참고자료

https://www.slideshare.net/deview/2d4python

http://jessenoller.com/blog/2009/02/01/python-threads-and-the-global-interpreter-lock
http://www.gevent.org/intro.html#monkey-patching
http://blog.pythonisito.com/2012/08/gevent-monkey-patch.html
http://qtqtlanakim.tistory.com/5

Show your support

Clapping shows how much you appreciated hans mj’s story.