X

Jeff Taylor's Weblog

Solaris Containers & 32-bit Java Heap allocation

A note from Steve Dertien at PTC:

Jeff,

We’ve
solved the memory issue with
zones.  The issue is impacted by the kernel version on the server and
the
zone type that they have created.

What
we’ve discovered is that older kernel versions do not
adequately support the larger heap sizes in a whole zone
configuration. 
The kernel version can be output using uname –a as follows.

#
uname -a

SunOS
mlxsv016
5.10 Generic_137111-04
sun4v sparc SUNW,T5240

With
that particular version you can allocate a JVM with a 2Gb
heap in the global zone and in a sparse zone.  In a whole zone you will
not be able to allocate the full 2Gb to the JVM.  The output of a JVM
failure will look like the following in this case:

#
./java -Xmx2048m -version

Error
occurred
during initialization of VM

Could
not
reserve enough space for object heap

Could
not
create the Java virtual machine.


This
issue is resolved when you upgrade the kernel to a newer
version.  The Sun servers at PTC are using a newer version of the kernel
and
therefore we’re not experiencing this issue.  For Windchill support
on Solaris zones (whole or sparse) we should indicate that the customer
must be
on this kernel version or newer (assuming this does not regress).

#
uname -a

SunOS
edc-sunt5120 5.10 Generic_137137-09
sun4v sparc SUNW,SPARC-Enterprise-T5120

I
don’t know if there are newer kernel versions but we
should probably put a customer document together that states when running Windchill
in a
Solaris zone of any kind that the kernel must be patched to this level
or
higher and how to test for this condition. 
[Jeff adds: See http://blogs.sun.com/patch/entry/solaris_10_kernel_patchid_progression] Also, this issue does not
exist with the 64bit JVM when the –d64 option is supplied to the
command.

This
is the definition of a whole zone versus a sparse zone
(lifted from here: http://opensolaris.org/os/community/zones/faq/)

Q: What is a global zone? Sparse-root zone?
Whole-root
zone? Local zone?


A: After installing Solaris 10 on a system, but before creating any
zones, all
processes run in the global zone. After you create a zone, it has
processes
that are associated with that zone and no other zone. Any process
created by a
process in a non-global zone is also associated with that non-global
zone.

Any
zone which is not the global zone is called a non-global zone. Some
people call
non-global zones simply "zones." Others call them "local
zones" but this is discouraged.

The
default zone filesystem model is called "sparse-root." This model
emphasizes efficiency at the cost of some configuration flexibility.
Sparse-root zones optimize physical memory and disk space usage by
sharing some
directories, like /usr and /lib. Sparse-root zones have their own
private file
areas for directories like /etc and /var. Whole-root zones increase
configuration flexibility but increase resource usage. They do not use
shared
filesystems for /usr, /lib, and a few others.


There is no supported way to convert an existing sparse-root zone to a
whole-root zone. Creating a new zone is required.

Wikipedia
also indicates that the penalty for a Whole-zone is
mitigated if the file system that the zone is installed on is a ZFS
clone of
the global image.  This means that the system will only require
additional
file system space for data that uses different blocks.  Essentially two
copies of the same thing occupy only one block of space instead of the
traditional two.  For those that are concerned about the consumed disk
space for whole zones, that can be mitigated using the ZFS file system.

Instructions
for creating a sparse zone are outlined rather well
here: http://www.logiqwest.com/dataCenter/Demos/RunBooks/Zones/createBasicZone.html

Instructions
for creating a whole zone are outlined rather well
here: http://www.logiqwest.com/dataCenter/Demos/RunBooks/Zones/createSelfContainedZone.html

The
major difference is in the second step.  A sparse zone
uses the “create” command while a whole zone uses “create -b”. 
Jeff Taylor also sent a link to a nice tool called Zonestat (http://opensolaris.org/os/project/zonestat/). 
The output of the tool does a great job at showing you the distribution
of
resources across the zones.  The command below assumes that you placed
the
zonestat.pl script into /usr/bin as it does not exist by default.

# perl /usr/bin/zonestat.pl

       |--Pool--|Pset|-------Memory-----|


Zonename| IT|Size|Used| RAM| Shm| Lkd| VM|


------------------------------------------


 global  0D   64  0.0 318M  0.0  0.0 225M


edc-sne  0D   64  0.0 273M  0.0  0.0 204M


edc-sne2  0D   64  0.0 258M  0.0  0.0 190M


==TOTAL= ===   64  0.0 1.1G  0.0  0.0 620M


One
last detail.  To get the configuration of a zone we
should ask customers for the output of their zone configuration by
using the zonecfg
utility from the root zone.  The commands that will work the best is
either “zonecfg -z <zone_name> info” or “zonecfg -z
<zone_name>
export”.  We need to carefully evaluate any capped-memory settings
or other settings defined in the zone to determine if those are also
causing
any potential issues for Windchill.  The output of that command will
indicate whether the zone is a sparse or whole zone as the inherit
section is
likely not there in a whole zone.

SPARSE/SHARED
ZONE

# zonecfg -z edc-sne info

zonename: edc-sne

zonepath:
/home/edc-sne

brand: native

autoboot: true

bootargs:

pool:

limitpriv:

scheduling-class:

ip-type:
shared

inherit-pkg-dir:

       
dir: /lib

inherit-pkg-dir:

       
dir: /platform

inherit-pkg-dir:

       
dir: /sbin

inherit-pkg-dir:

       
dir: /usr

net:

        address:
132.253.33.85

        physical:
e1000g0

       
defrouter: 132.253.33.1

WHOLE
ZONE

# zonecfg -z edc-sne2 info

zonename: edc-sne2

zonepath:
/home/edc-sne2

brand: native

autoboot: true

bootargs:

pool:

limitpriv:

scheduling-class:

ip-type: shared

net:

        address:
132.253.33.86

        physical:
e1000g0

       
defrouter: 132.253.33.1

The
export command will allow use to create the zones internally
for our own testing purposes and they should contain the create command
that
was leveraged, but it’s misleading.  If you use the standard “create”
command it will automatically create the required inherited
properties. 
But the export command will use “create –b” and you will see several
of the following instead:

add
inherit-pkg-dir

set dir=/sbin

end

I
currently do not have an opinion as to whether we want to
advocate a Whole vs. Sparse zone.  It seems a Whole zone creates more
independence from the global zone.  This may be necessary if you want
to
have more absolute control over the configuration.

Best
Regards,

Steve

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.