针对Java并发性能的Linux调优

针对Java并发性能的Linux调优,java,linux,performance,concurrency,Java,Linux,Performance,Concurrency,我有一个关于为java性能调优linux的大问题,所以我从我的案例开始 我有一个运行多个线程的应用程序,这些线程相互通信。我的典型工作流程是: 1) 某些使用者线程在公共对象锁上同步,并对其调用wait()。 2) 一些生产者线程通过选择器等待来自网络的数据。 2.1)生产者接收数据并形成具有接收时间戳(微秒精度)的对象。 2.2)生产者将此数据包放入某些交换映射中,并在公共锁上调用notifyAll。 3) 使用者线程唤醒并读取生成的对象。 3.1)使用者创建新对象,并在其中写入接收到的时间戳

我有一个关于为java性能调优linux的大问题,所以我从我的案例开始

我有一个运行多个线程的应用程序,这些线程相互通信。我的典型工作流程是:

1) 某些使用者线程在公共对象锁上同步,并对其调用wait()。
2) 一些生产者线程通过选择器等待来自网络的数据。
2.1)生产者接收数据并形成具有接收时间戳(微秒精度)的对象。
2.2)生产者将此数据包放入某些交换映射中,并在公共锁上调用notifyAll。
3) 使用者线程唤醒并读取生成的对象。
3.1)使用者创建新对象,并在其中写入接收到的时间戳和当前时间戳之间的时间差(以微秒为单位)。这样我可以监控反应时间。

而这个反应时间是整个问题的关键

当我在自己的机器上测试我的应用程序时,我通常会得到大约200-400微秒的反应时间,但当我在生产linux机器上监控它时,我会得到2000到4000微秒的数字

现在我正在运行ubuntu 16.04作为我的生产操作系统和Oracle jdk 8-111。我有一个带有2个Xeon处理器的物理服务器。我只在这台服务器上运行普通的操作系统守护进程和我的应用程序,因此与我的开发人员笔记本相比,有很多资源

我将java应用程序作为带有标志的jar文件运行: sudochrt-r77java-server-XX:+UseNUMA-d64-Xmx1500m-XX:NewSize=1000m-XX:+UseG1GC-jar

我使用sudo chrt更改优先级,因为我认为是这样的,但它没有帮助

我调整bios以获得最高性能,并关闭了C状态


我还可以调整什么来加快反应时间和降低上下文切换?

不,Linux上没有单一的
echo 1>/proc/sys/unlock\u concurrent\u magic
选项来全面提高并发性能。如果存在这样一个选项,它将在默认情况下启用

事实上,尽管通常是可调的,但您不会发现有很多可调的,特别是对Linux上的原始并发性有很大影响的。可能有帮助的部分通常与并发性相关,例如,启用了某些功能(比如THP),这会降低特定负载的速度,并且由于至少部分慢度是在锁定状态下发生的,因此整个并发吞吐量都会受到影响

Java并发与操作系统 然而,根据我的经验,Java应用程序很少受到操作系统级并发行为的直接影响。事实上,大多数Java并发都是在不使用操作系统特性的情况下高效实现的,并且在操作系统中的行为也一样。JVM与并发相关的操作系统的主要接触点是线程创建、销毁和等待/阻塞。最近的Linux内核在这三个方面都有很好的实现,因此遇到瓶颈是不寻常的(事实上,一个经过良好调优的应用程序不应该创建大量线程,还应该尽量减少阻塞)

因此,我发现性能差异很可能是由于硬件、应用程序配置、应用负载或其他方面的其他差异造成的

描述你的表现 以下是我首先尝试描述的开发主机和生产系统之间的性能差异

在顶层,差异可能是因为生产堆栈对于所讨论的负载实际较慢,或者是因为本地测试不是生产负载的准确反映

为了区分这些情况,您可以做的一个快速测试是运行您正在运行的任何本地测试,以便在卸载的生产服务器上获得200-400us响应时间。如果服务器的响应时间仍然是原来的10倍,那么您知道您的测试可能是合理的,而差异实际上存在于生产堆栈中

此时,问题可能仍然存在于操作系统、软件配置、硬件等方面。因此,您应该尝试平分生产堆栈和本地主机之间的差异-将任何可调参数设置为相同值,调查任何特定于应用程序的配置差异,尝试描述任何硬件差异

一个大问题是,生产服务器通常采用多套接字配置,这可能会将争用成本增加一个数量级,因为需要跨套接字通信(通常为100多个周期),而开发箱通常是多核但单套接字,因此争用开销包含在共享L3中(一般约30个周期)

另一方面,您可能会发现您的本地测试在生产服务器上的性能也很好,因此真正的问题是您的测试并不代表真正的生产负载。然后您应该努力描述真正的生产负载,以便您可以复制它,然后在本地对其进行调优。如何在本地对其进行调优可能是一个难题se需要填写一两本书(或者需要一个或两个高薪的承包商),所以你必须回答一个更狭隘的问题才能在这里得到有用的帮助

“大铁”与你的笔记本电脑 一个常见的谬论是,“大铁”在任何事情上都会比你的小笔记本电脑快。事实上,许多操作的情况恰恰相反,特别是当你测量操作延迟(相对于总吞吐量)时

例如,服务器部分的内存延迟通常比客户端部分慢50%,甚至与单套接字系统相比也是如此。John McCalpin的主存延迟为54.6纳秒(对于客户端Sandy Bridge部分)和79纳秒(对于相应的服务器部分)。众所周知,服务器的内存路径和内存控制器设计比较晚在吞吐量、可靠性和支持更多内核和总DRAM1的能力方面都有很大的优势

特别是,您提到您的producer服务器是一个“2Xeon处理器”,我把它带到我这里