Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a...

27
Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library Tigran Mkrtchyan for dCache Team EMI is partially funded by the European Commission under Grant Agreement RI-261611

Transcript of Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a...

Page 1: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

Implementing a high-end NFSv4.1 service using a Java

NIO framework

In 7500 lines to new RPC libraryTigran Mkrtchyan for dCache Team

EMI is partially funded by the European Commission under Grant Agreement RI-261611

Page 2: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 2

dCache NFS vs. N.N

ATLAS hammer-cloud

DESY GridLab:● 50% T2 CPU● 30% T2 Storage(See poster 503)

Page 3: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 3

The anatomy of NFS package

NFSv41 (rfc 5661)

RPC (rfc 1831) RPCCES_GSS(rfc 2203)

XDR (rfc 1832)

Page 4: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 4

A bit of ONC­RPC history● Developed by Sun Microsystems in 1986● First published in 1988 (as Sun RPC)● Re­published as standard in 1995 (as ONC RPC)● ~1600 registered services at IANA

● NFS● NIS

● Widely used at HEP in  90's● Control, DAQ, Monitoring, Data transfer

Page 5: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 5

Today status● Pushed back by new 'Buzz Words'

● XML-RPC & JSON-RPC● SOAP & REST

● Performance still not bitten● Google's Protobuff is real alternative

● String type● Modern language friendly● No service version number● Encode/Decode only (more like XDR)

Page 6: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 6

Why invent a new wheel?

● Not that many Java implementations● No bi-directional RPC support● No RPCSEC_GSS● Not up-to-date

● Official libtirpc not good enough● No bi-directional RPC● JAVA – C integration

Page 7: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 7

Is it a square wheel?● High performance network IO is not an RPC/NFS 

requirements● Network components from GlassFish Application Server

● RFC 1831 and RFC 2203 compliant● IPv6 support ● GSS handling comes from Java Run­time Environment

● jre 6 provides AES128 and AES256● Poll/epoll/select/p_threads handles by JVM

● We use high level abstractions● Works on Linux, Solaris, OS X, Windows and Android

Page 8: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 8

We are not doing it the typical JAVA way

● Single thread per connection● Thousand threads per server

● Request processed almost in a single thread● No thread fencing (till first shared resource)

● Simple to implement● Blocking reads● Blocking writes● Idle threads costs nothing (ok, 48k stack space)

Page 9: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 9

RPC vs. Others 

HTTP GET

TCP

RPC CALL

TCP

RPC CALL

RPC CALL

● Many protocols are request-reply based● No new requests as long as no reply● Multiple requests processed sequentially

● Possible multiple independent requests➔ Even in one TCP package

● Server may process requests out-of-order➔ Reply in asynchronous fashion

● THE way to go for some workloads➔ High latency High bandwidth NFS access

Page 10: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 10

Our approach● Poll of IO threads

● Typically set to #Cores

● Pool of worker threads ( if required )● Processing per PRC packet

● No binding to network connection● Can be used with other transport (RDMA)

● Event based● doOnRead if bytes arrived● doOnWrite if bytes sent

Page 11: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 11

jRPC vs. Linux kernel

1 2 4 8 16 32 640

50000

100000

150000

200000

250000

300000

58000

105000

148000

183000

201000208000 209000

46000

86400

135000

202000

224000

243000253000

30000

4700060000

90000101000

9300085000

RPC requests per second

linux-kernel

jRPC

nfs-ganesha

number of client threads

req

ue

sts

pe

r s

ec

on

d

Page 12: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 12

jRPC vs. Linux kernel

1 2 4 8 16 32 640

50000

100000

150000

200000

250000

300000

58000

105000

148000

183000

201000208000 209000

46000

86400

135000

202000

224000

243000253000

30000

4700060000

90000101000

9300085000

RPC requests per second

linux-kernel

jRPC

nfs-ganesha

number of client threads

req

ue

sts

pe

r s

ec

on

d

Results are confirmed byLinux and tirpc developers

Page 13: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 13

Chain of responsibilities

TCP

RPC Fragment collector/splitter

RPC validation

RPC dispatcher

GSS encode/decoder

ReplyCall

RPCBINDNFSv4

NIC/OS

Page 14: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 14

IO strategy: Same Thread

TCP

RPC Fragment collector/splitter

RPC validation

RPC dispatcher

GSS encoder/decoder

NFSv4

NIC/OSSingle thread pick-ups an event and process it.

IO thread pool

Page 15: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 15

IO strategy: Worker Thread

TCP

RPC Fragment collector/splitter

RPC validation

RPC dispatcher

GSS encoder/decoder

NFSv4

NIC/OS

IO thread pool

Worker thread pool

A thread pick-ups an event andpushed it into event queue.

IOQueue

Page 16: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 16

Multi­Core

Page 17: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 17

How that looks like in the code

RpcDispatchable nfs4 = new NFSServerV41(....);

OncRpcSvc svc = new OncRpcSvcBuilder()

        .withTCP()

        .withAutoPublish()

        .withPort(2049)

        .withSameThreadIoStrategy()

        .build();

svc.register(nfs4_prot.NFS4_PROGRAM, nfs4);

svc.start();

Page 18: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 18

Code re­use (and much more)

TCP

RPC Fragment collector

RPC validation

RPC dispatcher

GSS unpacker

NIC/OS

RPC client

To send RPC calls To receive RPC calls

● All Filters have:● onRead to process receive● onWrite to process send

NFSv4server

NFSv4client

Page 19: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 19

Bi­directional RPC

TCP

RPC Fragment collector

RPC validation

RPC dispatcher

GSS unpacker

NFSv4server

NIC/OS

RPC client

NFSv4client

To send RPC calls To receive RPC calls

● Client/server defined by connection initiator only.

● Any client can receive calls.● Any server can send

requests.

Page 20: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 20

Security

● RPCSEC_GSS (krb5)● Proofed to work with AD, MIT and Heimdal● Supported Quality of protection:

● NONE● INTEGRITY● PRIVACY

Page 21: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 21

QOP none

Page 22: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 22

QOP integrity

Page 23: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 23

QOP privacy

Page 24: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 24

SUMMARY 

● High performance RPC library● Compatible with existing standards● Meets today's  requirements

● IPv6, AES256

● In production since 2009 (dCache­1.9.5)

Page 25: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 25

Ready to use by others

● Spitted into an independent library● Licensed with LGPLv2● Hosted on 

http://code.google.com/p/nio­jrpc/● Maven repo.● Already used in third party products

● BACnet● One of the Swiss banks

Page 26: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 26

Wild Slides

Page 27: Implementing a high-end NFSv4.1 service using a Java NIO … · 2012-05-22 · Implementing a high-end NFSv4.1 service using a Java NIO framework In 7500 lines to new RPC library

  dCache's NIO­JRPC library | Tigran Mkrtchyan  |  5/22/12  |  Page 27

dCache in one slide

Pools(Data Server)

Pools(Data Server)

Door

Message passing layer

JVM JVM JVM

Door(s)(clients entry point) Pool Manager

(requests scheduler)Name Space(MetaData Server)

Pools(Data Server)

DBMSdcap

ftphttpnfs