new jvm features – multitenancy and packed objects · the information contained in this...

50
© 2013 IBM Corporation New JVM Features – Multitenancy and Packed Objects Neil Masson – Java L3 Service Core Teamt 24 th September 2013

Upload: others

Post on 07-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

© 2013 IBM Corporation

New JVM Features – Multitenancy and Packed Objects

Neil Masson – Java L3 Service Core Teamt24th September 2013

Page 2: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

2 © 2013 IBM Corporation

Important Disclaimers

THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR INFORMATIONAL PURPOSES ONLY.

WHILST EFFORTS WERE MADE TO VERIFY THE COMPLETENESS AND ACCURACY OF THE INFORMATION CONTAINED IN THIS PRESENTATION, IT IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.

ALL PERFORMANCE DATA INCLUDED IN THIS PRESENTATION HAVE BEEN GATHERED IN A CONTROLLED ENVIRONMENT. YOUR OWN TEST RESULTS MAY VARY BASED ON HARDWARE, SOFTWARE OR INFRASTRUCTURE DIFFERENCES.

ALL DATA INCLUDED IN THIS PRESENTATION ARE MEANT TO BE USED ONLY AS A GUIDE.

IN ADDITION, THE INFORMATION CONTAINED IN THIS PRESENTATION IS BASED ON IBM’S CURRENT PRODUCT PLANS AND STRATEGY, WHICH ARE SUBJECT TO CHANGE BY IBM, WITHOUT NOTICE.

IBM AND ITS AFFILIATED COMPANIES SHALL NOT BE RESPONSIBLE FOR ANY DAMAGES ARISING OUT OF THE USE OF, OR OTHERWISE RELATED TO, THIS PRESENTATION OR ANY OTHER DOCUMENTATION.

NOTHING CONTAINED IN THIS PRESENTATION IS INTENDED TO, OR SHALL HAVE THE EFFECT OF:

- CREATING ANY WARRANT OR REPRESENTATION FROM IBM, ITS AFFILIATED COMPANIES OR ITS OR THEIR SUPPLIERS AND/OR LICENSORS

Page 3: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

3 © 2013 IBM Corporation

Introduction to the speaker

■ Neil Masson

■ Many (many) years experience in Java

■ IBM Service – Core L3 Team

Page 4: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

4 © 2013 IBM Corporation

What should you get from this talk?

■ JVM proving to be a fertile ecosystem for languages

■ Plenty of opportunity to innovate in other spaces

■ Runtime is the gateway to this innovation

■ Largely ignored the last few years, but this is where the core inventions can occur

Page 5: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

5 © 2013 IBM Corporation

The runtime isn’t boring!

Page 6: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

6 © 2013 IBM Corporation

Multitenancy

Page 7: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

7 © 2013 IBM Corporation

Just what do you mean by “multitenancy”?

With a multitenant architecture, a software application is designed to virtually partition its data and configuration, and each client organization works with a customized virtual application instance.

■ Working Definition– A single instance of a software application that serves multiple customers

Each customer is a tenant.– Tenants can customize some parts of the application (look and feel) but not the code.– Infrastructure usually opaque

opportunity for provider

Why? Cost Savings: As compared to single-tenant deployment model

Page 8: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

8 © 2013 IBM Corporation

S5. Shared Application

JDK Support for Spectrum of Sharing / Multitenancy (Level 1-5)

S1. No Sharing

Infrastructure

Middleware

Application

Tenant

OS

Middleware

Application

Tenant

OS

Infrastructure

Middleware

Application

Tenant

OS

Middleware

Application

Tenant

OS

Infrastructure

Data Center floorData Center floor

Middleware

Application

Tenant

Middleware

Application

Tenant

Infrastructure

Data Center floor

OS

Application

Tenant

Application

Tenant

Infrastructure

Data Center floor

OS

Middleware

Application data

Tenant Tenant

Infrastructure

Data Center floor

OS

Middleware

Application

S2. Shared Hardware

S3. Shared Operating System

S4. Shared Middleware

Application data

Application data

Application data

Application data

Application data

Application data

Application data

Application data

Application data

Sharing serversstorage, networks in a data center

Hypervisors (e.g. KVM, VMWare) are used to virtualize the hardware

Multiple applications sharing the same middleware

Sharing the same application

Multiple copies ofmiddleware in a singleoperating system

ApplicationChanges

ApplicationChanges? Application

Changes

Page 9: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

9 © 2013 IBM Corporation

= ApplicationChanges

Page 10: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

10 © 2013 IBM Corporation

Hardware Virtualization

■ Hypervisors run multiple applications side-by-side safely

■ Advantages– Capture idle CPU cycles– Automatic de-duplication (RAM)– Ability to meter and shift resource toward demand– No need to change tenant applications

Hypervisor

Hardware

tenant tenant tenant tenant

Page 11: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

11 © 2013 IBM Corporation

Hardware Virtualization

■ Hypervisors JVMs can run multiple applications side-by-side safely

■ Advantages– Capture idle CPU cycles– Automatic de-duplication (ability to share Java artifacts)– Ability to meter and shift resource toward demand– No need to change tenant applications

Hypervsisor

Hardware

tenant tenant tenant tenant

Java VM

Operating System

Page 12: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

12 © 2013 IBM Corporation

Multitenancy: Low (or no) barrier to entry

■ Multitenancy is all about reducing duplication by transparently sharing a JVM– 1 GC, 1 JIT, shared heap objects– plus: JVM-enforced resource constraints to meter and limit consumption

■ Ergonomics: Opt-in to multitenancy with a single flag: -Xmt (multitenancy)– no application changes required

javad

Tenant1

Tenant2

One copy of common code + datalives in the javad process.

Page 13: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

13 © 2013 IBM Corporation

JVM: Separating State

■ Static variables are a problem for sharing

■ Consider the effect of global defaults

private static volatile TimeZone defaultTimeZone;

java.util.TimeZone

Page 14: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

14 © 2013 IBM Corporation

JVM: Separating State

■ Use @TenantScope annotation

■ Each tenant has its own version of defaultTimeZone

■ All JVM classes annotated

@TenantScope private static volatile TimeZone defaultTimeZone;

java.util.TimeZone

Page 15: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

15 © 2013 IBM Corporation

Tenants: Separating State

TenantClassLoader

BootstrapClassLoader

SystemClassLoader

ApplicationClassLoader

TenantClassLoader

Core classes eg java.lang, java.util, ...

Other JVM classeseg swing, SQL, ...

ClassPath

Page 16: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

16 © 2013 IBM Corporation

Tenants: Separating State

TenantClassLoader

BootstrapClassLoader

SystemClassLoader

ApplicationClassLoader

TenantClassLoader

Class AClass A Class A

Delegating ClassLoaders onlysee classes in their parent Classloaders

Class A != Class A

Page 17: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

17 © 2013 IBM Corporation

More that just JVM State…

■ Throttling of resources– Threads, GC, sockets, files (IO in general), native memory

■ Past and existing examples do exist!– Commercial / In house custom solutions– JSR 181 Isolates / 284 Resource Management

■ Security is of course huge

Page 18: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

18 © 2013 IBM Corporation

Other Thoughts – Native Libraries and shared state

■ Use separate processes to manage different state

■ Each process now holds the context

■ Challenges: Latency

Tenant1

Tenant2

JVM

Proxy Library

Shared Library

Shared Library

Tenant1

Tenant2

JVM

SharedLibrary

SharedState!

■ Native libraries contain state that may not be shareable across tenants

Page 19: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

19 © 2013 IBM Corporation

Questions?

Page 20: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

20 © 2013 IBM Corporation

Packed Objects

Page 21: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

21 © 2013 IBM Corporation

Problem? What problem?

■ JNI just isn’t a great way to marshal data

■ Locality in Java can matter

■ Existing native and data placement stories aren’t very good

■ In many cases, legacy systems exist – the interop is just terrible

■ So we want something that integrates well with the Java language and helps us…

Page 22: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

22 © 2013 IBM Corporation

What are we trying to solve?

Simple enough…

Hash

Array

Entry

(object)

(object)

Object header

Object field / data

tablekey

value

Page 23: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

23 © 2013 IBM Corporation

What are we trying to solve?

Simple enough…

■ Header overhead

Hash

Array

Entry

(object)

(object)

Object header

Object field / data

tablekey

value

Page 24: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

24 © 2013 IBM Corporation

What are we trying to solve?

Simple enough…

■ Header overhead

■ Pointer chasing

Hash

Array

Entry

(object)

(object)

Object header

Object field / data

tablekey

value

Page 25: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

25 © 2013 IBM Corporation

What are we trying to solve?

Simple enough…

■ Header overhead

■ Pointer chasing

■ Locality

Hash

Array

Entry

(object)

(object)

Object header

Object field / data

tablekey

value

Page 26: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

26 © 2013 IBM Corporation

What are we trying to solve?

intint

Object header

Fields / data

Java Native

int[] d

anObject

Fighting the Java/Native interface

intint

int…

Page 27: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

27 © 2013 IBM Corporation

Ok so we have some criteria…

■ Ability to do away with headers

■ Ability to bring multiple objects close together

■ On heap / off heap seamless referencing of data

■ This actually sounds a lot like C structure types

■ Packed Objects!

struct Address { char[4] addr; short port;}struct Header { struct Address src; struct Address dst;}

struct Header

portaddr

Address src

Address dstport

addr

Page 28: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

28 © 2013 IBM Corporation

Packed Objects: Under the covers

int yint x

aPoint

Object header

Object field / data

Page 29: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

29 © 2013 IBM Corporation

Packed Objects: Under the covers

int yint x

aPoint

offsettarget

aPackedPoint

int yint x

Object header

Object field / data

Page 30: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

30 © 2013 IBM Corporation

Packed Objects: Under the covers

int yint x

aPoint

Object header

Object field / data

offsettarget

aPackedPoint

int yint x

Page 31: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

31 © 2013 IBM Corporation

Packed Objects: In Practice

int yint x

aPoint

int yint x

aPointPoint ePoint s

aLine

Object header

Object field / data

Page 32: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

32 © 2013 IBM Corporation

Packed Objects: In Practice

int yint x

aPoint

int yint x

aPointPoint ePoint s

aLine

int yint x

int yint x

aPackedLine

offsettarget

Object header

Object field / data

Page 33: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

33 © 2013 IBM Corporation

Packed Objects: In Practice

int yint x

aPoint

int yint x

aPointPoint ePoint s

aLine

int yint x

int yint x

aPackedPoint s

aPackedPoint e

aPackedLine

offsettarget

Object header

Object field / data

Page 34: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

34 © 2013 IBM Corporation

Packed Objects: In Practice

int yint x

aPoint

int yint x

aPointPoint ePoint s

aLine

int yint x

int yint x

aPackedPoint s

aPackedPoint e

@Packedfinal class PackedPoint extends PackedObject {

int x;int y;

}

@Packedfinal class PackedLine extends PackedObject {

PackedPoint s;PackedPoint e;

}

aPackedLine

offsettarget

Object header

Object field / data

Page 35: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

35 © 2013 IBM Corporation

Packed Objects: In Practice

int yint x

aPoint

int yint x

aPointPoint ePoint s

aLine

int yint x

int yint x

PackedPoint p = aPackedLine.e

offsettarget

aPackedPoint

aPackedLine

offsettarget

Object header

Object field / data

Page 36: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

36 © 2013 IBM Corporation

Packed Objects: In Practice with Native Access

int yint x

Java Native

struct Point { int x; int y;}

Page 37: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

37 © 2013 IBM Corporation

Packed Objects: In Practice with Native Access

int yint x

offsettarget

aPackedPoint

Java Native

struct Point { int x; int y;}

@Packedfinal class PackedPoint extends PackedObject {

int x;int y;

}

Object header

Object field / data

Page 38: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

38 © 2013 IBM Corporation

Packed Objects: In Practice with Native Access

int yint x

offsettarget

aPackedPoint

Java Native

struct Point { int x; int y;}

Ø

@Packedfinal class PackedPoint extends PackedObject {

int x;int y;

}

Object header

Object field / data

Page 39: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

39 © 2013 IBM Corporation

Lets Build Something in C!

■ Nested substructures

■ Compact representation

■ Alignment aspects

struct Address { char[4] addr; short port;}struct Header { struct Address src; struct Address dst;}

struct Header

portaddr

Address src

Address dstport

addr

Page 40: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

40 © 2013 IBM Corporation

Let’s Build the Same “Something” in Java!

■ Headers

■ No locality

■ Alignment

class Address {byte[] addr;short port;

}

class Header {Address src;Address dst;

}

Address

portaddr

addrHeader

Address dstAddress src

Address

portaddr

addr

byte[]

byte[]

Page 41: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

41 © 2013 IBM Corporation

What if we did this with Packed Objects?

■ The Java code is pretty clean… and a pretty good result!

@Packedfinal class Address extends PackedObject {

PackedByte[[4]] addr;short port;

}

@Packedfinal class PacketHeader extends PackedObject {

Address src;Address dest;

}

portaddr

Address src

Address dst

portaddr

offsettarget

aPacketHeader

Page 42: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

42 © 2013 IBM Corporation

What about native access?

Java Native

anObject

How do we implement this normally?

portaddr

portaddr

Page 43: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

43 © 2013 IBM Corporation

JNI implementation

■ Usual “stash pointers in long types” tricks

■ JNI costs tend to be high

Page 44: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

44 © 2013 IBM Corporation

DirectByteBuffer implementation

■ No extra JNI to write (this is good)

■ Keeping your indices straight is never fun

Page 45: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

45 © 2013 IBM Corporation

Unsafe implementation

■ You shouldn’t be here

■ Still playing the indices game

Page 46: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

46 © 2013 IBM Corporation

PackedObject answer

■ Looks like natural Java code

■ Foregoes JNI

■ Same type capable of on-heap representation

portaddr

portaddr

offsettarget

aPacketHeader

Ø

Page 47: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

47 © 2013 IBM Corporation

Active work and next steps

■ Experimenting with this now

■ Yes, there are security aspects to be aware of here

■ This is potentially part of a larger look at Java / Platform interop

■ Not specifically viewed as a cure to GC problems

■ This forms the basis for many other solutions to existing problems…

Page 48: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

48 © 2013 IBM Corporation

Questions?

Page 49: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

49 © 2013 IBM Corporation

References

■ Get Products and Technologies:– IBM Java Runtimes and SDKs:

• https://www.ibm.com/developerworks/java/jdk/– IBM Monitoring and Diagnostic Tools for Java:

• https://www.ibm.com/developerworks/java/jdk/tools/

■ Learn:– IBM Java InfoCenter:

• http://publib.boulder.ibm.com/infocenter/java7sdk/v7r0/index.jsp

■ Discuss:– IBM Java Runtimes and SDKs Forum:

• http://www.ibm.com/developerworks/forums/forum.jspa?forumID=367&start=0

Page 50: New JVM Features – Multitenancy and Packed Objects · THE INFORMATION CONTAINED IN THIS PRESENTATION IS PROVIDED FOR ... Each customer is a tenant. –Tenants can customize some

50 © 2013 IBM Corporation

Copyright and Trademarks

© IBM Corporation 2013. All Rights Reserved.

IBM, the IBM logo, and ibm.com are trademarks or registered trademarks of International Business Machines Corp., and registered in many jurisdictions worldwide.

Other product and service names might be trademarks of IBM or other companies.

A current list of IBM trademarks is available on the Web – see the IBM “Copyright and trademark information” page at URL: www.ibm.com/legal/copytrade.shtml