하나의 코어에 고정된 서버

하나의 코어에 고정된 서버

저는 Java에서 Vert.x를 사용하는 서버에서 작업하고 있는데 Ubuntu 12.04를 실행하는 전용 서버에서 실행되는 일부 성능 문제를 발견했습니다.

서버는 들어오는 HTTP 요청을 수신하고, HMAC를 사용하여 일부 인증을 수행하고, 요청 본문을 구문 분석하고, 일부 텍스트 처리를 수행한 다음 UDP를 통해 데이터를 다른 서버로 보냅니다. 디스크 I/O가 없으며 상대적으로 적은 양의 메모리 사용량만 있습니다(스왑보다 훨씬 적음). Grinder와 AWS 인스턴스를 사용하여 서버를 로드 테스트하고 있는데 서버가 잘 갖춰져 있어도 초당 10,000개 이상의 요청을 받을 수 없습니다.

내가 본 것은 서버 시스템의 코어 하나가 대부분 코어에 완전히 고정되어 있는 반면 다른 코어는 20-25%만 활용된다는 것입니다. 내 가정은 CPU가 들어오는 TCP 연결을 수신하는 데 사용된다는 것입니다. JMX는 내가 대부분의 시간을 io.netty.channel.nio.NioEventLoop.select()에서 보낸다고 보고합니다. 여기서는 커널을 기다리는 것으로 간주되는 반면 strace는 futex() 및 epoll_wait() 시간에 많은 시간을 소비한 것으로 나타납니다. 서버의 처리량을 높이기 위해 커널 설정을 사용해 보았으나 성공하지 못했습니다.

분석기가 실행됩니다:

분석기 SS 원본 URL:https://i.stack.imgur.com/6wIZA.png

CPU 사용량:

사용량 원본 URL:https://i.stack.imgur.com/9mM5u.png

이 문제를 해결하는 데 도움이 되도록 커널 수준에서 조정할 수 있는 사항을 알고 싶습니다. TCP 버퍼 크기 조정, 파일 핸들 늘리기, TCP 기능 끄기 등을 시도했지만 소용이 없었습니다. 서버 운영 체제는 실제로 Xen에서 실행되며, Xen은 유일한 상주 운영 체제라는 점에서 "전용"입니다.

답변1

귀하의 응용 프로그램과 사용중인 라이브러리를 다시 확인하겠습니다. Linux 커널에 관한 한 JVM 스레드는 최소한 Sun/Oracle JVM 구현에서 Linux의 기본 스레드(경량 프로세스)로 구현됩니다.

JVM은 여러 스레드가 있는 단일 프로세스입니다. 시작되는 모든 스레드는 사용 가능한 모든 코어에서 실행될 수 있습니다. Linux의 단일 프로세스에는 여러 스레드가 있을 수 있습니다.

다음 리소스를 확인해 볼 수도 있습니다.

관련 정보