[omniORB] Performance Question

Dietmar May dcmay@object-workshops.com
Sun, 11 Jul 1999 01:04:42 -0400


Sai-Lai,

> We take performance seriously. I think it bears out in our own test and in
> all the other tests I've seen on the Web that omniORB2 is among the fastest
> ORBs available. The point I was trying to made, perhaps not as clearly as
> it should be, is that there are other aspects to an ORB design that can
> affect the scaling of an ORB's performance.

And quite frankly, we think you've all done an excellent job here ... with just 
a hole or two. It just happens to be in an area that might affect our 
customers.

> Shared memory for obvious reasons could be faster than a loop back socket
> interface. (Is there shared memory support on windows?)

>From MS SDK docs:

"File mapping enables a process to treat the contents of a file as if they were 
a block of memory in the process's address space. The process can use simple 
pointer operations to examine and modify the contents of the file. When two or 
more processes access the same file mapping, each process receives a pointer to 
memory in its own address space that it can use to read or modify the contents 
of the file. The processes must use a synchronization object, such as a 
semaphore, to prevent data corruption in a multitasking environment.

"You can use a special case of file mapping to provide named shared memory 
between processes. If you specify the system swapping file when creating a 
file-mapping object, the file-mapping object is treated as a shared memory 
block. Other processes can access the same block of memory by opening the same 
file-mapping object.

"File mapping is quite efficient and also provides operating-system-supported 
security attributes that can help prevent unauthorized data corruption. File 
mapping can be used only between processes on a local computer; it cannot be 
used over a network."

> The System V shared memory API, which as far as I know, is the API for
> shared memory on all unix platforms is deficient.
> I may also be totally wrong about shared memory, if so please point
> out my mistakes.

I'll take your word for Unix. As far as Win32 is concerned, since shared memory 
is file mapping, the file should be cleaned up when all processes exit.

> I take your point that local bulk data transfer could do better with other
> IPC mechanism. It just isn't something that we have time to look into at
> this time. I assume everybody is happy to see GIOP 1.2, bi-directional GIOP
> for doing callbacks through a firewall, proper codeset conversion support
> for wchar and wstring to come sooner.

That's an answer that I can relate to. (Although none of those are priorities 
for us and our customers :). Perhaps in order to satisfy the needs (or wants) 
of the many, you need to postpone the needs of the few. We'd just like to 
request that the performance issue for local configurations gets looked, and 
not ignored as an unimportant issue.

Perhaps you can answer one or two other questions:

1) Do you know of any easy tweak, perhaps at the socket level, that could be 
tried in a local (same machine) environment to dramatically increase the 
performance? perhaps by bumping buffer size, or by setting some configuration 
flag that bypasses some levels of the socket protocol?

2) If an omniORB server is linked as a Windows DLL, can it be loaded by another 
omniORB server?

If so, are CORBA calls simply executed as virtual function calls (if they are 
both in the same process space)? (I believe that Orbix handles them this way, 
and thought I saw some vague reference to this in omniORB).

Are there any known issues in running this kind of configuration? Is it 
possible for the server to load multiple (different) server DLLs?

Is data in such a configuration transfered without going thru the sockets 
layer? That is, if we have a 4MB sequence, does it get allocated once (by the 
callee) or twice (by the ORB as well). Or in other words, is there the same 
number of copies taking place as if going thru a socket layer?

Regards,
Dietmar