Category: Server Administration

Question: Single JVM for Web Server

I am having trouble with memory on my VMWare instance of PeopleSoft.  I think a lot of the memory is going to the java virtual machine.  If I look in task manager, I find multiple javaw.exe listings.  Each one takes up at least 50M of memory.  When I use the process explorer, I find that they are all launched by the oracle application server, which is the web server for PeopleSoft.  I can understand having that many instances for production use, but this is just for development and testing.

Does anyone know how I can get the system to consolidate and use only one JVM instance?

Making All Tablespaces Autoextend

During an install of Financials 8.9, I had trouble with some of my tablespaces not autoextending. When I went to load the PPLTLS84CUR project, Application Designer failed saying the PTTBL tablespace was full.

Here is some SQL that I used:

This showed me all of the data files that were not auto-extending:

SELECT * FROM DBA_DATA_FILES

WHERE AUTOEXTENSIBLE = 'NO';

This generated the SQL required to make all of the tablespaces auto-extending

SELECT 'ALTER DATABASE DATAFILE ''' || file_name || ''' AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;' FROM DBA_DATA_FILES

WHERE AUTOEXTENSIBLE = 'NO';

HCM9.0: Reclaiming Index Space

Analysis

Determining largest indexes by blocks

select index_name, leaf_blocks, num_rows
from dba_indexes
where owner = 'SYSADM'
and leaf_blocks is not null
order by leaf_blocks desc;

Determining indexes with the most free space

I found that the index with the most free space only had 32M free.


select a.owner, a.index_name, a.leaf_blocks, a.num_rows, b.tablespace_name,
b.blocks, b.blocks - a.leaf_blocks free_blocks,
(b.blocks - a.leaf_blocks) * to_number(p.value) / 1024 freespace_k
from dba_indexes a, dba_segments b, v$parameter p
where p.name = 'db_block_size'
and a.owner not in ('SYS', 'SYSTEM')
and a.index_type <> 'BITMAP'
and a.leaf_blocks is not null
and a.owner = b.owner
and a.index_name = b.segment_name
order by free_blocks desc;

Determining index space used by empty tables

One thing I noticed in the previous selection is that a number of indexes were on tables that had no rows, but the index had 128K allocated to them. I found that 21606 indexes matched this scenario totaling about 21G of unused space!

select count(*), sum(b.blocks), sum(b.blocks) * max(to_number(p.value)) / 1024 total_kilobytes
from dba_indexes a, dba_segments b, v$parameter p
where a.index_type <> 'BITMAP"
and a.owner = b.owner
and a.index_name = b.segment_name
and a.leaf_blocks = 0
and a.num_rows = 0
and b.blocks = 128;

Finding the PeopleSoft record name for the Oracle index name

In order to be able to put all of these changes into a PeopleSoft Project, I need to be able to tie the index to a PeopleSoft record. Here is an example join for dba_indexes and PSRECDEFN:

select o.index_name, o.table_name, r.recname
from dba_indexes o, psrecdefn r
where (r.sqltablename = o.table_name or (r.sqltablename = ' ' and o.table_anme = 'PS_' || r.recname))
and rownum < 5;

Creating a Project

I wanted to make PeopleSoft do most of the leg work, and so, my next step was to create a project in Application Designer. This way Application Designer will create all of the project header rows in the database (ex: PSPROJECTDEFN, etc.). I had to add the record for the first index just to be able to save the project. I did all this part manually in Application Designer.

I saved my project as SP_INDEX_REBUILD, but you can choose whatever name you would like. Just make sure that you change the name in the SQL below to the name that you choose.

You can use the first row in the project item table as a template for inserting the rest.

select * from psprojectitem
where projectname = 'SP_INDEX_REBUILD';

So, to insert the rest of the tables into the project, I used the statement in the database:

insert into psprojectitem
select distinct 'SP_INDEX_REBUILD', 0, 1, r.recname, 0, ' ', 0, ' ', 0, ' ', 0, 0, 0, 0, 1, 0
from dba_indexes a, dba_segments b, v$parameter p, psrecdefn r
where (r.sqltablename = a.table_name or (r.sqltablename = ' ' and a.table_name = 'PS_' || r.recname))
and p.name = 'db_block_size'
and a.index_type <> 'BITMAP'
and a.owner = b.owner
and a.index_name = b.segment_name
and a.leaf_blocks = 0
and a.num_rows = 0
and b.blocks = 128
and not exists (select 'x' from psprojectitem where projectname = 'SP_INDEX_REBUILD' and objectvalue1 = r.recname);

Warning: this statement did take some time to run. You may want to see if you can optimize it a little. It took about 20 minutes to complete.

Before I could see the new records attached to the project in Application Designer I had to clear the cache in Configuration Manager.

Inserting Rows for DDL

insert into psidxddlparm
select distinct recname, indexid, 2, 0, 'INIT', 0
from pskeydefn k, psprojectitem p
where k.recname = p.objectvalue1
and p.projectname = 'SP_INDEX_REBUILD'
and not exists (select 'x' from psidxddlparm i
where recname = i.recname
and indexid = i.indexid
and platformid = 2
and parmname = 'INIT');

Updating the rest of the rows

update psidxddlparm
set parmvalue = 0
where recname in (select objectvalue1
from psprojectitem
where objectvalue1 = recname);

Updating the Indexes

I cleared the cache to make sure that Application Designer recognized the new changes that I made in the database.

Then, just changing the indexes is not enough the make Application Designer realize that there is something that needs to be rebuilt. So, you have to change the build properties. On the Alter tab, make sure to “Alter even if no changes”. Then, build the project. I had to use the Alter tables options and not just the Create Indexes option to get it to build.

Added line to init.ora

db_2k_cache_size = 10M

If you don’t add this like, you will get the error message: “ORA-29339: tablespace block size 2048 does not match configure block sizes”.

Creating the new tablespace
create tablespace sp_empty_index
datafile ‘e:\oradata\HCM90\SP_EMPTY_INDEX.DBF’
size 10m
blocksize 2k
extent management local autoallocate
segment space management auto;

ALTER DATABASE DATAFILE ‘e:\oradata\HCM90\SP_EMPTY_INDEX.DBF’
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED;

insert into psidxddlparm
select distinct recname, indexid, 2, 0, ‘INDEXSPC’, ‘sp_empty_index’
from pskeydefn k, psprojectitem p
where k.recname = p.objectvalue1
and p.projectname = ‘SP_INDEX_REBUILD’
and not exists (select ‘x’ from psidxddlparm i
where k.recname = i.recname
and k.indexid = i.indexid
and i.platformid = 2
and i.parmname = ‘INDEXSPC’);

update psidxddlparm
set parmvalue = ‘sp_empty_index’
where recname in (select objectvalue1
from psprojectitem
where objectvalue1 = recname)
and platformid = 2
and parmname = ‘INDEXSPC’;

select ‘alter index sysadm.’ || indexname || ‘ rebuild tablespace sp_empty_index;’
from (select distinct ‘PS’ || indexid || recname as indexname
from pskeydefn
where recname in (select objectvalue1
from psprojectitem
where objectvalue1 = recname)) a;

Reclaiming Space for the File System

I used the notes I made for resizing the database to get the free space to the file system.

PSINDEX was 47.89% free — 13.28G free.

Resources

DBAZine.com: Indexes – Part 2: Is This Index the Right Size?

recycle and keep buffers in other tablespace block sizes

HCM9.0: Resizing the Virtual Hard Drive

Once I reclaimed the hard drive space from my database, I had to shrink the hard drive in order to get my image smaller. Here is what I did.

Shrinking the Partition

I used a version of Linux called Knoppix. You can download it from here.

I never actually burned the image to CD. I just opened the properties of the CD drive in the virtual machine (while it was shutdown) and told it to use the iso image that I downloaded instead of the physical drive.

Determining the how small you can shrink the drive:

sudo ntfsresize --info /dev/sda1

Changing the size of the drive (test)

sudo ntfsresize --no-action --size=42831122432 /dev/sda1

Changing the size of the drive

sudo ntfsresize --size=42831122432 /dev/sda1

Changing the size of the partition

sudo fdisk /dev/sda

  • m for help
  • p for print (note the partition number and type/id)
  • d for delete
  • n for new partition (choose primary and same partition number and desired size +###M)
  • t for changing the partition type/id
  • p for print ( verify everything is the correct)
  • w for write

Shrinking an Unshrinkable Hard Drive

The only way that you can get a smaller hard drive if you can’t shrink the drive is to copy the data to a new virtual drive.

Copy the partition table.

sudo dd if=/dev/sda of=/dev/sdb bs=512 count=1

Copy the partition itself.

sudo dd if=/dev/sda1 of/dev/sdb1

Note: I had to reboot between copying the partition table and the actual partition.

Shrinking a Shrinkable Hard Drive

Shutdown the virtual machine.

From a command window run:

"C:\Program Files\VMware\VMware Server\vmware-mount " m: c:\VirtualMachines\HCM90\Database.vmdk
"C:\Program Files\VMware\VMware Server\vmware-vdiskmanager.exe" -p m:
"C:\Program Files\VMware\VMware Server\vmware-mount " m: /d
"C:\Program Files\VMware\VMware Server\vmware-vdiskmanager.exe" -k WindowsServer2003Standard.vmd

Note: to expand, you would use the -x option

"C:\Program Files\VMware\VMware Server\vmware-vdiskmanager.exe" -x 30Gb WindowsServer2003Standard.vmdk

HCM9.0: Automatic Windows Login for VMWare

You would never want to do this in the corporate world, but with a test VMWare instance, it makes sense. I am already logging into the host machine, and so, why should I log into the VMWare machine again each time that I boot it.

So. I used the link below to have the machine automatically login when it boots:

How to turn on automatic logon in Windows XP

It did work for Windows Server 2003. I used the registry method, but I opened the dialog with the Start > Run … control userpasswords2, and it looked like it would have worked as well.

HCM9.0: Compiling COBOL

Here are the commands that I executed in a command window. Adjust the paths as necessary.
set PS_HOME=c:\pshome\hcm90
set PATH=%ps_home%\src\cbl\win32;%path%
set COBROOT="c:\program files\micro focus\net express\base"
cd %PS_HOME%\setup
cblbld c: \temp\compile

(make sure you have a space between the c: and the \temp\compile)

Here is the output:

ASCII Cobol Compilations Proceeding
Creating Directory c:\temp\compile
Logging progress to file c:\temp\compile\CBLBLD.LOG
COBOL compiler found in “c:\program files\micro focus\net express\base”
The system cannot find the path specified.
Target directory (c:\pshome\hcm90\CBLBINA) exists and is writable

Copying source files …

Building the COBOL targets …
……

That is all there is to it!

HCM9.0: Init Ora File

Here is my Init Ora file for the database of my VMWare image. Hope this helps if you are attempting something similar.  This is what I finally got to work during installation.

DB_NAME = hcm90
DB_FILES = 1021
CONTROL_FILES = (E:\oradata\hcm90\CONTROL01.CTL,
E:\oradata\hcm90\CONTROL02.CTL,
E:\oradata\hcm90\CONTROL03.CTL)
OPEN_CURSORS = 255
db_block_size = 8192
UNDO_MANAGEMENT = AUTO
shared_pool_size = 72265318

Note: I am still trying to get the shared pool size to a good number.  I have lowered it considerably, but before I post that, I need to work out the kinks.  I had to have the shared pool size at 72,265,318 in order to get it to install.  When I had it set lower, I got an error message about memory.

HCM9.0: Resizing the Database

The database of my PeopleSoft HRMS 9.0 VMWare Image was larger than I expected. I had to get the database down to a manageable size so that we can easily make backup copies of the image. Here is what I did:

  • Starting Size: 63.6 Gb
  • Finishing Size: 39.8 Gb

Query to Determine Where to Free Up Space

SELECT a.tablespace_name,
total_free_space,
ROUND(total_free_space / 1042, 2) free_k,
ROUND(total_free_space / 1042 / 1042, 2) free_m,
ROUND(total_free_space / 1042 / 1042 / 1042, 2) free_g,
largest_free_extent,
total_size,
ROUND(total_free_space / total_size *100, 2) percent_free
FROM
(SELECT tablespace_name,
SUM(bytes) total_free_space,
MAX(bytes) largest_free_extent
FROM dba_free_space
GROUP BY tablespace_name)
a,
(SELECT tablespace_name,
SUM(bytes) total_size
FROM dba_data_files
GROUP BY tablespace_name)
b
WHERE a.tablespace_name = b.tablespace_name
ORDER BY 2 DESC;

Query to Determine Files for the Tablespace

SELECT file_name,
file_id,
tablespace_name,
bytes,
ROUND(bytes / 1042 / 1042, 2) mb,
maxbytes,
ROUND(maxbytes / 1042 / 1042, 2) maxmb,
(SELECT ROUND(SUM(bytes) / 1024 / 1024, 2) mb
FROM dba_segments
WHERE tablespace_name = a.tablespace_name
AND header_file = a.file_id)
used_mb,
(SELECT ROUND(((header_block + blocks) *8192) / 1024 / 1024, 2) end_mb
FROM dba_segments
WHERE tablespace_name = a.tablespace_name
AND header_block =
(SELECT MAX(header_block)
FROM dba_segments
WHERE tablespace_name = a.tablespace_name)
)
lastused_position
FROM dba_data_files a
WHERE tablespace_name = ‘PSDEFAULT’;

How I Resized My Tablespaces

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\PSINDEX2.DBF’
RESIZE 6266M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\SYSTEM01.DBF’
RESIZE 600M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\PSIMAGE.DBF’
RESIZE 1300M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\TLWORK.DBF’
RESIZE 477M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\TLAPP.DBF’
RESIZE 80M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\GPAPP.DBF’
RESIZE 890M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\PSUNDOTS01.DBF’
RESIZE 150M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\HRLARGE.DBF’
RESIZE 650M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\PTTLRG.DBF’
RESIZE 300M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\HRAPP.DBF’
RESIZE 375M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\SAAPP.DBF’
RESIZE 325M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\CCAPP.DBF’
RESIZE 290M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\PY0LRG.DBF’
RESIZE 280M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\PTTBL.DBF’
RESIZE 250M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\FAAPP.DBF’
RESIZE 225M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\TLLARGE.DBF’
RESIZE 210M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\AAAPP.DBF’
RESIZE 170M;

ALTER DATABASE DATAFILE ‘E:\ORADATA\HCM90\PSDEFAULT.DBF’
RESIZE 5M;

Resources

Tablespace Information

Alter Tablespace Syntax

Oracle Data & Temp Files

PeopleSoft 9.0 Hard Drive Space

Here is a list of the directories on my PeopleSoft 9.0 HRMS image and their sizes. Hopefully, this will give you an idea of the hard drive space required to install PeopleSoft 9.0 should you want to do something similar.

c:\ 22.2 GB used / 2.75 GB free = 24.9 GB total
  c:\bea = 176 MB
    c:\bea\jre142 = 40.0 MB
    c:\bea\Tuxedo9.1 = 135MB
  c:\Documents and Settings = 598 MB
  c:\install = 1.72 GB
  c:\NetExpressRuntime = 1.38 MB
  c:\oracle = 2.67 GB
    c:\oracle\appserv10g = 738 MB
    c:\oracle\oradata = 1.46 GB
  c:\Program Files = 529 MB
  c:\ps = 303 MB
  c:\psca = 91.6 MB
  c:\pshome = 10.6 GB
    c:\pshome\hcm90\bin = 296 MB
    c:\pshome\hcm90\data = 3.78 GB
    c:\pshome\hcm90\projects = 2.70 GB
    c:\pshome\hcm90\setup = 855 MB
    c:\pshome\hcm90\src = 225 MB
    c:\pshome\hcm90\verity = 2.07 GB
  c:\windows = 2.7 GB
e:\ 63.6 GB used / 16.3 GB free = 79.9 GB total
  e:\oradata\hcm90\PSINDEX.DBF = 23.4 GB
  e:\oradata\hcm90\PSINDEX2.DBF = 23.4 GB
  e:\oradata\hcm90\PSIMAGE.DBF = 2.04 GB
  e:\oradata\hcm90\SYSTEM01.DBF = 2.04 GB
  e:\oradata\hcm90\GPAPP.DBF = 21.94 GB
  e:\oradata\hcm90\TLWORK.DBF = 1.24 GB
  e:\oradata\hcm90\HRLARGE.DBF = 942 MB
  e:\oradata\hcm90\TLAPP.DBF = 800 MB