日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何加快ORACLE本地OCI的調用速度

瀏覽:24日期:2023-11-17 10:44:09
此文摘自 developers.sun.com 寫的很精采, 我自己試用了一下, 性能果然有所提高 developers.sun.com;;Technical Articles & Tips Cache OCI Calls to Improve Performance of 32-Bit or 64-Bit Oracle Clients By Nagendra Nagarajayya, October 2003;E-mail;;Printable Page;;Downloadend comment tag-->Contents:IntrodUCtion Identifying the Problem The Workaround: Cache oraus.msb in Memory Building cache_oraus.so How to Use cache_oraus.so How the Caching Works6.1;;Interposition of the open() Function Call6.2;;Interposition of the fcntl() Function Call6.3;;Interposition of the lseek(), read(), and close() Function Calls Performance Improvement7.1;;Without LD_PRELOAD and cache_oraus.so7.2;;With LD_PRELOAD and cache_oraus.soCaveat Conclusion Acknowledgments ReferencesA.;;Appendix: Test Programs and WrappersA1.;;READMEA2.;;cache_oraus.cA3.;;test.cA4.;;test.shA5.;;test1.shA6.;;test_v.cA7.;;test_v.shA8.;;c.shA9.;;c64.shA10.;;Cache_open_calls.c1. IntroductionIf you work with Oracle clients that make use of OCI (Oracle Call Interface), you may have noticed that the OCI driver in 8.1.7.x makes thousands of calls to translate messages from the oraus.msb file. This can degrade application performance by 5 percent or more (quite severely in some cases). This problem has been documented by Oracle under bug ID 2142623. The problem can be overcome by caching the oraus.msb file in memory, and translating the file Access and system calls to user calls and memory operations. The caching solution is dynamic, and code changes are not needed. The solution can improve the performance of the Oracle client application. Recently, this solution resulted in bringing down the application runtime from 15 minutes to a few seconds at a major customer – about 100x times performance improvement. The performance benefits can be seen in applications like sqlplus and Oracle clients (C and C++) making use of the OCI driver. Java technology-based applications using JDBC (native driver) should also see similar benefits. 2. Identifying the ProblemAn Oracle client application can be trussed on the Solaris Operating System (OS) to see the calls being made to this file -- 'truss' is a system utility available on the Solaris platform, and it can be used to trace system calls made by an application. A running Oracle client application can be trussed as follows: truss -p [oracle client pid]The truss command will show all the system calls being made by the application. The ones of interest are the open(), fcntl(), lseek(), read(), and close() calls. These calls are made by the OCI driver repeatedly to translate messages. Here is a truss snippet showing the problem calls: open('/oracle/app/oracle/product/8.1.7/rdbms/mesg/oraus.msb', O_RDONLY) = 9fcntl(9, F_SETFD, 0x00000001) = 0lseek(9, 0, SEEK_SET) = 0read(9, '1513 '011303tt'.., 256) = 256lseek(9, 512, SEEK_SET) = 512read(9, '1C88 Y r ~ M'.., 512) = 512lseek(9, 1024, SEEK_SET) = 1024read(9, '18 $ 7 @ J V'.., 512) = 512lseek(9, 39936, SEEK_SET) = 39936read(9, 't0519 >051A'.., 512) = 512close(9)= 0These system calls can be eXPensive. The number of times these system calls are executed depends on the client application and the duration of the application run. 3. The Workaround: Cache oraus.msb in MemoryThe workaround is to cache the contents of the oraus.msb in memory and not make these system calls. This can be done dynamically by using the LD_PRELOAD technique available on the Solaris OE. (For further information, see the References section.) LD_PRELOAD is an environment variable on Solaris that allows shared libraries to be preloaded before an application begins execution. To make use of this technique, we need to build a shared library that will interpose on the open(), fcntl(), lseek(), read(), and close() calls. 4. Building cache_oraus.soThe shared library can be built with the Forte C compiler (now part of the Sun ONE Compiler Collection) using the following switches: 32-bit: cc -G -o cache_oraus.so -fast cache_oraus.c -l dl64-bit: cc -G -o cache_oraus.so -fast -xarch=v9a cache_oraus.c -l dl5. How to Use cache_oraus.soThe following environment variables need to be set to use the caching mechanism: export LD_PRELOAD=./cache_oraus.soexport oraus_msb_file=/ora/app/oracle/product/8.1.7/rdbms/mesg/oraus.msbThis can be set in a shell script used to start the client application. 6. How the Caching WorksThe caching works by interposing the open(), fcntl(), lseek(), read(), and close() calls. The first time the application executes one of these calls, the control is first transferred to the interposed function code. 6.1 Interposition of the open() Function CallWhenever a file is opened, the control is transferred to the interposed open() from cache_oraus.so. The interposed open() checks to see if the file being opened is the oraus.msb (see STEP 3 in the following code example). If so, the file is opened, and memory mapped (STEP 5.1). The descriptor returned by open() is also cached. For all other opens, the control is transferred to the original libc.so (STEP 7). int open(const char *path, int oflag, mode_t mode) { static int(*fptr)() = 0; static char* msb_path;STEP 1 if (fptr == 0) { fptr = (int (*)())dlsym(RTLD_NEXT, 'open'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %s n', dlerror()); return 0; }STEP 1.1 msb_path = (char*)getenv('oraus_msb_file'); }STEP 2 if (! msb_path) { msb_path = '/oracle/app/oracle/product/8.1.7/rdbms/mesg/oraus.msb'; }STEP 3 if (strcmp(path, msb_path) == 0) {STEP 4 if (k_bm_fd == -1) { k_bm_fd = ((*fptr)(path, oflag, mode)); if (k_bm_fd <= 0) { perror(path); exit(1); }STEP 5 fstat(k_bm_fd, &k_bm_stat_buf);STEP 5.1 k_bm_buf = (char*)mmap((caddr_t) 0, k_bm_stat_buf.st_size, (PROT_READ), MAP_SHARED, k_bm_fd, 0); assert(k_bm_buf != MAP_FAILED); return k_bm_fd; } else {STEP 6 return k_bm_fd; } }STEP 7 return ((*fptr)(path, oflag, mode));}STEPSDescription1Use dlysym() to get a pointer to the original libc.so open() call, so that we can chain to it.1.1We use an environment variable, oraus_msb_file, to find the location of the oraus.msb file.2If this variable is not set, we use a default path.3We make sure the open call is related to the oraus_msb_file. For all other open calls, we chain to the original open() call.4We make sure this is the first time we are going through this code path as we want to map the file into memory only once. We open the file and cache the returned descriptor in k_bm_fd.5We get some information about the file itself, such as size.5.1The most important step: we map the file into memory.6We have already opened the file, and we return the cache descriptor.7For all other opens, the interpose gives control back to the original libc.so open() call. Table 1: open() Call 6.2 Interposition of the fcntl() Function CallA fcntl() call is made to change the file control parameters. The first time fcntl() is executed to change oraus.msb control parameters, the control is first transferred to the fcntl() in libc.so. The return value is cached, as well as returned back to the Oracle client (STEP 2). The next time fcntl() is executed, if the file descriptor matches the oraus.msb file descriptor, the cached return value is returned (STEP 3). The control is not transferred to fcntl() in libc.so. int fcntl(int fildes, int cmd, int arg) { static int ret; static int(*fptr)() = 0; char* path;STEP 1 if (fptr == 0) { fptr = (int (*)())dlsym(RTLD_NEXT, 'fcntl'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %s n', dlerror()); return 0; } }STEP 2 if (k_fcntl_bm_fd == -1) { if (fildes == k_bm_fd) { ret = ((*fptr)(fildes, cmd, arg)); k_fcntl_bm_fd = k_bm_fd; return ret }STEP 3 } else if (k_fcntl_bm_fd == fildes) { return ret; } STEP 4 return ((*fptr)(fildes, cmd, arg));}STEPSDescription1Use dlysym() to get a pointer to the original libc.so fcntl() call, so that we can chain to it.2We make sure this is the first time we are going through this code path as we want to execute fcntl() only once. We also make a copy of the open descriptor in k_fcntl_bm_fd.3If the fildes is equal to k_fcntl_bm_fd, then we just return the cached return value.4For all other opens, the interpose gives control back to the original libc.so fcntl() call.Table 2: fcntl() Call Back to Top 6.3 Interposition of the lseek(), read(), and close() Function CallsFor the lseek() call, if the file descriptor matches the cached oraus.msb file descriptor, the file offset is stored instead of calling the lseek() in libc.so (STEP L2). On a read() call, if the file descriptor matches the cached oraus.msb file descriptor, the file offset stored from the lseek() is used to index into the memory mapped oraus.msb data. A memcpy() is then executed (STEP R2). So an I/O call is now transformed to a simple memcpy() call. A close() on the cached file descriptor is ignored so that the cached file descriptor can be reused. off_t lseek(int fildes, off_t offset, int whence) { static off_t (*fptr)() = 0;STEP L1 if (fptr == 0) {fptr = (int (*)())dlsym(RTLD_NEXT, 'lseek'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %s n', dlerror()); return 0; } }STEP L2 if (fildes == k_bm_fd) { k_bm_offset = offset; return offset; }STEP L3 return ((*fptr)(fildes, offset, whence));}STEPSDescriptionL1Use dlysym() to get a pointer to the original libc.so lseek() call, so that we can chain to it. L2If the fildes is equal to k_bm_fd, then we keep track of the k_bm_offset so that we access this memory location. L3For all other opens, the interpose gives control back to the original libc.so lseek() call. Table 3: lseek() Call ssize_t read(int fildes, void *buf, size_t nbyte) { static ssize_t (*fptr)() = 0;STEP R1 if (fptr == 0) { fptr = (ssize_t (*)())dlsym(RTLD_NEXT, 'read'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %sn', dlerror()); return (0); } }STEP R2 if (fildes == k_bm_fd) { memcpy(buf, k_bm_buf+k_bm_offset, nbyte); return nbyte; }STEP R3 return ((*fptr)(fildes, buf, nbyte));}STEPSDescriptionR1Use dlysym() to get a pointer to the original libc.so read() call, so that we can chain to it.R2If the fildes is equal to k_bm_fd, then we use the stored k_bm_offset to access the right memory location, and do a memcpy().R3For all other opens, the interpose gives control back to the original libc.so read() call.Table 4: read() Call int close(int fildes) { static int(*fptr)() = 0;STEP C1 if (fptr == 0) { fptr = (int (*)())dlsym(RTLD_NEXT, 'close'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %s n', dlerror()); return 0; } }STEP C2 if (fildes == k_bm_fd) { return 0; }STEP C3 return ((*fptr)(fildes));}STEPSDescriptionC1Use dlysym() to get a pointer to the original libc.so close() call, so that we can chain to it.C2If the fildes is equal to k_bm_fd, then we justreturn 0 to signal a successful close, but without closing the file.C3For all other opens, the interpose gives control back to the originallibc.so close() call.Table 5: close() Call Back to Top 7. Performance ImprovementThe performance improvement comes from not executing the system calls. The multiple instances of open(),fcntl(),lseek(), read(), and close() to read the oraus.msb messages are transformed to user-level calls. Also, the I/O operation becomes a simple memory-to-memory transfer. To measure the performance gains, a test program mimicking an Oracle client's behavior was developed. The test program performs open(),lseek(), read(), and close() calls on the oraus.msb file 50,000 times. The test program showed a gain of about 1000%. However, in a real Oracle client application, this might translate to about a 2 percent-to-15 percent gain in performance. 7.1 Without LD_PRELOAD and cache_oraus.soTypeTime in SecondsReal5.633User0.010Sys0.014Table 6: ptime test.sh Back to Top 7.2 With LD_PRELOAD and cache_oraus.soTypeTime in SecondsReal0.462User0.010Sys0.013Table 7: ptime test.sh 8. CaveatThe preceding code is not multithreaded. For Oracle clients that are multithreaded, the write access to the cache variables needs to be mutex protected or synchronized. 9. ConclusionCaching the file oraus.msb in memory improves the performance of Oracle clients. Even though the performance gain observed in the test program is about 1000 percent, the gain when running a really big Oracle client application might not be more than 2 to 15 percent, due to other I/O contentions. This gain can be achieved without any code changes to the client application. 10. AcknowledgmentsI would like to thank Teresa Riege (Sun) and Thomas Yen (Kenan/BP billing platform, CSG Systems) for their contributions and help in testing this utility during the 2002 Kenan/BP study (see related article listed in References). I would also like to thank my colleagues at MDE (IPE) for supporting me during this project. I would like also to thank Ben Humphreys, technical support specialist, Sun, who made the 64-bit modifications to the code. 11. ReferencesNagendra Nagarajayya, S.R. Venkatramanan, 'Fast Sockets, An Interprocess Communication Library to Boost Application Performance' Sun Product Documentation site Oracle MetaLink (for news, problems, and bugs) CSG Kenan/BP Exceeds Billing Needs of Largest Telecom Service Providers in Scalability Test Appendix: Test Programs and WrappersThe Sample Code is being made available by Sun merely as a convenience to you. The Sample Code below is provided 'AS IS.' Sun makes no warranties of any kind whatsoever with respect to the Sample Code. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY WARRANTY OF NON-INFRINGEMENT OR IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE HEREBY DISCLAIMED AND EXCLUDED TO THE EXTENT ALLOWED BY APPLICABLE LAW. IN NO EVENT WILL SUN BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR PUNITIVE DAMAGES HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY ARISING OUT OF THE USE OF OR INABILITY TO USE THE SAMPLE CODE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. A1. README** Oct 02, 03* Nagendra Nagarajayya* MDE/IPE(CSI)* Sun Microsystems, Inc *set LD_PRELOAD within a wrapper to cache_oraus.so, and specifythe path to the oraus.msb file using the ENV variable, 'oraus_msb_file'.If the env is not specified, the following path is used,/oracle/app/oracle/product/8.1.7/rdbms/mesg/oraus.msb.WARNING: The solution presented does not support multi-threaded clients, but should be very easy to do so. BTW, it could work as it is with MT threaded clients, but has not been tested.Example:export LD_PRELOAD=./cache_oraus.soexport oraus_msb_file=/ora/app/oracle/product/8.1.7/rdbms/mesg/oraus.msbNote: cache_open_calls.c is similar to cache_oraus.c but caches only the open calls. It does not memory map the oraus.msb file.Compilation instructions:-------------------------Use the wrapper c.sh to compile cache_oraus.c. c.sh also compiles cache_open_calls.c, and the test programs. Use c64.sh to compile cache_oraus.c for 64 bit support.To test the library:--------------------Use, ptime test.sh, and ptime test1.sh.To verify if the library is reading the contents properly,use test_v.sh, and test_v.cA2. Cache_oraus.c/*Date: April 18, 2002Author: Nagendra NagarajayyaMDE/IPE/CSISun Microsystems, Inc.Date: October 02, 2003 Ben Humphreys Technical Support Specialist Sun Microsystems, Inc. Descr: made changes to source for 64 bit support Description: This caches oraus.msb file in memory and transforms I/O calls to the file to a read access.*//* The Sample Code is being made available by Sun merely as a convenience to you. The Sample Code below is provided 'AS IS.' Sun makes no warranties of any kind whatsoever with respect to the Sample Code. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY WARRANTY OF NON-INFRINGEMENT OR IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE HEREBY DISCLAIMED AND EXCLUDED TO THE EXTENT ALLOWED BY APPLICABLE LAW. IN NO EVENT WILL SUN BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR PUNITIVE DAMAGES HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY ARISING OUT OF THE USE OF OR INABILITY TO USE THE SAMPLE CODE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <dlfcn.h>#include <sys/types.h>#include <sys/stat.h>#include <assert.h>#include <sys/mman.h>#include <sys/int_types.h>static int k_fcntl_bm_fd = -1;static int k_bm_fd = -1;static int k_bm_offset = 0;static char* k_bm_buf ;static struct stat k_bm_stat_buf ;int fcntl(int fildes, int cmd, intptr_t arg) { static int ret; static ssize_t(*fptr)() = 0; char* path; if (fptr == 0) { fptr = (ssize_t (*)())dlsym(RTLD_NXT, 'fcntl'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %s n', dlerror()); return 0; } } if (k_fcntl_bm_fd == -1) { if (fildes == k_bm_fd) { ret = ((*fptr)(fildes, cmd, arg)); k_fcntl_bm_fd = k_bm_fd; return ret } } else if (k_fcntl_bm_fd == fildes) { return ret; } return ((*fptr)(fildes, cmd, arg));}off_t lseek(int fildes, off_t offset, int whence) { static off_t(*fptr)() = 0; if (fptr == 0) {fptr = (off_t (*)())dlsym(RTLD_NEXT, 'lseek'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %s n', dlerror()); return 0; } } if (fildes == k_bm_fd) { k_bm_offset = offset; return offset; }/* fprintf(stderr, 'offset=%d k_bm_offset=%dn', offset, k_bm_offset);*/ return ((*fptr)(fildes, offset, whence));}ssize_t read(int fildes, void *buf, size_t nbyte) { static ssize_t(*fptr)() = 0; if (fptr == 0) { fptr = (ssize_t (*)())dlsym(RTLD_NEXT, 'read'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %sn', dlerror()); return (0); } }/* fprintf(stderr, 'fildes = %d k_bm_fd = %d n', fildes, k_bm_fd);*/ if (fildes == k_bm_fd) { memcpy(buf, k_bm_buf+k_bm_offset, nbyte); return nbyte; } return ((*fptr)(fildes, buf, nbyte));}int open(const char *path, int oflag, mode_t mode) { static char* msb_path;static int(*fptr)() = 0; if (fptr == 0) { fptr = (int (*)())dlsym(RTLD_NEXT, 'open'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %s n', dlerror()); return 0; } msb_path = (char*)getenv('oraus_msb_file'); } if (! msb_path) { msb_path = '/oracle/app/oracle/product/8.1.7/rdbms/mesg/oraus.msb'; } if (strcmp(path, msb_path) == 0) { if (k_bm_fd == -1) { k_bm_fd = ((*fptr)(path, oflag, mode)); if (k_bm_fd <= 0) { perror(path); exit(1); } fstat(k_bm_fd, &k_bm_stat_buf);/* fprintf(stderr, 'open the file %dn',k_bm_fd);*/ k_bm_buf = (char*)mmap((caddr_t) 0, k_bm_stat_buf.st_size, (PROT_READ),MAP_SHARED, k_bm_fd, 0); assert(k_bm_buf != MAP_FAILED); return k_bm_fd; } else { /* fprintf(stderr, 're-open the file %dn',k_bm_fd); */ return k_bm_fd; } } return ((*fptr)(path, oflag, mode));}int close(int fildes) {static int(*fptr)() = 0; if (fptr == 0) { fptr = (int (*)())dlsym(RTLD_NEXT, 'close'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %s n', dlerror()); return 0; } } if (fildes == k_bm_fd) {/* fprintf(stderr, 'close the file %dn',k_bm_fd);*/ return 0; } return ((*fptr)(fildes));}See README file for details on how to compile this program, and the environment needed to execute the Oracle client program. Appendixes A3-A6 explain a little more about the test programs.A3. test.cThis test program reads the oraus.msb file 50,000 times to mimic Oracle client application behavior. #include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>int fd = 0;int fd1 = 0;char buf[1024];char buf1[1024];int x1 = 0;int x2 = 0;int x3 = 0;int x4 = 0;int x5 = 0;int main() { int i; int r=-1; for (i=0; i<50000; i++) { fd = open('/ora/app/oracle/product/8.1.7/rdbms/mesg/oraus.msb', O_RDONLY);/* fd1 = open('/oracle/app/oracle/product/8.1.7/rdbms/mesg/oraus.msb_1', O_RDONLY);*//* fprintf(stderr, 'fd = %d fd1 = %d n', fd, fd1);*/ r = fcntl(fd, F_SETFD); lseek(fd, 0, SEEK_SET); read(fd, &buf, 256);/* r = fcntl(fd1, F_SETFD); lseek(fd1, 0, SEEK_SET); read(fd1, &buf1, 256); x1 = memcmp(&buf1, &buf, 256); if (x1 != 0 ) { fprintf(stderr, 'x1 did not mach %dn', x1); }*/ lseek(fd, 512, SEEK_SET); read(fd, &buf, 512);/* lseek(fd1, 512, SEEK_SET); read(fd1, &buf1, 512); x2 = memcmp(&buf1, &buf, 512); if (x2 != 0 ) { fprintf(stderr, 'x2 did not mach %d n', x2); }*/ lseek(fd, 1024, SEEK_SET); read(fd, &buf, 512);/* lseek(fd1, 1024, SEEK_SET); read(fd1, &buf1, 512); x3 = memcmp(&buf1, &buf, 512); if (x3 != 0 ) { fprintf(stderr, 'x3 did not mach n'); }*/ lseek(fd, 39936, SEEK_SET); read(fd, &buf, 512);/* lseek(fd1, 39936, SEEK_SET); read(fd1, &buf1, 512); x4 = memcmp(&buf1, &buf, 512); if (x4 != 0 ) { fprintf(stderr, 'x4 did not mach n'); }*/ close(fd); /* close(fd1);*/ } }A4. test.shThis is a wrapper to execute the test program to show the performance gains of caching the contents of oraus.msb in memory. The LD_PRELOAD and oraus_msb_file environment variables point to cache_oraus.so and the oraus.msb file. #! /bin/bashexport oraus_msb_file=/ora/app/oracle/product/8.1.7/rdbms/mesg/oraus.msbexport LD_PRELOAD=/usr/lib/cache_oraus.soexport LD_PRELOAD=./cache_oraus.sotime ./testA5. test1.shThis is a wrapper to execute the test program without the caching mechanism. #!/bin/bashtime ./testA6. test_v.cThis program was used to verify that the interposed calls work properly. #include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>int fd = 0;int fd1 = 0;char buf[1024];char buf1[1024];int x1 = 0;int x2 = 0;int x3 = 0;int x4 = 0;int x5 = 0;int main() { int i; int r=-1; for (i=0; i<50000; i++) { fd = open('/ora/app/oracle/product/8.1.7/rdbms/mesg/oraus.msb', O_RDONLY); fd1 = open('/ora/app/oracle/product/8.1.7/rdbms/mesg/oraus.msb_1', O_RDONLY);/* fprintf(stderr, 'fd = %d fd1 = %d n', fd, fd1);*/ r = fcntl(fd, F_SETFD); lseek(fd, 0, SEEK_SET); read(fd, &buf, 256); r = fcntl(fd1, F_SETFD); lseek(fd1, 0, SEEK_SET); read(fd1, &buf1, 256); x1 = memcmp(&buf1, &buf, 256); if (x1 != 0 ) { fprintf(stderr, 'x1 did not mach %dn', x1); } lseek(fd, 512, SEEK_SET); read(fd, &buf, 512); lseek(fd1, 512, SEEK_SET); read(fd1, &buf1, 512); x2 = memcmp(&buf1, &buf, 512); if (x2 != 0 ) { fprintf(stderr, 'x2 did not mach %d n', x2); } lseek(fd, 1024, SEEK_SET); read(fd, &buf, 512); lseek(fd1, 1024, SEEK_SET); read(fd1, &buf1, 512); x3 = memcmp(&buf1, &buf, 512); if (x3 != 0 ) { fprintf(stderr, 'x3 did not mach n'); } lseek(fd, 39936, SEEK_SET); read(fd, &buf, 512); lseek(fd1, 39936, SEEK_SET); read(fd1, &buf1, 512); x4 = memcmp(&buf1, &buf, 512); if (x4 != 0 ) { fprintf(stderr, 'x4 did not mach n'); } close(fd); close(fd1); } }A7. test_v.shThis is a wrapper for testing test_v.c. #!/bin/bashexport LD_PRELOAD=/usr/lib/cache_oraus.soexport LD_PRELOAD=./cache_oraus.sotime ./test_vA8. c.sh#!/bin/bashPATH=/opt/SUNWspro/bin/:$PATHexport PATH;cc -fast -xarch=v8plusa -xdepend -xvector -xstrconst -xprefetch -G -o cache_open_calls.so cache_open_calls.c -ldlcc -fast -xdepend -xvector -xstrconst -xarch=v8plusa -xprefetch -G -o cache_oraus.so cache_oraus.c -ldlcc -fast -xstrconst -xvector -xdepend -xarch=v8plusa -xprefetch -o test test.c -ldlcc -fast -xstrconst -xvector -xdepend -xarch=v8plusa -xprefetch -o test_v test_v.c -ldl A9. c64.sh#!/bin/bash# Changes to source cache_oraus.c for 64 bit support was made # by Ben Humphreys PATH=/opt/SUNWspro/bin/:$PATHexport PATH;cc -fast -xarch=v9a -xcode=abs64 -xdepend -xvector -xstrconst -xprefetch -G -o cache_open_calls.so cache_open_calls.c -ldlcc -fast -xarch=v9a -xcode=abs64 -xdepend -xvector -xstrconst -xprefetch -G -o cache_oraus.so cache_oraus.c -ldlcc -fast -xarch=v9a -xcode=abs64 -xstrconst -xvector -xdepend -xprefetch -o test test.c -ldlcc -fast -xarch=v9a -xcode=abs64 -xstrconst -xvector -xdepend -xprefetch -o test_v test_v.c -ldl < name=A10> A10. Cache_open_calls.c/* Date: April 18, 02 Author: Nagendra Nagarajayya Description: Caches open, and close calls to oraus.msb file */#include <stdio.h>#include <unistd.h>#include <dlfcn.h>#include <string.h>#include <stdlib.h>static int k_bm_fd = -1;int open(const char *path, int oflag, mode_t mode) { static int (*fptr)() = 0; if (fptr == 0) {fptr = (int (*)())dlsym(RTLD_NEXT, 'open'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %s n', dlerror()); return 0; } } if (strcmp(path, '/oracle/app/oracle/product/8.1.7/rdbms/mesg/oraus.msb') == 0) { if (k_bm_fd == -1) { k_bm_fd = ((*fptr)(path, oflag, mode)); if (k_bm_fd <= 0) { perror(path); exit(1); } /* fstat(k_bm_fd, &k_bm_stat_buf); fprintf(stderr, 'open the file %dn',k_bm_fd);*/ return k_bm_fd; } else { /* fprintf(stderr, 're-open the file %dn',k_bm_fd); */ return k_bm_fd; } } return ((*fptr)(path, oflag, mode));}int close(int fildes) { static int (*fptr)() = 0; if (fptr == 0) { fptr = (int (*)())dlsym(RTLD_NEXT, 'close'); if (fptr == NULL) { fprintf(stderr, 'dlopen: %s n', dlerror()); return 0; } } if (fildes == k_bm_fd) {/* fprintf(stderr, 'close the file %dn',k_bm_fd);*/ return 0; } return ((*fptr)(fildes));}About the AuthorNagendra Nagarajayya has been at Sun for more than 9 years. A Staff Engineer in Market Development Engineering (MDE/IPE), he works with telco ISVs on architecture, performance tuning, sizing and scaling, benchmarking, porting, and so on. His interests include multithreading, concurrency and parallelism, HA, distributed computing, networking, and the Java and Solaris platforms.
標簽: Oracle 數據庫
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品麻豆成人av电影艾秋| 午夜欧美在线| 天海翼精品一区二区三区| 中文字幕日韩高清在线| 日韩精品免费观看视频| 91九色综合| 久久婷婷国产| 五月激情久久| 亚洲欧美日韩高清在线| 蜜臀a∨国产成人精品| 日韩av中文字幕一区| 天堂va欧美ⅴa亚洲va一国产| 日韩精品成人| 国产精品国产一区| 99久久99久久精品国产片果冰| 亚洲激情中文在线| 日本亚洲最大的色成网站www | 激情久久久久久久| 视频一区视频二区在线观看| 18国产精品| 成人在线超碰| 国产视频一区欧美| 欧美激情aⅴ一区二区三区| 亚洲成人二区| 日韩极品在线观看| 韩国久久久久久| 久久国产精品毛片| 美日韩一区二区三区| 久久中文字幕av| 欧美亚洲综合视频| 久久久久国产精品一区二区| 亚洲1区在线观看| 欧美国产偷国产精品三区| 免费日韩一区二区| 精品久久久久中文字幕小说| 亚洲成人三区| 国产精品网站在线看| 欧美~级网站不卡| 国产精品久久亚洲不卡| 亚洲女同一区| 精品中文在线| 亚洲色图综合| 伊人久久视频| 欧美日韩视频免费看| 婷婷成人在线| 久久精品国产99国产| 亚洲人成高清| 成人精品天堂一区二区三区| 日韩激情啪啪| 午夜国产精品视频免费体验区| 国产精品视频一区二区三区 | 久久精品国产精品亚洲毛片| 国产农村妇女精品一二区| 国产中文欧美日韩在线| 日韩毛片网站| 亚洲综合国产| 999国产精品| 麻豆视频一区二区| 日本不卡一二三区黄网| 欧美特黄一级大片| 成人在线视频区| 国产精品视频一区视频二区| 在线精品一区二区| 九九在线精品| 日韩一区亚洲二区| 国产激情久久| 日韩国产欧美在线播放| 亚洲男女自偷自拍| 久久久久久亚洲精品美女| 激情黄产视频在线免费观看| 亚洲三区欧美一区国产二区| 久久精品在线| 成人在线视频中文字幕| 日韩av资源网| 香蕉国产精品| 久久久久中文| av综合电影网站| 国产一区调教| 久久中文欧美| 国产精品欧美在线观看| 日韩精品欧美成人高清一区二区| 亚洲一区二区免费看| 亚洲va在线| 在线日韩视频| 欧美一区二区三区高清视频| 日韩电影免费在线观看| 精品不卡一区| 久久亚洲人体| 鲁大师影院一区二区三区| 精品一区二区三区中文字幕视频 | 麻豆国产91在线播放| 日韩高清不卡一区二区| 中文字幕日韩高清在线| 亚洲日韩中文字幕一区| 亚洲精品乱码日韩| 日韩av不卡一区二区| 久久精品72免费观看| 日韩动漫一区| 国产欧美亚洲精品a| 久久国产精品免费一区二区三区| 奇米777国产一区国产二区| 国产日韩欧美一区在线| 欧美激情久久久久久久久久久| 欧美亚洲人成在线| 不卡福利视频| 美女视频网站久久| 国产成人久久精品一区二区三区| 国内精品伊人| 日韩欧美一区二区三区在线视频| 久久精品青草| 六月丁香综合| 欧美日韩调教| 福利片在线一区二区| 久久中文字幕av| 国产亚洲在线| 日韩极品在线观看| 动漫av一区| 激情久久久久久久| 婷婷精品在线| 国产一区福利| 欧美福利在线| 亚洲精品免费观看| 欧美日韩一区自拍| 国产成人免费精品| 一本色道精品久久一区二区三区| 无码日韩精品一区二区免费| 免费日韩成人| 欧美91视频| 日韩精品第一| sm久久捆绑调教精品一区| 激情婷婷欧美| 日韩1区2区日韩1区2区| 久久久久久一区二区| 日本大胆欧美人术艺术动态| 国产精品任我爽爆在线播放| 视频精品一区二区| 亚洲激情久久| 亚洲精品看片| 激情不卡一区二区三区视频在线| av高清一区| 亚洲另类av| 国产suv精品一区| 久久亚洲影院| 国产精品伦理久久久久久| 欧美福利专区| 国产日产一区| 好看不卡的中文字幕| 欧美亚洲二区| 亚洲国产专区| 国产区精品区| 亚洲激情av| 国产精品大片| 欧美特黄一区| 精品九九久久| 亚洲精品人人| 亚洲播播91| 国产亚洲人成a在线v网站| 四虎884aa成人精品最新| 欧美日韩中出| 亚洲日本网址| 欧美在线不卡| 99日韩精品| www.51av欧美视频| 日韩av中文字幕一区二区三区| 999精品色在线播放| 国产精品天堂蜜av在线播放| 国产精品女主播一区二区三区| 国际精品欧美精品| 久久精品99国产精品日本| 亚洲激情国产| 欧美日韩在线观看首页| 国产精品极品国产中出| 男女男精品视频网| 久久九九99| 精品亚洲a∨一区二区三区18| 亚洲尤物av| 亚洲少妇在线| 久久久久久久久丰满| 狠狠久久伊人中文字幕| 欧美视频精品全部免费观看| 亚洲伊人影院| 五月天激情综合网| 日韩欧美视频专区| 捆绑调教美女网站视频一区| 日韩有吗在线观看| 三级在线观看一区二区| 亚洲福利一区| 亚洲成av人片一区二区密柚| 日韩综合在线| 国产黄色一区| 国产乱子精品一区二区在线观看| 中文字幕亚洲精品乱码| 天堂成人免费av电影一区| 视频小说一区二区| av综合电影网站| 成人污污视频| 电影91久久久| 精品91福利视频| 91福利精品在线观看| 美女网站久久|