Skip to content

Tomcat๊ณผ TCP Backlog

Sangkwon Lee edited this page May 2, 2025 · 1 revision

"๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์ค‘ TCP ์ปค๋„ฅ์…˜ ์œ ์‹ค ๋ฌธ์ œ ๋ฐœ์ƒ"์—์„œ ๋‹ค๋ฃฌ ๋ฐ”์™€ ๊ฐ™์ด ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์ค‘์— TCP ์ปค๋„ฅ์…˜์— ๋Œ€ํ•œ ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ์ ์ธ ์›์ธ์€ TCP Backlog Queue(accept queue, ๋Œ€๊ธฐ์—ด) ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•ด์ฃผ์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  TCP Backlog Queue ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ Spring Boot ๋‚ด์žฅ Tomcat์˜ max-connections์™€ accept-count ์„ค์ •์— ๋Œ€ํ•œ ํ˜ผ๋™์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ TCP Backlog์™€ accep-count์˜ ๊ด€๊ณ„์— ๋Œ€ํ•ด์„œ๋„ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ทธ ๊ด€๊ณ„๋ฅผ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๋” ๋ถ„์„ํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.



NIO Connector๋ž€

๋จผ์ € Spring Boot ๋‚ด์žฅ Tomcat์ด ํ•ธ๋“ค๋งํ•˜๋Š” NIO Connector์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Tomcat์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ Connector๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ๊ธฐ๋ณธ ์„ค์ •์ธ NIO Connector๋Š” Java์˜ Non-blocking I/O (NIO) ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

  1. Acceptor Thread
    ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์ปค๋„์˜ TCP Backlog Queue์— ๋Œ€๊ธฐ ์ค‘์ธ ์—ฐ๊ฒฐ์„ accept()๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  2. Poller Thread
    ์—ฐ๊ฒฐ๋œ ์†Œ์ผ“ ์ฑ„๋„์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋Š”์ง€(ํ˜น์€ I/O ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€) ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค. NIO์˜ Selector๋ฅผ ์‚ฌ์šฉํ•ด non-blocking ๋ฐฉ์‹์œผ๋กœ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค.

  3. Worker Thread
    ์‹ค์ œ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ์†Œ์ผ“ ์ฑ„๋„์—์„œ I/O ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Poller์— ์˜ํ•ด ์›Œ์ปค ์“ฐ๋ ˆ๋“œ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

tomcat_connector_๊ตฌ์กฐ

Connector.startInternal()

๋‚ด์žฅ Tomcat์€ NIO Connector๋ฅผ org.apache.catalina.connector.Connector์˜ ์œ„์น˜์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Connector๋ผ๋Š” ํด๋ž˜์Šค ์•ˆ์—๋Š” startInternal()์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ ํ˜ธ์ถœ์ด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด Connector.startInternal()์ด ํ˜ธ์ถœ๋˜๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ์š”? ์‹ค์ œ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๊ฐ๊ฐ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๋Š”๋ฐ, ์ €ํฌ๋Š” NioEndpoint.start()์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ํŒŒํ—ค์ณ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Connector.startInternal()
	โ””โ”€โ”€ ProtocolHandler.start()
		โ””โ”€โ”€ Http11NioProtocol.start()
			โ””โ”€โ”€ NioEndpoint.start()


NioEndpoint.start()

NioEndpoint.start()์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋™์ž‘์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

  1. bindWithCleanup(): socket binding์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  2. startInternal(): Poller Thread์™€ Acceptor Thread๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
nio_endpoint_start

bindWithCleanup()

์ฒซ ๋ฒˆ์งธ๋กœ bindWithCleanup()์„ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ์›น ์„œ๋ฒ„๋ฅผ TCP listening ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ServerSocketChannel.bind()๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๋Š”๋ฐ, ์ธ์ˆ˜ ๊ฐ’์œผ๋กœ accept-count๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

init_server_socket

๋Œ€์ž…ํ•œ accept-count๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ backlog๋ผ๋Š” ๋ณ€์ˆ˜๋ช…์œผ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด backlog ๊ฐ’์ด TCP Backlog์™€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ด€๋œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

server_socket_channel_bind

ServerSocketChannel.bind()์—์„œ ํ•œ ๋‹จ๊ณ„ ๋” ๋“ค์–ด๊ฐ€๋ฉด unixBind()๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ์ด๊ณณ์—์„œ Java ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” listen() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์†Œ์ผ“ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” JNI(Java Native Interface)๋ฅผ ํ†ตํ•ด C/C++๋กœ ๊ตฌํ˜„๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ์˜ listen() ๋ฉ”์„œ๋“œ์˜ ์—ญํ• ์€ ์†Œ์ผ“์„ ๋ฆฌ์Šค๋‹ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜๋ฉฐ, ์ง€์ •๋œ backlog๋กœ ๋Œ€๊ธฐ์—ด ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

unix_bind

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ OS์—์„œ ์„ค์ •๋œ TCP Backlog Queue ํฌ๊ธฐ์— ์ข…์†๋˜์ง€๋งŒ, ๊ฐ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๊ธฐ์—ด ํฌ๊ธฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Tomcat ์„œ๋ฒ„๋Š” listen() ๊ณผ์ •์—์„œ ์ง€์ •๋œ accept-count๋งŒํผ TCP Backlog Queue, ์ฆ‰ accept queue๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


startInternal()

๋‹ค์Œ์œผ๋กœ NioEndpoint.start()์˜ ๋‘ ๋ฒˆ์งธ ๋™์ž‘์ธ startInternal()์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ 3๊ฐ€์ง€์˜ ์ค‘์š”ํ•œ ๋™์ž‘์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. initializeConnectionLatch(): max-connections ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. pollerThread.start(): Poller Thread๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. startAcceptorThread(): Acceptor Thread๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
nio_endpoint_start_internal

initializeConnectionLatch()์˜ ์—ญํ• ์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. max-connections ์„ค์ •๊ฐ’์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. max-connections ๊ฐ’์€ Tomcat์ด ๋™์‹œ์— ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ปค๋„ฅ์…˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ์„ค์ •ํ•  ๋•Œ๋Š” LimitLatch๋ฅผ ํ™œ์šฉํ•˜๋Š”๋ฐ, ์ž ์‹œ ํ›„์— ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

initialize_connection_latch

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ pollerThread.start()์™€ startAcceptorThread()๋Š” ๋ณด์ด๋Š” ๊ทธ๋Œ€๋กœ Poller Thread์™€ Acceptor Thread๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ์—ฌ๊ธฐ์„œ Tomcat๊ณผ TCP Backlog์˜ ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ Acceptor Thread ์ž์ฒด๊ฐ€ ์–ด๋–ค ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.



Acceptor.run()

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Acceptor๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Acceptor๋Š” Runnable ๊ตฌํ˜„์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— run() ๋ฉ”์„œ๋“œ ์•ˆ์— ์žˆ๋Š” ๋‚ด์šฉ์ด ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ ๋‚ด์šฉ ์ค‘์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค.

acceptor_run

์œ„ ์ฝ”๋“œ์—์„œ countUpOrAwaitConnection()๊ณผ serverSocketAccept()๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋กœ countUpOrAwaitConnection()์€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์ด max-connections ๊ฐ’์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋Š”์ง€ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” initializeConnectionLatch()์—์„œ ๋“ฑ์žฅํ–ˆ๋˜ LimitLatch๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋™์‹œ์— ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด๋‚˜ ์—ฐ๊ฒฐ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ •ํ•ด์ง„ ์ˆ˜๋งŒํผ๋งŒ ์ถœ์ž…์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฌธ์˜ ๋น—์žฅ(Latch)๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ดํ•ดํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ LimitLatch.countUpOrAwait()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋งŒ์•ฝ ํ˜„์žฌ ์นด์šดํ„ฐ ๊ฐ’์ด ์„ค์ •๋œ ํ•œ๊ณ„๊ฐ’(์—ฌ๊ธฐ์„œ๋Š” max-connections)๋ณด๋‹ค ์ž‘์œผ๋ฉด ์นด์šดํ„ฐ๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ์ด๋ฏธ ํ•œ๊ณ„๊ฐ’์— ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ์นด์šดํ„ฐ๋ฅผ ๊ฐ์†Œ์‹œํ‚ฌ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ฆ‰, Acceptor ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

count_up_or_await_connection

๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” serverSocketAccept()์ธ๋ฐ, Acceptor ์“ฐ๋ ˆ๋“œ์˜ ์ฃผ์š” ์ž‘์—…์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ServerSocketChannel.accept()๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์•ˆ์—์„œ๋Š” ์‹ค์ œ ์†Œ์ผ“ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ(implAccept)๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ์ด ์—ญ์‹œ JNI๋ฅผ ํ†ตํ•ด C/C++๋กœ ๊ตฌํ˜„๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, accept queue์—์„œ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” TCP ์ปค๋„ฅ์…˜์„ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

socket_channel_accept

๋งŒ์•ฝ accept queue์— ๋Œ€๊ธฐ ์ค‘์ธ ์ปค๋„ฅ์…˜์ด ๊ฐ€๋“ ์ฐจ ์žˆ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ์˜ ACK ์š”์ฒญ์ด accept-quque์— ์Œ“์ด์ง€ ๋ชปํ•˜๊ณ  ์ปค๋„ ๋ ˆ๋ฒจ์—์„œ ๋“œ๋กญ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (SYN ์š”์ฒญ๋„ ๋“œ๋กญ. TCP Backlog Queue ์‚ฌ์ด์ฆˆ์— ๋™์ผํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ฐ›์Œ)

๊ทธ๋ž˜์„œ Acceptor๊ฐ€ accept()๋ฅผ ๋นจ๋ฆฌ ํ˜ธ์ถœํ•ด์„œ ์ปค๋„ฅ์…˜์„ accept-queue์—์„œ ๋นจ๋ฆฌ ๊บผ๋‚ด์•ผ ํ•˜๊ฒ ์ง€๋งŒ, ์ด๋ฏธ max-connections๋งŒํผ์˜ ์ปค๋„ฅ์…˜์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด Accpetor๋Š” countUpOrAwaitConnection()์˜ ๋‚ด๋ถ€ ๋กœ์ง์— ๋”ฐ๋ผ accept()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐ ์ƒํƒœ์— ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ accept-count๋ฅผ ๋ฌด์ž‘์ • ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์€ ์—ฐ๊ฒฐ ์ž์ฒด๋ฅผ ๋งŽ์ด ์ˆ˜์‹ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, Worker ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฐ”์œ ์ƒํƒœ๋ผ๋ฉด ์ž‘์—… ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋Š˜๋ฆฌ์ง€๋Š” ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.



๋งˆ์น˜๋ฉฐ

์ง€๊ธˆ๊นŒ์ง€ Tomcat์˜ NIO Connector๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  TCP Backlog์™€ accept-count, max-connections ์„ค์ •๊ฐ’์ด ๊ฐ๊ฐ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋ฉฐ ์‹ค์ œ ์ฝ”๋“œ ํ๋ฆ„์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ,

  • accept-count๋Š” OS์˜ TCP Backlog Queue ํฌ๊ธฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ œํ•œํ•˜๋ฉฐ,
  • max-connections๋Š” ๋™์‹œ์— ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด ๋‘ ์„ค์ •๊ฐ’์€ Tomcat์˜ Acceptor ์“ฐ๋ ˆ๋“œ์—์„œ ์ปค๋„ฅ์…˜์„ ์ˆ˜๋ฝํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ ๊ณ ๋ถ€ํ•˜ ์ƒํ™ฉ์—์„œ ์—ฐ๊ฒฐ ์œ ์‹ค ์—†์ด ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹จ์ˆœํžˆ ํŠธ๋ž˜ํ”ฝ๋งŒ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ปค๋„ฅ์…˜ ์ฒ˜๋ฆฌ ํ๋ฆ„๊ณผ ํ์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ ˆํ•œ ํŠœ๋‹์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์ด Tomcat์˜ ์ปค๋„ฅ์…˜ ์ฒ˜๋ฆฌ ํ๋ฆ„์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Clone this wiki locally