Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

비동기 pooled executor로 변경 #11

Closed
wants to merge 1 commit into from
Closed

Conversation

Gwonwoo-Nam
Copy link

Why?

트래픽이 많이 들어오면 superlifter thread가 많이 생성되는 이슈가 있습니다.
비동기 처리를 위해 사용하는 clojure.core의 future 매크로는 항상 solo executor로 cached pool을 사용하도록 되어있는데,
cached pool의 동작은 다음과 같이 동작하기 때문에 스레드가 제한없이 생성될 수 있습니다.

  1. idle thread가 있으면 사용
  2. 없으면 생성
  3. 60초간 idle인 스레드가 있다면 풀에서 제거

clojure.lang.Agent의 pooledExecutor를 사용하여, 고정 개수의 스레드를 할당하는 fixed pool을 적용해보고 부하 테스트로 성능을 비교해볼 예정입니다.

pooledExecutor는 newFixedThreadPool이며, 2 + 프로세서 개수만큼의 스레드를 생성하도록 되어있습니다.

public static volatile ExecutorService pooledExecutor = Executors.newFixedThreadPool((int)(2 + Runtime.getRuntime().availableProcessors()), (ThreadFactory)Agent.createThreadFactory("clojure-agent-send-pool-%d", sendThreadPoolCounter));

큐잉 관련

newFixedThreadPool이 CachedThreadPool과 다른점은, idle 스레드가 없으면 LinkedBlockingQueue에 대기중인 요청이 쌓입니다.

큐의 크기는 옵션 파라미터를 넣지않으면 동적으로 확장되게 되어있어, OOM 발생시까지 쌓이는 것 같습니다.
호출부 살펴보면 옵션 파라미터를 넣고있지 않아서, 무한대로 설정되어있습니다.

The optional capacity bound constructor argument serves as a way to prevent excessive queue expansion. The capacity, if unspecified, is equal to Integer.MAX_VALUE. Linked nodes are dynamically created upon each insertion unless this would bring the queue above capacity.

(참고: https://medium.com/@amardeepbhowmick92/task-queuing-in-executors-newfixedthreadpool-31bc8c24b4d2)

@Gwonwoo-Nam Gwonwoo-Nam changed the title [wip] executor 변경 [wip] 비동기 pooled executor로 변경 Dec 26, 2024
@@ -0,0 +1,74 @@
(ns superlifter.future
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

core에 같이 넣기는 애매한것같아서 future라는 ns를 만들고 core 함수를 가져와서 executor를 주입할 수 있도록 일부 수정했습니다.
private으로 설정된 녀석들도 있어서 불가피하게 같이 가져왔어요.

@Gwonwoo-Nam
Copy link
Author

clojure.core를 가져와서 사용하는 것이 우아하지 못하다고 생각되어 이 PR은 닫겠습니다. promesa에서 CompletableFuture와 executor를 사용하기 쉬운 형태로 제공하기 때문에 이를 활용하는 방법으로 변경합니다.

@Gwonwoo-Nam Gwonwoo-Nam closed this Jan 6, 2025
@Gwonwoo-Nam Gwonwoo-Nam changed the title [wip] 비동기 pooled executor로 변경 비동기 pooled executor로 변경 Jan 15, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant