java一次编写处处运行_Java 7套接字直接协议–编写一次,到处运行…。 奔跑(在某些地方)

java一次编写处处运行

本文将研究新的Java套接字直接协议 (SDP)技术,这是Java 7 SDK中最近引入的非常令人兴奋的突破。 SDP使超高性能计算(UHPC)社区能够在非常罕见的用例中使用Java普遍存在的功能和优点:对InfiniBand 远程直接内存访问 (RDMA)功能的本地访问。 RDMA为低延迟应用程序提供了一种协议,可以在不涉及操作系统的情况下直接访问其他计算机上的内存。 UHPC社区具有可以想象到的最严格的不妥协的低延迟和高吞吐量需求,因此,UHPC自然需要可用的最佳RDMA功能。 随着Java 7套接字直接协议产品的推出,UHPC社区现在有了一个Java平台,使他们能够编写Java应用程序代码,这些代码直接加入了本机InfiniBand RDMA功能的全部功能。

在深入研究新的Java套接字直接协议之前,让我们简要回顾一下Java的网络和套接字API历史。

在1995年,Sun Microsystems向世界介绍了Java,并立即开始使用通用的流行语“ Java –编写一次,无处不在”宣传该平台。 众所周知,这背后的想法很简单:与其使用C ++代码编写应用程序(使用几乎甚至可以“随处运行”的可移植性来构建/部署都非常困难),现在您可以使用Java编写应用程序代码。 ,它将构建/部署到虚拟机(而不是底层OS执行环境)。 这将Java应用程序程序员从可移植性方面解放了很多,将可移植性的唯一托管权委托给了Java虚拟机(JVM)。 JVM承诺:如果您可以构建/部署可在一个Java VM上运行的Java代码(对于某些特定的底层OS),该平台将保证完全相同的代码将在任何OS(适用于兼容Java VM的OS)上运行。 )。 不再需要条件编译和预处理器宏。 (有人记得C ++和#ifdef地狱吗?JVM现在可以减轻应用程序程序员的繁重负担。)

这一切都非常有帮助,并且被应用程序编程社区很好地接受了。 众所周知,JavaSwift并Swift地流行起来-在全球范围内以其在计算的众多编程语言平台的历史上所无法比拟的速度受到欢迎。

最初,Sun提供了Java VM,使其可以在完全3种操作系统上运行:(i)Solaris(ii)Linux(iii)Windows。 因为Microsoft早在几年前(1993年)就随Windows提供了WinSOCK协议栈,所以Windows现在可以进行TCP / IP网络连接(并通过Microsoft完全支持的API)。 自1970年代以来,各种* nix系统(当然)一直在使用TCP / IP。 微软对WinSOCK的引入对于Java成为它的发展必不可少。 没有WinSOCK,您将无法交付支持java.net。*和java.io. * API的Windows VM。 没有它,Java将无法构建能够在垄断全球台式机的OS上运行的具有网络功能的完整VM。 现在,Windows可以使用完整的TCP / IP,Java可以代替Java达到“也许一百万”的桌面,而Java现在可以达到“也许十亿”的桌面。

事情变了。

当然,Java仍然是“编写一次,随处运行”。 便携性仍然是中心重点。 但是,现在有了Java 7和Sockets Direct Protocol,就可以使用Java VM完成更多的工作。 可移植性不是唯一的优先事项; 现在,适应超高性能用例是Java VM的首要任务。 有了套接字直接协议,Java VM现在可以提供与直接访问InfiniBand的本机功能相同的网络和套接字API。 InfiniBand比以太网快得多。 InfiniBand是UHP计算社区的首选物理网络层提供商。

不久,我们将确切讨论什么是InfiniBand,以及Java 7 VM如何使应用程序授权使用本地InfiniBand功能。

需要注意的一件有趣的事情(尤其是从历史的角度来看); Java已决定在两种操作系统上提供套接字直接协议,而Microsoft Windows 并不是其中一种。 支持Java 7 SDP的两个操作系统是Solaris和Linux。 自Solaris 10以来,Solaris SDP支持已成为所有版本的标准配置。只要您具有物理InfiniBand NIC,Java 7 SDP就可以立即使用。 对于Linux,SDP支持通过Open Fabrics Enterprise Distribution软件包提供。 要检查您的Linux版本是否配置了OFED设备驱动程序,以及您是否确实具有物理InfiniBand NIC适配器,只需键入

egrep "^[ \t]+ib" /proc/net/dev 

如果从此命令获得任何输出,则都可以在该操作系统上使用Java 7 SDP。

重要的是要注意,所有java.net。*和java.io. *应用程序代码当然仍将使用Java 7 VM在Microsoft Windows上运行……但是它将在没有Sockets Direct Protocol的情况下运行(因此它将运行)以以太网作为物理层提供程序)。 即使您在提供InfiniBand支持(通过WinSOCK Direct)的Windows Server版本上运行,也是如此。 同样,所有内容仍将在Microsoft上运行,只是运行速度不如非Microsoft(即* nix)的“某些地方”。

事情确实发生了变化。

现在让我们讨论Java到操作系统的网络协议栈的API桥。 首先,网络层的标准开放系统互连(OSI)模型如下。

协议

Java SDK核心API

7

应用层

HTTP,FTP,SSL等

java.net.HttpURLConnection,javax.servlet.HttpServlet

6。

表示层

#在Java中,应用程序/演示OSI层之间没有真正的区别

5,

会话层

NetBios,RCP

#no Java SDK核心不支持OSI会话层

4。

传输层

TCP,UDP

java.net.Socket,java.net.ServerSocket,java.net.Datagram

3。

网络层

知识产权

Java.net.InetAddress

2。

数据链路层

购买力平价

#no Java SDK核心对OSI数据链路层的支持

1。

物理层

以太网,InfiniBand

#没有Java SDK核心对OSI物理层的支持

但是……

Java 7 套接字直接协议 (从InfiniBand到java.net。*和java.io. *核心API的VM桥)

对于OSI网络层视图,Java 7套接字直接协议功能使Java应用程序代码尽可能“接近金属”。 Java SDP提供了从应用程序代码到VM的*直接*(SDP中的“ D”)桥,以至*本机*,*物理* InfiniBand。 Java 7 SDP功能可以做到这一点,而应用程序不必更改其对核心java.net。*和java.io. * API的使用。 不仅如此,通过将Java VM的特定连接点配置为InfiniBand OS设备驱动程序和库(也称为InfiniBand的VERBs层API),应用程序代码可以使用java.net。*和java.io. *-这是Java的API用于传输层的OS资源(OSI层4)可以绕过传统的网络协议栈(即,它可以绕过OSI层3和绕过OSI层2)并直接到达InfiniBand(OSI层1)。 性能影响和收益非常重要。

借助Java 7和套接字直接协议,Java现在可以执行RDMA(远程直接内存访问)

RDMA是远程动态内存访问,它是一种通过网络在两个Java VM进程(在* nix用户地址空间中执行)之间移动应用程序缓冲区的方式。 RDMA与传统的网络接口不同,因为它绕过了操作系统。 这样,RDMA上的Java SDP可以提供:(i)绝对最低的延迟(ii)最高的吞吐量(iii)最小的CPU占用空间。

通过将Java连接点公开给RDMA,SDP隐式还使Java提供了非常引人注目的“零复制”功能。 “零复制”描述了计算机操作,其中CPU不执行将数据从一个存储区域复制到另一个存储区域的任务。 零拷贝版本的网络协议栈大大提高了某些应用程序的性能,并更有效地利用了系统资源。 通过允许CPU继续执行其他任务,同时在机器的另一部分中并行进行数据复制,可以提高性能。 同样,零拷贝操作减少了用户空间和内核空间之间耗时的模式切换次数。 系统资源的利用效率更高,因为如果其他更简单的系统组件可以执行复制操作,则使用相对复杂的CPU来执行大量的复制操作(这是一项相对简单的任务)非常浪费。 重要的是要注意,我们在这里讨论的“零复制”功能不是使用java.nio.channels.FileChannel的transferTo()API可以实现的“零复制”功能。 它的性能要高得多。 使用Java 7 SDP,您可以直接使用本机InfiniBand零复制协议实现。

让我们开始在一些典型的Java部署视图的上下文中直观地准确描述Sockets Direct Protocol功能的外观。

下图说明如何节点1(一的java.net.Socket 作家 )和节点2(一个java.net.ServerSocket的监听程序 )可以被部署到一个Java虚拟机7配置和启动到支持SDP以这样的方式使2级的JVM可以通过InfiniBand网络将应用程序数据缓冲区从一个VM交换到另一个VM,而无需调用任何OS系统调用或服务。 令人难以置信的是,Java数据传输完全绕过两个操作系统。

  1. Java 7应用程序= 节点1 (启动使用SDP的JVM)使用java.net.Socket API将网络上的应用程序数据块写入 java.net.ServerSocket 侦听器
  2. 由于启动了JVM以使用SDP,因此完全绕开了操作系统TCP / IP堆栈-应用程序数据直接写入InfiniBand的RDMA功能(要求InfiniBand为网络接口卡的物理提供者)。
  3. Java 7应用程序= 节点2 (JVM也已启动以使用SDP)使用java.net.ServerSocket API侦听应用程序数据块,该数据块是通过RDMA从java.net.Socket编写器通过网络到达的。 (要求InfiniBand为网络接口卡的物理提供者)。
  4. 数据直接*直接传递到Java 7 VM应用程序缓冲区! 不涉及OS系统或服务调用-既不来自节点1的操作系统也不来自节点2的操作系统。 就是Java 7套接字直接协议的功能。

在具有SDP的Java 7上运行的同一应用程序与Java 6上运行的同一应用程序之间的逻辑性能差异是什么?

以下“深潜”图详细介绍了在两种不同情况下节点2的视图(来自上一页的图):

  1. 在配置了SDP的情况下使用Java 7(如下左图所示),节点2对节点1的已传输数据的接收如何沿OSI网络层协议栈向上传输并进入Java应用程序? 它需要执行几个步骤? 只需要一步! (下面看–这对UHPC Java应用程序是个好消息;现在,UHPC社区可以使用Java 7来完成需要做的事情)。
  2. 使用Java 6(无SDP-右下方显示)节点2对节点1的已传输数据的接收如何沿OSI网络层协议栈传输并进入Java应用程序? 它需要执行几个步骤? 它需要五个步骤(请看下面–这是熟悉的TCP / IP协议栈–不是SDP。它适用于大多数,但不适用于UHPC社区。UHPC社区只是无法使用Java 6来完成所需的工作待完成。)。

您如何管理和配置Java 7 VM以使用套接字直接协议?

以下内容摘自Oracle教程页面的配置部分, 其中介绍了Java 7 SDP。

SDP配置文件是Java VM在引导时从本地文件系统读取的文本文件。 SDP配置文件具有2种不同类型的条目。 每种类型的条目每行仅表达一次:

  1. SDP配置注释
  2. SDP配置规则

该行开头的井号(#)表示注释,井号之后的所有内容都将被忽略。

对于配置规则行,完全有两种类型的规则:

  1. 绑定规则
  2. CONNECT规则

“绑定”规则表示,只要TCP套接字绑定到与该规则匹配的地址和端口,就应使用SDP协议传输。 “连接”规则表示当未绑定的TCP套接字尝试连接到与该规则匹配的地址和端口时,应使用SDP协议传输。

通过SDP配置文件中指定的规则,Java VM可以确切知道何时使用InfiniBand的VERBS / RDMA协议栈替换普通的TCP / IP协议栈。

第一个关键字指示规则是绑定规则还是连接规则。 下一个标记指定主机名或原义IP地址。 指定文字IP地址时,还可以指定前缀,以指示IP地址范围。 第三个也是最后一个令牌是端口号或端口号范围。

请在此样本配置文件中考虑以下符号:

#绑定到192.0.2.1时使用SDP

绑定192.0.2.1 *

#连接到192.0.2。*上的所有应用程序服务时使用SDP。

连接192.0.2.0/24 1024- *

示例文件中的第一条规则指定将SDP用于本地IP地址192.0.2.1上的任何端口(*)。 您将为分配给InfiniBand适配器的每个本地地址添加一个绑定规则。 ( InfiniBand适配器等效于InfiniBand的网络接口卡(NIC)。)如果您有多个IB适配器,则应对分配给这些适配器的每个地址使用绑定规则。

示例文件中的第二条规则指定,只要连接到192.0.2。*并且目标端口为1024或更大,就使用SDP。 IP地址/ 24上的前缀表示32位IP地址的前24位应与指定地址匹配。 IP地址的每个部分使用8位,因此24位表示IP地址应匹配192.0.2,并且最后一个字节可以是任何值。 端口令牌上的-*标记指定“及以上”。 端口范围(例如1024-2056)也将是有效的,并且将包括指定范围的端点。

如何启动Java 7 VM以使用套接字直接协议?

&> java \
-Dcom.sun.sdp.conf=sdp.conf \
-Djava.net.preferIPv4Stack=true \Application.class

注意将IPv4Stack用作要引导的网络格式。 即使Java 7和InfiniBand都使用更现代的IPv6网络格式,在Solaris和Linux上两者之间的映射均不受支持。 因此,在启动将使用SDP的Java 7 VM时,请始终使用熟悉的(并且数十年来可靠的)IPv4网络格式作为基石。

在通过SDP支持启动的Java 7 VM上运行应用程序时,应该期望多少性能改进

那当然是最终的问题! 使用Java 7 SDP 到底能获得什么? 这个问题的答案显然不能从本文的上下文中确定。 性能提升将取决于众多因素。 在本文结束时,请务必满足以下条件:

InfiniBand比以太网快得多。 高性能计算咨询委员会发布的一项综合研究得出的具体指标表明,与以太网(10GE)相比,Infiniband可提供600%的低延迟和370%的吞吐量。

而且,Java 7 SDP使用RDMA和最好的零复制实现。 在内核地址空间中的系统调用与用户地址空间中的应用程序代码缓冲区之间传输数据时,数据传输100%绕过OS网络TCP / IP堆栈以及所有上下文切换。

所有这些都将提供100%Java SDK API透明性。 无需更改Java应用程序代码对java.net。*或java.io. *的使用的任何一行。

最后,尽管情况发生了很大变化,但Java的核心精神仍然是相同的。 如今,就像Java最早的日子一样(JVM承担了将应用程序代码与可怕的可移植性复杂性隔离的负担) ,JVM再次承担了提供优先级功能的全部负担 :这次是Sockets Direct Protocol功能。 确实,原始Java口号几乎可以保持完全熟悉(用一个新的小词来反映这些激动人心的现代时代): Java 7 SDP –编写一次,在任何地方运行并(在某些地方)狂奔!

翻译自: https://www.infoq.com/articles/Java-7-Sockets-Direct-Protocol/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

java一次编写处处运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值