Creation Zone

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg

Sunday, 22 February 2009

PeopleSoft HRMS 8.9 Self-Service Benchmark on M3000 & T5120 Servers

Posted on 01:31 by Unknown
Sun published the PeopleSoft HRMS 8.9 Self-Service benchmark results today. The benchmark was conducted on 3 x Sun SPARC Enterprise M3000 and 1 x Sun SPARC Enterprise T5120 servers. Click on the following link for the full report with the benchmark results.

PeopleSoft HRMS 8.9 SELF-SERVICE Using ORACLE on Sun SPARC Enterprise M3000 and Enterprise T5120 Servers

Admittedly it is Sun's first PeopleSoft benchmark after a hiatus of over five years. However I am glad that we came up with a very nice cost effective solution in our comeback effort to the PeopleSoft applications' benchmarking.

Some of the notes and highlights from this competitive benchmark are as follows.
  • The benchmark measured the average search and save transaction response times at a peak load of 4,000 concurrent users.

  • 4,000 users is the limitation of the benchmark kit. All vendors using this benchmark kit are bound to this limitation. Hence it is easy to compare the performance as the throughput achieved by each vendor will be the same. In comparing the benchmark results from workloads like these, lower average [transaction response times, CPU, memory utilizations] and the hardware in use (lesser the better), usually indicate better performance.

  • IBM and Sun are the only vendors who published benchmark results with PeopleSoft HRMS 8.9 Self-Service benchmark kit.

  • Sun's benchmark results are superior relative to IBM's best published result on a combination of z990 2084-C24 and eServer pSeries p690 servers. While I leave the price comparisons to the reader1, I'd like to show the performance numbers extracted from the benchmark reports published by Sun and IBM. All the following data/information is available in the benchmark reports. Feel free to draw your own conclusions.

    Average Transaction Response Times


    VendorSingle User
    Search (sec)
    4,000 Users
    Search (sec)
    Single User
    Save (sec)
    4,000 Users
    Save (sec)
    Sun0.780.770.710.74
    IBM0.781.350.651.01


    Average CPU Utilizations



    VendorWeb Server
    CPU%
    App Server1
    CPU%
    App Server2
    CPU%
    DB Server
    CPU%
    Sun23.1066.9267.8527.45
    IBM45.8159.70N/A40.66


    Average Memory Utilizations



    VendorWeb Server
    GB
    App Server1
    GB
    App Server2
    GB
    DB Server
    GB
    Sun4.153.673.725.54
    IBM5.0015.70N/A0.3 (Huh!?)


    Hardware Configuration

    Vendor: Sun Microsystems

    Topology Diagram

    topology






    TierServer
    Model
    Server
    Count
    ProcessorProcessor
    Speed
    Processor
    Count
    #Cores per
    Processor
    Memory
    WebT51201UltraSPARC-T21.2 GHz148 GB
    AppM30002SPARC64-VII2.52 GHz148 GB
    DBM30001SPARC64-VII2.52 GHz148 GB


    2 x Sun Storage J4200 arrays were used to host the database. Total disk space: ~1.34 Terabytes. Consumed only 120 GB disk space -- 115 GB for data on one array; and 5 GB for redo logs on the other array.

    Vendor: IBM





    TierServer
    Model
    Server
    Count
    ProcessorProcessor
    Speed
    Processor
    Count
    #Cores per
    Processor
    Memory
    Webp690 (7040-681)1POWER41.9 GHz4NA (?)12 GB
    Appp690 (7040-681)1POWER41.9 GHz12NA (?)32 GB
    DBzSeries 990, model 2084-C241z990 Gen1???6NA (?)32 GB


    1 x IBM TotalStorage DS8300 Enterprise Storage Server, 2107-922 ws used to host the database. Total disk space: ~9 Terabytes.

  • The combination of Sun SPARC Enterprise M3000 and T5120 servers consumed 1030 Watts on the average in a 7RU space in achieving 4,000 concurrent users. That is, in the case of similarly configured workloads, M3000/T5120 support 3.88 users per watt of the power consumed; and 571 users per rack unit.


Just like our prior Siebel and Oracle E-Business Suite Payroll 11i benchmarks, Sun collaborated with Oracle Corporation in executing this benchmark. And we sincerely thank our peers at Oracle Corporation for all their help and support over the past few months in executing this benchmark.
___________

I'm planning to post some of the tuning tips to run PeopleSoft optimally on Solaris 10. Stay tuned ..


(Originally posted on blogs.sun.com at:
http://blogs.sun.com/mandalika/entry/peoplesoft_hrms_8_9_self
)

________________
Technorati Tags:
 Solaris |  sun |  oracle |  peoplesoft |  hrms |  benchmark |  m3000 |  t5120

1: It is relatively hard to obtain IBM's server list prices. On the other hand, it is very easy to find the list prices of Sun servers' from http://store.sun.com
Read More
Posted in | No comments

Wednesday, 11 February 2009

Mounting Windows' NTFS on [Open]Solaris x86/x64

Posted on 01:47 by Unknown
The steps outlined in this blog post are derived from the Miscellaneous filesystem support for OpenSolaris on x86 web page. I just added few examples to illustrate the steps to mount a partition with NTFS filesystem that exists on the external hard drive (in this case, it is a Seagate FreeAgent external hard drive).

Step-by-Step instructions to mount NTFS filesystem on [Open]Solaris
  1. Install the packages : FSWpart and FSWfsmisc.
    • Download http://www.belenix.org/binfiles/FSWpart.tar.gz and http://www.belenix.org/binfiles/FSWfsmisc.tar.gz

    • Uncompress and install the packages with 'root' privileges.

      % gunzip -c FSWpart.tar.gz | tar xvf -
      # pkgadd -d . FSWpart

      % gunzip -c FSWfsmisc.tar.gz | tar xvf -
      # pkgadd -d . FSWfsmisc


  2. Find the logical device name for the NTFS partition. -l option of the rmformat command lists all removable devices along with their device names.


    # rmformat -l
    Looking for devices...
    1. Logical Node: /dev/rdsk/c1t0d0p0
    Physical Node: /pci@0,0/pci-ide@1f,1/ide@1/sd@0,0
    Connected Device: MATSHITA UJDA750 DVD/CDRW 1.60
    Device Type: DVD Reader
    Bus: IDE
    Size:
    Label:
    Access permissions:
    2. Logical Node: /dev/rdsk/c2t0d0p0
    Physical Node: /pci@0,0/pci1179,1@1d,7/storage@1/disk@0,0
    Connected Device: Seagate FreeAgentDesktop 100F
    Device Type: Removable
    Bus: USB
    Size: 953.9 GB
    Label:
    Access permissions:


  3. Identify the NTFS partition on the external disk with the help of fdisk


    # fdisk /dev/rdsk/c2t0d0p0
    Total disk size is 60800 cylinders
    Cylinder size is 32130 (512 byte) blocks

    Cylinders
    Partition Status Type Start End Length %
    ========= ====== ============ ===== === ====== ===
    1 IFS: NTFS 0 60800 60801 100

    SELECT ONE OF THE FOLLOWING:
    1. Create a partition
    2. Specify the active partition
    3. Delete a partition
    4. Change between Solaris and Solaris2 Partition IDs
    5. Exit (update disk configuration and exit)
    6. Cancel (exit without updating disk configuration)
    Enter Selection: 6
    #

    In this example, partition #1 i.e., c2t0d0p1 has the NTFS filesystem.

  4. Mount the NTFS partition just like mounting an UFS filesystem using the mount command. Use the argument ntfs to the command line option -F. Since the filesystem was mounted in a slightly different way than the conventional way, use /usr/bin/xlsmounts to see the detailed mount table information.


    # mount -F ntfs /dev/dsk/c2t0d0p1 /mnt

    # /usr/bin/xlsmounts
    PHYSICAL DEVICE LOGICAL DEVICE FS PID ADDR Mounted on
    /dev/dsk/c2t0d0p1 /dev/dsk/c2t0d0p1 ntfs 6755 127.0.0.1:/ /mnt

    # ls /mnt
    expForSun.dmp MySQL5.1 RECYCLER
    medium-64-bit $RECYCLE.BIN System Volume Information

    Notice the 127.0.0.1:/ under ADDR column in the output of xlsmounts. NTFS mount uses userland NFSv2 server to access the filesystems on raw partitions. That is why the mount was shown as NFS client mounted from 127.0.0.1:/

  5. To unmount the NTFS filesystem, use /usr/bin/xumount. Solaris standard umount command unmounts the filesystem but does not terminate the background NFS server process.


    # /usr/bin/xumount /mnt

    - OR -

    # /usr/bin/xumount /dev/dsk/c2t0d0p1


Check the Miscellaneous filesystem support for OpenSolaris on x86 page and Moinak Ghosh's blog post Mount and Access NTFS and Ext2FS from Solaris x86 for the rest of the fine details.

(Originally posted on blogs.sun.com at:
http://blogs.sun.com/mandalika/entry/mounting_windows_ntfs_on_open
)
_______________
Technorati Tags:
 Solaris |  OpenSolaris |  NTFS
Read More
Posted in | No comments

Sunday, 8 February 2009

Workaround to "eject of cdrom /dev/dsk/cxtxdxsx failed" Error on SXCE b106

Posted on 00:12 by Unknown
Symptom

On Solaris Express Community Edition build 106, eject(1) fails intermittently (esp. when inserted the blank media) with the error: eject of cdrom /dev/dsk/cxtxdxsx failed.

# cat /etc/release
Solaris Express Community Edition snv_106 X86
Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 13 January 2009

# eject
eject of cdrom /dev/dsk/c1t0d0s2 failed: A security policy in place prevents this sender
from sending this message to this recipient, see message bus configuration file (rejected
message had interface "org.freedesktop.Hal.Device.Storage" member "Eject" error name
"(unset)" destination "org.freedesktop.Hal")


Solution

Upgrade to snv_107. Meanwhile check the bug #6791982.

Workaround
  1. Edit /etc/dbus-1/system.d/hal.conf.

    Add the following line to the <policy context="default"> section.

    <allow send_interface="org.freedesktop.Hal.Device.Storage"/>

  2. Restart the D-Bus message bus system service.

    svcadm restart svc:/system/dbus:default

    On a totally unrelated note, to see all the existing SMF services with a simple description, run:

    svcs -o FMRI,DESC

  3. Finally try to eject the CD/DVD disk by typing the eject command.

(Originally posted on blogs.sun.com at:
http://blogs.sun.com/mandalika/entry/sxce_snv_106_workaround_to)

_______________
Technorati Tags:
 Solaris |  OpenSolaris |  troubleshooting
Read More
Posted in | No comments

Saturday, 31 January 2009

PHP: Memory savings with mysqlnd

Posted on 19:41 by Unknown
mysqlnd may save memory. In the best cases, it may consume only 50% memory as that of libmysql esp. when the client application does not modify the data in the result set after executing a query. Keep in mind that the client must use ext/mysqli and treat the data returned by the query as read-only in order to fully realize mysqlnd's memory gains. If the client application modifies any of the data, mysqlnd behaves just like libmysql.

Let's have a quick look at the memory consumption in both the cases (mysqlnd and libmysql) with an example before delving into the internals. For easy comparison, the sample PHP script does not modify any of the arrays returned from the fetch method. The following example uses DTrace on Sun Solaris to monitor the calls to malloc() and prints the requested bytes of memory on the standard output.

Source code for the script: PHPmysqliClient.php. MySQL table structure and the sample data are shown in the other blog post: Demonstrating the Features of MySQL Native Driver for PHP, mysqlnd.

bash# cat monitormalloc.d

#!/usr/sbin/dtrace -s

pid$1:libc:malloc:entry
{
printf("\t\tSize : %d Bytes", arg0);
ustack();
@malloc[probefunc] = quantize(arg0);
}

CASE 1: ext/mysqli with libmysql

In one terminal window:

bash# /opt/coolstack/php5/bin/php PHPmysqliClient.php
In another terminal window, run monitormalloc.d `pgrep php` and press any key to continue ..

Retrieved 3 row(s).

CityName
--------
Hyderabad, India
San Francisco, USA
Sydney, Australia

In another terminal window:

bash# ./monitormalloc.d `pgrep php`
dtrace: script './monitormalloc.d' matched 1 probe
CPU ID FUNCTION:NAME
0 80920 malloc:entry Size : 964 Bytes
libc.so.1`malloc
libmysqlclient.so.16.0.0`0xce2173c1
libmysqlclient.so.16.0.0`0xce23bb47
mysqli.so`0xce11d292

0 80920 malloc:entry Size : 20 Bytes
libc.so.1`malloc
libmysqlclient.so.16.0.0`0xce2173c1
libmysqlclient.so.16.0.0`0xce23da60
mysqli.so`0xce11dc72

0 80920 malloc:entry Size : 20 Bytes
libc.so.1`malloc
libmysqlclient.so.16.0.0`0xce2173c1
libmysqlclient.so.16.0.0`0xce21d991
libmysqlclient.so.16.0.0`0xce21d9ce
libmysqlclient.so.16.0.0`0xce23da72
mysqli.so`0xce11dc72

0 80920 malloc:entry Size : 17 Bytes
... elided stack traces for brevity ...
0 80920 malloc:entry Size : 152 Bytes
0 80920 malloc:entry Size : 16384 Bytes
0 80920 malloc:entry Size : 8199 Bytes
0 80920 malloc:entry Size : 7 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 18261 Bytes
0 80920 malloc:entry Size : 58 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 4088 Bytes
0 80920 malloc:entry Size : 120 Bytes
0 80920 malloc:entry Size : 5 Bytes
0 80920 malloc:entry Size : 6 Bytes
0 80920 malloc:entry Size : 5 Bytes
0 80920 malloc:entry Size : 56 Bytes
0 80920 malloc:entry Size : 8164 Bytes
0 80920 malloc:entry Size : 8164 Bytes
0 80920 malloc:entry Size : 92 Bytes
0 80920 malloc:entry Size : 56 Bytes
0 80920 malloc:entry Size : 8164 Bytes
libc.so.1`malloc
libmysqlclient.so.16.0.0`0xce2173c1
libmysqlclient.so.16.0.0`0xce21a27b
libmysqlclient.so.16.0.0`0xce23b8a4
libmysqlclient.so.16.0.0`0xce23d4fa
mysqli.so`0xce11fe56

0 80920 malloc:entry Size : 262144 Bytes
libc.so.1`malloc
php`0x856fb98

^C

malloc
value ------------- Distribution ------------- count
2 | 0
4 |@@@@@ 4
8 | 0
16 |@@@@ 3
32 |@@@@ 3
64 |@@@ 2
128 |@ 1
256 | 0
512 |@ 1
1024 | 0
2048 |@@@@@@@@@@@@@@ 11
4096 |@@@@ 3
8192 |@ 1
16384 |@@@ 2
32768 | 0
65536 | 0
131072 | 0
262144 |@ 1
524288 | 0

CASE 2: ext/mysqli with mysqlnd

In one terminal window:

bash# /export/home/php53/bin/php PHPmysqliClient.php
In another terminal window, run monitormalloc.d `pgrep php` and press any key to continue ..

Retrieved 3 row(s).

CityName
--------
Hyderabad, India
San Francisco, USA
Sydney, Australia

In another terminal window:

bash# ./monitormalloc.d `pgrep php`
dtrace: script './monitormalloc.d' matched 1 probe
CPU ID FUNCTION:NAME
0 80920 malloc:entry Size : 262144 Bytes
libc.so.1`malloc
php`0x82f702b
php`0x82f80ab
php`0x82f841f
php`0x82f98c4
php`0x82c7668
php`0x83c30ae
php`0x80c059c

^C

malloc
value ------------- Distribution ------------- count
131072 | 0
262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
524288 | 0


In the case of ext/mysqli with libmysql, there are more than 25 calls to malloc() accounting to a total size around 367KB, where as in the case of ext/mysqli with mysqlnd, there is only one call to malloc() with a size of 256KB. In other words, mysqlnd is consuming 30% less memory relative to libmysql to do similar database operations (in reality, it is incorrect to treat every byte allocated as the memory consumed unless there exists a corresponding memory mapping -- however for the sake of this discussion, let's just assume that all the allocated bytes are eventually consumed).

The memory savings in the above example are the result of mysqlnd's ability to hold the results only once in the memory. On the other hand, as libmysql is not a part of PHP, some of the results fetched by libmysql will be copied into memory twice. When libmysql fetches the data from the MySQL Server, it puts the data into its own buffers. Then the data gets copied from the libmysql buffers into respective ext/mysqli data structures (often referred as zvals) before it is made available to the PHP clients to consume. So with ext/mysqli and libmysql, there might be two copies of the data in the main memory - one copy inside the libmysql buffers and the other inside zvals. With mysqlnd, there might be only one copy of the data in the memory. mysqlnd also uses buffers but links the zval structures directly to the read buffers, wherever possible. Therefore in majority of the instances, mysqlnd consumes less memory relative to libmysql. In the worst case, it may consume as much memory as that of libmysql. The total memory savings depend on the size of the buffered result set.

Shown below is the simplified behind-the-scenes actions of ext/mysqli with libmysql and ext/mysqli with mysqlnd when mysqli sends a query:

ext/mysqli with libmysql
  1. mysqli sends a query
  2. result set gets fetched into libmysql buffers
  3. mysqli allocates zvals, then new buffers
  4. mysqli copies data from libmysql to its own buffers
  5. mysqli calls mysql_free_result() and deallocates libmysql buffers

ext/mysqli with mysqlnd
  1. mysqli sends a query
  2. result set gets fetched row by row -- every row is a different buffer
  3. mysqlnd creates a result set of zvals pointing to the buffers
  4. mysqli calls mysqlnd_free_result() and deallocates the row buffers

In short, ext/mysqli with libmysql does:
  • one extra allocation for mysqli buffers
  • one extra data copy
  • one extra zval allocation (which can be saved with the zval cache)
when compared to ext/mysqli with mysqlnd.

Related Blog Posts:
  1. MySQL Native Driver for PHP, mysqlnd
  2. Demonstrating the Features of MySQL Native Driver for PHP, mysqlnd

Acknowledgments
Andrey Hristov & Ulf Wendel, Sun-MySQL AB

(Originally posted on blogs.sun.com at:
http://blogs.sun.com/mandalika/entry/php_memory_savings_with_mysqlnd
)
_______________
Technorati Tags:
 PHP |  MySQL |  mysqlnd
Read More
Posted in | No comments

Monday, 26 January 2009

Demonstrating the Features of MySQL Native Driver for PHP, mysqlnd

Posted on 01:06 by Unknown
Support for Persistent Connections

ext/mysqli does not support persistent connections when built with libmysql. However ext/mysqli does support persistent connections when built with mysqlnd. To establish a persistent connection with the MySQL server using ext/mysqli and mysqlnd, prepend the database host with the string "p:" (p stands for persistent) as shown below.

$host="p:localhost";
$port=3306;
$socket="/tmp/mysql.sock";
$user="root";
$password="admin";
$dbname="test";

$cxn = new mysqli($host, $user, $password, $dbname, $port, $socket)
or die ('Could not connect to the database server' . mysqli_connect_error());


ext/mysql, ext/mysqli and PDO_MySQL support persistent connections when built with mysqlnd.

The new API call mysqli_fetch_all()

mysqlnd extends the ext/mysqli API with one brand new method, mysqli_fetch_all().

mysqli_fetch_all() fetches all result rows and return the result set as an associative array, a numeric array, or both. The method signature is shown below for both procedural as well as object oriented style of programming.

Procedural style:
 mixed mysqli_fetch_all (mysqli_result $result [, int $resulttype])

Object oriented style:
 mixed mysqli_result::fetch_all ([int $resulttype])

where: $result is a result set identifier returned by mysqli_query(), mysqli_store_result() or mysqli_use_result(), and $resulttype is an optional constant indicating what type of array should be produced from the current row data. The possible values for this parameter are the constants MYSQLI_ASSOC, MYSQLI_NUM, or MYSQLI_BOTH. Defaults to MYSQLI_NUM.

Because mysqli_fetch_all() returns all the rows as an array in a single step, it may consume more memory than some of its counterparts like mysqli_fetch_array(). mysqli_fetch_array() returns one row at a time from the result set, hence consumes less memory relative to mysqli_fetch_array(). Besides, if you need to iterate over the result set, you may need a foreach() loop and this approach might be little slower compared to the result set retrieval using mysqli_fetch_array(). Hence consider using mysqli_fetch_all() only in those situations where the fetched result set will be sent to another layer for post processing. If you have to process the fetched result set in the same layer with the help of iterators, then the benefit of using the mysqli_fetch_all() method might be minimal, if there is any.

Statistical Data Collection

mysqlnd collects a lot of statistics which you can use to tune your application. mysqlnd enhances ext/mysqli API with three mysqli_get_XX_stats() methods for easy monitoring and to simplify the bottleneck analysis. For example, using a combination of mysqli_get_XX_stats() methods, one can easily identify a PHP client script that is opening more database connections than it needs or selecting more rows than it consumes.

Accessing Client Statistics:

To access per process client statistics, simply call mysqli_get_client_stats() with no arguments. Similarly to access client statistics per connection, call mysqli_get_connection_stats() with the database connection handle as the argument. Both of these methods return an associated array with the name of the statistic parameter as the key and the corresponding data as the value.

Alternatively per process client statistics can be accessed by calling the phpinfo() method.

The above methods return statistics like bytes_sent, bytes_received to represent the number of bytes sent to and received from the MySQL server, result_set_queries to show the number of queries which generated a result set, buffered_sets, unbuffered_sets to show the number of buffered and unbuffered result sets for the queries generating a result set but not run as a prepared statement. rows_fetched_from_server_normal shows the number of rows that have been fetched from the server using buffered and unbuffered result sets. rows_buffered_from_client_normal shows the number of rows fetched from the server and buffered on the client-side, and rows_skipped_normal shows the number of rows generated by the server but not read from the client.

Accessing Zval Cache Statistics:

mysqlnd collects statistics from its internal zval cache, that you can access by calling mysqli_get_cache_stat() method. This method returns an associative array with the name of the statistic as the key and the corresponding data as the value. The zval cache statistics might be useful to tweak zval cahe related php.ini settings for better performance.

Sample PHP Script Demonstrating mysqlnd's Features

The following sample PHP script demonstrates how to:
  • establish persistent connections
  • use mysqli_fetch_all() to fetch and display the result set
  • access client, connection and zval cache statistics using mysqli_get_client_stats(), mysqli_get_connection_stats() and
    mysqli_get_cache_stat()
    methods

The code sample in this tutorial try to retrieve the data from the City table in the MySQL test database. The table structure and the data from the City table are shown below by using the mysql client. MySQL server is running on the default port 3306.

bash# mysql -u root -p
Enter password: admin
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.24-rc-standard Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> USE test;
Database changed

mysql> DESCRIBE City;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| CityName | varchar(30) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
1 row in set (0.07 sec)

mysql> SELECT * FROM City;
+--------------------+
| CityName |
+--------------------+
| Hyderabad, India |
| San Francisco, USA |
| Sydney, Australia |
+--------------------+
3 rows in set (0.17 sec)


The main purpose of the following example is only to illustrate the syntactical use of the new features of mysqlnd. The sample code does not represent any real world scenarios.

bash# cat PHPmysqliClientmysqlnd.php

<?php

/* create a persistent connection to the MySQL server */
$cxn = new mysqli("p:localhost", "root", "admin", "test", 3306, "/tmp/mysql.sock")
or die ('Could not connect to the database server' . mysqli_connect_error());

$query = "SELECT * FROM City";

/* execute the query */
if ($cxn->real_query ($query)) {

/* initiate the result set retrieval */
if ($result = $cxn->store_result()) {

/* find the number of rows in the result set */
$nrows = $result->num_rows;

echo "\nRetrieved $nrows row(s).\n\n";
echo "CityName\n--------\n";

$all_rows = $result->fetch_all(MYSQLI_ASSOC);

for($i = 0; $i < count($all_rows); $i++) {
echo $all_rows[$i][CityName] . "\n";
}
}

/* close the result set */
$result->close();
}

echo "\n\nClient Statistics After One Query\n---------------------------------";
$client_stats = mysqli_get_client_stats();
#var_dump($client_stats);
foreach ($client_stats as $key=>$value) {
if ($value > 0) {
echo "\n$key : $value";
}
}

echo "\n\nStatistics for Connection #1\n----------------------------";
$conn_stats = mysqli_get_connection_stats($cxn);
#var_dump($conn_stats);
foreach ($conn_stats as $key=>$value) {
if ($value > 0) {
echo "\n$key : $value";
}
}

echo "\n\nCache Statistics After One Query\n--------------------------------";
$cache_stats = mysqli_get_cache_stats();
#var_dump($cache_stats);
foreach ($cache_stats as $key=>$value) {
if ($value > 0) {
echo "\n$key : $value";
}
}

echo "\n\n=================================\n\n";
echo "\nEstablishing connection #2 to the MySQL server ..\n\n";

/* create a non-persistent connection to the MySQL server */
$cxn2 = new mysqli("localhost", "root", "admin", "mysql", 3306, "/tmp/mysql.sock")
or die ('Could not connect to the database server' . mysqli_connect_error());

$query = "SELECT Host, User FROM user";

/* execute the query */
if ($cxn2->real_query ($query)) {

/* initiate the result set retrieval */
if ($result = $cxn2->store_result()) {

/* find the number of rows in the result set */
$nrows = $result->num_rows;
echo "\nRetrieved $nrows row(s).\n\n";

echo "Host\t\tUser\n----\t\t----\n";

$all_rows = $result->fetch_all(MYSQLI_ASSOC);

for($i = 0; $i < count($all_rows); $i++) {
echo $all_rows[$i][Host] . "\t" . $all_rows[$i][User] . "\n";
}
}

/* close the result set */
$result->close();
}

echo "\n\nClient Statistics After Two Queries\n-----------------------------------";
$client_stats = mysqli_get_client_stats();
#var_dump($client_stats);
foreach ($client_stats as $key=>$value) {
if ($value > 0) {
echo "\n$key : $value";
}
}

echo "\n\nStatistics for Connection #2\n----------------------------";
$conn_stats = mysqli_get_connection_stats($cxn2);
#var_dump($conn_stats);
foreach ($conn_stats as $key=>$value) {
if ($value > 0) {
echo "\n$key : $value";
}
}

echo "\n\nCache Statistics After Two Queries\n----------------------------------";
$cache_stats = mysqli_get_cache_stats();
#var_dump($cache_stats);
foreach ($cache_stats as $key=>$value) {
if ($value > 0) {
echo "\n$key : $value";
}
}

echo "\n";

//phpinfo();

/* close the database connections */
$cxn->close();
$cxn2->close();

?>

bash# /export/home/php53/bin/php PHPmysqliClientmysqlnd.php

Retrieved 3 row(s).

CityName
--------
Hyderabad, India
San Francisco, USA
Sydney, Australia


Client Statistics After One Query
---------------------------------
bytes_sent : 90
bytes_received : 222
packets_sent : 2
packets_received : 9
protocol_overhead_in : 36
protocol_overhead_out : 8
bytes_received_ok_packet : 11
bytes_received_eof_packet : 9
bytes_received_rset_header_packet : 5
bytes_received_rset_field_meta_packet : 54
bytes_received_rset_row_packet : 70
packets_sent_command : 1
packets_received_ok : 1
packets_received_eof : 1
packets_received_rset_header : 1
packets_received_rset_field_meta : 1
packets_received_rset_row : 4
result_set_queries : 1
buffered_sets : 1
rows_fetched_from_server_normal : 3
rows_buffered_from_client_normal : 3
rows_fetched_from_client_normal_buffered : 3
rows_skipped_normal : 3
copy_on_write_performed : 3
connect_success : 1
active_connections : 1
active_persistent_connections : 1
explicit_free_result : 1
mem_erealloc_count : 1
mem_efree_count : 2
mem_realloc_count : 1
proto_text_fetched_string : 3

Statistics for Connection #1
----------------------------
bytes_sent : 90
bytes_received : 222
packets_sent : 2
packets_received : 9
protocol_overhead_in : 36
protocol_overhead_out : 8
bytes_received_ok_packet : 11
bytes_received_eof_packet : 9
bytes_received_rset_header_packet : 5
bytes_received_rset_field_meta_packet : 54
bytes_received_rset_row_packet : 70
packets_sent_command : 1
packets_received_ok : 1
packets_received_eof : 1
packets_received_rset_header : 1
packets_received_rset_field_meta : 1
packets_received_rset_row : 4
result_set_queries : 1
buffered_sets : 1
rows_fetched_from_server_normal : 3
rows_buffered_from_client_normal : 3
rows_skipped_normal : 3
connect_success : 1
active_connections : 1
active_persistent_connections : 1
explicit_free_result : 1
proto_text_fetched_string : 3

Cache Statistics After One Query
--------------------------------
put_misses : 3
get_hits : 3
size : 2000
free_items : 1997
references : 3

=================================


Establishing connection #2 to the MySQL server ..


Retrieved 5 row(s).

Host User
---- ----
127.0.0.1 root
localhost
localhost root
unknown
unknown root


Client Statistics After Two Queries
-----------------------------------
bytes_sent : 190
bytes_received : 501
packets_sent : 4
packets_received : 21
protocol_overhead_in : 84
protocol_overhead_out : 16
bytes_received_ok_packet : 22
bytes_received_eof_packet : 18
bytes_received_rset_header_packet : 10
bytes_received_rset_field_meta_packet : 148
bytes_received_rset_row_packet : 157
packets_sent_command : 2
packets_received_ok : 2
packets_received_eof : 2
packets_received_rset_header : 2
packets_received_rset_field_meta : 3
packets_received_rset_row : 10
result_set_queries : 2
buffered_sets : 2
rows_fetched_from_server_normal : 8
rows_buffered_from_client_normal : 8
rows_fetched_from_client_normal_buffered : 8
rows_skipped_normal : 8
copy_on_write_performed : 13
connect_success : 2
active_connections : 2
active_persistent_connections : 1
explicit_free_result : 2
mem_erealloc_count : 1
mem_efree_count : 2
mem_realloc_count : 4
proto_text_fetched_string : 13
Statistics for Connection #2
----------------------------
bytes_sent : 100
bytes_received : 279
packets_sent : 2
packets_received : 12
protocol_overhead_in : 48
protocol_overhead_out : 8
bytes_received_ok_packet : 11
bytes_received_eof_packet : 9
bytes_received_rset_header_packet : 5
bytes_received_rset_field_meta_packet : 94
bytes_received_rset_row_packet : 87
packets_sent_command : 1
packets_received_ok : 1
packets_received_eof : 1
packets_received_rset_header : 1
packets_received_rset_field_meta : 2
packets_received_rset_row : 6
result_set_queries : 1
buffered_sets : 1
rows_fetched_from_server_normal : 5
rows_buffered_from_client_normal : 5
rows_skipped_normal : 5
connect_success : 1
active_connections : 1
explicit_free_result : 1
proto_text_fetched_string : 10

Cache Statistics After Two Queries
----------------------------------
put_misses : 13
get_hits : 13
size : 2000
free_items : 1987
references : 4


Before concluding, be adviced that some of the experimental functions that are available with ext/mysqli and libmysql are not available with ext/mysqli and mysqlnd. eg., mysqli_embedded_*(), mysqli_*rpl*_()

Related Blog Post:
MySQL Native Driver for PHP, mysqlnd

Acknowledgments
Andrey Hristov & Ulf Wendel, Sun-MySQL AB

(Originally posted on blogs.sun.com at:
http://blogs.sun.com/mandalika/entry/demonstrating_the_features_of_mysql
)
_______________
Technorati Tags:
 PHP |  MySQL |  mysqlnd
Read More
Posted in | No comments

Monday, 19 January 2009

MySQL Native Driver for PHP, mysqlnd

Posted on 00:19 by Unknown
In order to communicate with the MySQL database server from a PHP application, ext/mysql, ext/mysqli and the PDO MYSQL driver rely on the MySQL client library, libmysql - that has the required implementation for the client-server protocol. The MySQL native driver for PHP (will simply be referred as mysqlnd from this point), is an additional, alternative way to connect from PHP 5 and PHP 6 to the MySQL Server 4.1 or later versions. mysqlnd is a replacement for the MySQL client library, libmysql; and it is tightly integrated into PHP starting with the release of PHP 5.3. That is, from PHP 5.3 onwards the developers can choose between libmysql and mysqlnd when using mysql, mysqli or PDO_MySQL extensions to connect to the MySQL server 4.1 or newer. Due to the tight integration into PHP 5.3 (and later), mysqlnd eliminates the dependency on the MySQL client programming support when the database extension(s) and the database driver are built with the support for mysqlnd.

mysqlnd is not another PHP extension like mysqli nor it has an exposed API to the userland. It is a library that provides almost similar functionality as that of the MySQL client library, libmysql. mysqlnd and libmysql libraries implement the MySQL communication protocol - hence both of those libraries can be used to connect to the MySQL Server.

Since mysqlnd is neither a new extension nor a programming API, but just an alternative to libmysql to connect from PHP to the MySQL Server, there is no need to make changes to the existing PHP scripts. The existing scripts which were running properly with the mysql, mysqli and PDO_MySQL extensions built with libmysql support, continue to run with the exact same behavior even when the mysql, mysqli and PDO_MySQL extensions are built with the mysqlnd support.

From the performance perspective, mysqlnd might be as fast as libmysql; and may even outperform libmysql in some cases. The generic recommendation is to try mysqlnd with your PHP application and to decide based on the performance results.

Some of the advantages of using mysqlnd are listed below:
  • Easy to compile: no linking against libmysql, and no dependency on the MySQL client programming support.
  • may outperform libmysql in certain cases
  • persistent connections for ext/mysqli
  • uses PHP memory management, supports PHP memory limit
  • reduced memory footprint -- keeps every row only once in memory, where as with libmysql you have it twice in memory
  • keeps a long list of performance related statistics for bottle-neck analysis

Installing PHP with the MySQL native driver, mysqlnd

As most of the pre-packaged PHP binary installations may not have the support for mysqlnd enabled by default, it is recommended to build PHP and the required database extensions with mysqlnd from the source code. The rest of this section focuses on the installation of PHP 5.3 from the source code. Check the php-mysqlnd web page at dev.mysql.com for the installation instructions for the prior versions of PHP with mysqlnd support.
  1. Get the source code for PHP 5.3 or later versions from http://www.php.net or from http://snaps.php.net/.

  2. Make sure that Autoconf 2.13 or later and GNU M4 1.4.7 or later are installed on the machine. Adjust the PATH environment variable to include the path to the autoconf and m4 tools.

    eg.,


    bash# ls /usr/local/bin/autoconf ; ls /usr/local/bin/m4
    /usr/local/bin/autoconf
    /usr/local/bin/m4

    bash# export PATH=.:/usr/local/bin:$PATH


  3. On Sun Solaris, create a soft link to gmake in the source directory.



    bash# ln -s /usr/bin/gmake make


  4. Navigate to the source directory and run buildconf.

    eg.,


    bash# cd php5.3-200811132130
    bash# ./buildconf --force


  5. For building PHP 5.3 or later with mysqlnd support on UNIX/Linux systems, you can decide for all three MySQL extensions (ext/mysql, ext/mysqli, PDO_mysql) whether they should be built using mysqlnd or libmysql. When choosing mysqlnd, use "mysqlnd" as path to the mysql client library. If you don't specify "mysqlnd" as library location, by default, PHP tries to use libmysql. It is possible to build one extension with one library, and another extension with another library. For example, you can build mysqli extension with mysqlnd support, and PDO_MYSQL with libmysql.

    The configure option shown below builds all the three extensions with mysqlnd support.

    eg.,


    bash# ./configure --prefix=/export/home/php53 --enable-mysqlnd \
    --with-mysqli=shared,mysqlnd --with-mysql=shared,mysqlnd \
    --with-pdo-mysql=shared,mysqlnd --with-zlib=shared [other options]



    configure script in PHP 6.0 and some builds of PHP 5.3 may not recognize the --enable-mysqlnd option, so check the configure options by running ./configure --help before specifying --enable-mysqlnd in the list of configure options when building PHP.

    On Windows platform, mysqli extension uses the MySQL Native Driver by default in PHP versions 5.3 and newer. Hence you don't need to configure libmysql.dll

  6. On Sun Solaris, pass the -z muldefs option to the linker to pro-actively defend against linker errors like ld: fatal: symbol `<symbol>' is multiply-defined.



    bash# export LDFLAGS="-z muldefs"


  7. Build PHP.



    bash# make


  8. Install PHP in the destination location.



    bash# make install


  9. Enable the required database extensions in php.ini

    eg.,


    bash# grep extension php.ini | grep -v \;
    extension_dir=/export/home/php53/lib/php/extensions/no-debug-non-zts-20071006
    extension="mysql.so"
    extension="mysqli.so"
    extension="pdo_mysql.so"


  10. Finally verify the new PHP installation by checking the list of PHP modules.

    eg.,



    bash# cd /export/home/php53/bin

    bash# ./php -m | grep mysql
    mysql
    mysqli
    mysqlnd
    pdo_mysql

    bash# ./php -i | grep -i mysql
    ..
    mysql
    MySQL Support => enabled
    Client API version => mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.18 $
    ..
    mysqli
    MysqlI Support => enabled
    Client API library version => mysqlnd 5.0.1-beta - 070402 - $Revision: 321 $
    ..
    mysqlnd
    mysqlnd => enabled
    Version => mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.18 $
    ..
    pdo_mysql
    PDO Driver for MySQL => enabled
    Client API version => mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.18 $
    ..


Acknowledgments
Andrey Hristov & Ulf Wendel, Sun-MySQL

(Originally posted on blogs.sun.com at:
http://blogs.sun.com/mandalika/entry/mysql_native_driver_for_php
)
_______________
Technorati Tags:
 PHP |  MySQL |  mysqlnd
Read More
Posted in | No comments

Saturday, 10 January 2009

Xorg Screen Resolution Woes on SXCE

Posted on 00:36 by Unknown
Symptom(s)

A fresh install of Solaris Express Community Edition (SXCE) build 104 or an upgrade from an earlier SXCE build say 95 on a Toshiba Tecra M2 laptop results in a successful operating environment, but fails to bring up the graphical GNOME environment mainly because Xserver fails to start with errors like :0.0 refused by server.

Few ideas to get around the Xserver issue: (apparently I'm not an Xorg expert -- so spare me the criticism in case if you notice any unusual/incoherent terminology)
  1. run kdmconfig and select Xorg

  2. run /usr/X11/bin/xorgconfig -configure, and save the resulting xorg.conf in /etc/X11 directory. Finally start the GNOME Display Manager by typing gdm (run gdm-stop to stop the display manager).

If 800x600 is the best resolution you can get, and if nvidia-settings throws an error with message:


You do not appear to be using the NVIDIA X driver. Please edit your X configuration file
(just run `nvidia-xconfig` as root), and restart the X server


.. try running nvidia-xconfig as root user. It will replace the existing /etc/X11/xorg.conf file. In case if the GNOME Display Manager fails to come up after this step, check the /var/log/Xorg.0.log file for any clue. If you notice something similar to the following lines in your Xorg.0.log, you may have to downgrade the NVIDIA driver to the latest versions of the supported legacy driver for your graphics processing unit (GPU).


...
...
(II) NVIDIA dlloader X Driver 177.82 Tue Nov 4 13:39:01 PST 2008
(II) NVIDIA Unified Driver for all Supported NVIDIA GPUs
(II) Primary Device is: PCI 01:00:0
(WW) NVIDIA(0): The NVIDIA GeForce FX Go5200 32M/64M GPU installed in this
(WW) NVIDIA(0): system is supported through the NVIDIA 173.14.xx Legacy
(WW) NVIDIA(0): drivers. Please visit
(WW) NVIDIA(0): http://www.nvidia.com/object/unix.html for more
(WW) NVIDIA(0): information. The 177.82 NVIDIA driver will ignore this
(WW) NVIDIA(0): GPU. Continuing probe...
(EE) No devices detected.

Fatal server error:
no screens found


Solution

The following instructions outline the steps to resolve the above issue on a Tecra M2 laptop running SXCE build 104.
  1. Download the latest legacy GPU version (173.14.xx series) of the display driver from NVIDIA's web site
            http://www.nvidia.com/object/solaris_display_173.14.12.html

  2. Download the driver file
            http://us.download.nvidia.com/solaris/173.14.12/NVIDIA-Solaris-x86-173.14.12.run

  3. Install the driver
            sh NVIDIA-Solaris-x86-173.14.12.run

    This step removes the existing nvidia driver before installing the legacy one.

  4. Reboot the system
            reboot -- -r

  5. Remove the Xorg configuration file if exists.
            rm /etc/X11/xorg.conf

  6. Generate a new Xorg configuration file
            nvidia-xconfig

  7. Logout and log back in.

The screen resolution issue should have been fixed automagically after the last step. Good Luck.

The above steps are based on NVIDIA's documentation:
        http://www.nvidia.com/object/solaris_display_173.14.12.html

(Originally posted on blogs.sun.com at:
http://blogs.sun.com/mandalika/entry/fix_to_xorg_screen_resolution)


_____________
Technorati Tags:
 Xorg |  Troubleshooting |  Solaris |  nVidia
Read More
Posted in | No comments
Newer Posts Older Posts Home
Subscribe to: Posts (Atom)

Popular Posts

  • UNIX/Linux: File Permissions (chmod)
    A file's permissions are also known as its 'mode'; so to change them we need to use the 'chmod' command (change mode). T...
  • C++: Virtual Function
    A virtual function allows derived classes to replace the implementation provided by the base class. The compiler makes sure the replacemen...
  • C/C++: Structure Vs Union
    A structure is a collection of items of different types; and each data item will have its own memory location. Where as only one item withi...
  • Blast from the Past : The Weekend Playlist #3
    The 80s contd., The 80s witnessed the rise of fine talent - so, it is only fitting to dedicate another complete playlist for the 80s. Her...
  • Achievement Award
    Got an Achievement Award/Certificate from Sun Microsystems, in recognition for my effort with Siebel Benchmark!! =:) Related post: http:...
  • Database: Oracle Server Architecture (overview)
    Oracle server consists of the following core components: 1) database(s) & 2) instance(s) 1) database consists of: 1) datafil...
  • C/C++/Java: ++ unary operator
    #include <stdio.h> int main() { int i = 5, j = 5; int total = 0; total = ++i + j++; printf("\ntotal o...
  • Solaris/C/C++: Benefit(s) of Linker (symbol) Scoping
    Introduction By default, the static linker (ld) makes all ELF symbols global in scope. This means it puts the symbols into the dynamic symbo...
  • Linux: Frozen Xwindows
    If Xwindows seem frozen, the following simple key strokes may bring back the Xserver without the need for a reboot Two ways to kill the Xwi...
  • PHP: Memory savings with mysqlnd
    mysqlnd may save memory. In the best cases, it may consume only 50% memory as that of libmysql esp. when the client application does not mod...

Categories

  • 80s music playlist
  • bandwidth iperf network solaris
  • best
  • black friday
  • breakdown database groups locality oracle pmap sga solaris
  • buy
  • deal
  • ebiz ebs hrms oracle payroll
  • emca oracle rdbms database ORA-01034
  • friday
  • Garmin
  • generic+discussion software installer
  • GPS
  • how-to solaris mmap
  • impdp ora-01089 oracle rdbms solaris tips upgrade workarounds zombie
  • Magellan
  • music
  • Navigation
  • OATS Oracle
  • Oracle Business+Intelligence Analytics Solaris SPARC T4
  • oracle database flashback FDA
  • Oracle Database RDBMS Redo Flash+Storage
  • oracle database solaris
  • oracle database solaris resource manager virtualization consolidation
  • Oracle EBS E-Business+Suite SPARC SuperCluster Optimized+Solution
  • Oracle EBS E-Business+Suite Workaround Tip
  • oracle lob bfile blob securefile rdbms database tips performance clob
  • oracle obiee analytics presentation+services
  • Oracle OID LDAP ADS
  • Oracle OID LDAP SPARC T5 T5-2 Benchmark
  • oracle pls-00201 dbms_system
  • oracle siebel CRM SCBroker load+balancing
  • Oracle Siebel Sun SPARC T4 Benchmark
  • Oracle Siebel Sun SPARC T5 Benchmark T5-2
  • Oracle Solaris
  • Oracle Solaris Database RDBMS Redo Flash F40 AWR
  • oracle solaris rpc statd RPC troubleshooting
  • oracle solaris svm solaris+volume+manager
  • Oracle Solaris Tips
  • oracle+solaris
  • RDC
  • sale
  • Smartphone Samsung Galaxy S2 Phone+Shutter Tip Android ICS
  • solaris oracle database fmw weblogic java dfw
  • SuperCluster Oracle Database RDBMS RAC Solaris Zones
  • tee
  • thanksgiving sale
  • tips
  • TomTom
  • windows

Blog Archive

  • ▼  2013 (16)
    • ▼  December (3)
      • Blast from the Past : The Weekend Playlist #3
      • Measuring Network Bandwidth Using iperf
      • Blast from the Past : The Weekend Playlist #2
    • ►  November (2)
    • ►  October (1)
    • ►  September (1)
    • ►  August (1)
    • ►  July (1)
    • ►  June (1)
    • ►  May (1)
    • ►  April (1)
    • ►  March (1)
    • ►  February (2)
    • ►  January (1)
  • ►  2012 (14)
    • ►  December (1)
    • ►  November (1)
    • ►  October (1)
    • ►  September (1)
    • ►  August (1)
    • ►  July (1)
    • ►  June (2)
    • ►  May (1)
    • ►  April (1)
    • ►  March (1)
    • ►  February (1)
    • ►  January (2)
  • ►  2011 (15)
    • ►  December (2)
    • ►  November (1)
    • ►  October (2)
    • ►  September (1)
    • ►  August (2)
    • ►  July (1)
    • ►  May (2)
    • ►  April (1)
    • ►  March (1)
    • ►  February (1)
    • ►  January (1)
  • ►  2010 (19)
    • ►  December (3)
    • ►  November (1)
    • ►  October (2)
    • ►  September (1)
    • ►  August (1)
    • ►  July (1)
    • ►  June (1)
    • ►  May (5)
    • ►  April (1)
    • ►  March (1)
    • ►  February (1)
    • ►  January (1)
  • ►  2009 (25)
    • ►  December (1)
    • ►  November (2)
    • ►  October (1)
    • ►  September (1)
    • ►  August (2)
    • ►  July (2)
    • ►  June (1)
    • ►  May (2)
    • ►  April (3)
    • ►  March (1)
    • ►  February (5)
    • ►  January (4)
  • ►  2008 (34)
    • ►  December (2)
    • ►  November (2)
    • ►  October (2)
    • ►  September (1)
    • ►  August (4)
    • ►  July (2)
    • ►  June (3)
    • ►  May (3)
    • ►  April (2)
    • ►  March (5)
    • ►  February (4)
    • ►  January (4)
  • ►  2007 (33)
    • ►  December (2)
    • ►  November (4)
    • ►  October (2)
    • ►  September (5)
    • ►  August (3)
    • ►  June (2)
    • ►  May (3)
    • ►  April (5)
    • ►  March (3)
    • ►  February (1)
    • ►  January (3)
  • ►  2006 (40)
    • ►  December (2)
    • ►  November (6)
    • ►  October (2)
    • ►  September (2)
    • ►  August (1)
    • ►  July (2)
    • ►  June (2)
    • ►  May (4)
    • ►  April (5)
    • ►  March (5)
    • ►  February (3)
    • ►  January (6)
  • ►  2005 (72)
    • ►  December (5)
    • ►  November (2)
    • ►  October (6)
    • ►  September (5)
    • ►  August (5)
    • ►  July (10)
    • ►  June (8)
    • ►  May (9)
    • ►  April (6)
    • ►  March (6)
    • ►  February (5)
    • ►  January (5)
  • ►  2004 (36)
    • ►  December (1)
    • ►  November (5)
    • ►  October (12)
    • ►  September (18)
Powered by Blogger.

About Me

Unknown
View my complete profile