我正在使用 Java 中的 Vert.x 的服务器上工作,并且我注意到在运行 Ubuntu 12.04 的专用服务器上运行时出现一些性能问题。
服务器接收传入的 HTTP 请求,使用 HMAC 进行一些身份验证,解析请求正文,进行一些文本处理,然后通过 UDP 将数据发送到不同的服务器。没有磁盘 I/O,并且只有相对少量的内存使用(远不及交换)。我正在使用 Grinder 和 AWS 实例对服务器进行负载测试,但即使使用装备良好的服务器,我每秒也无法获得超过 10k 的请求。
我看到的是,服务器计算机上的一个核心完全固定,主要在内核中,而其他核心的利用率仅为 20-25%。我的假设是 CPU 用于接收传入的 TCP 连接。 JMX 报告我的大部分时间都在 io.netty.channel.nio.NioEventLoop.select() 中,我假设它计算了等待内核的时间,而 strace 显示了在 futex() 和 epoll_wait() 中花费的大量时间。我尝试过使用内核设置来增加服务器的吞吐量,但我没有任何运气。
分析器运行:
原始网址:https://i.stack.imgur.com/6wIZA.png
CPU使用率:
原始网址:https://i.stack.imgur.com/9mM5u.png
我想知道可以在内核级别调整什么来帮助解决这个问题。我尝试过调整 TCP 缓冲区大小、增加文件句柄、关闭 TCP 功能等,但无济于事。该服务器操作系统实际上在 Xen 上运行,它是“专用”的,因为它是唯一的驻留操作系统。
答案1
我会仔细检查您的应用程序及其正在使用的库。就 Linux 内核而言,JVM 线程是作为 Linux 上的本机线程(轻量级进程)实现的,至少在 Sun/Oracle JVM 实现中是这样。
JVM 是一个具有多个线程的单个进程。它启动的每个线程都可以在任何可用的内核上运行。 Linux 中的单个进程可以有多个线程。
您可能还想看看这些资源: