[ 
https://issues.apache.org/jira/browse/DERBY-867?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Dag H. Wanvik updated DERBY-867:
--------------------------------

    Derby Categories: [Performance]

> Performance issues with large object handling in DDMWriter
> ----------------------------------------------------------
>
>                 Key: DERBY-867
>                 URL: https://issues.apache.org/jira/browse/DERBY-867
>             Project: Derby
>          Issue Type: Improvement
>          Components: Network Server
>    Affects Versions: 10.1.1.0, 10.2.1.6
>            Reporter: Bryan Pendleton
>            Priority: Minor
>
> There are some performance issues related to the way that DDMWriter handles 
> extremely large network messages, such as those that arise in DERBY-125 and 
> DERBY-492. The performance problems involve both memory usage and CPU cycles.
> Among the problems that could be investigated and improved:
> 1) The DDMWriter internal byte array grows, but never shrinks (except when 
> the DDMWriter as a whole is collected). This means that there may be some 
> memory wastage when the buffer grows to a large value, then is later used for 
> only small buffers.
> 2) When the buffer grows, it tends to double in size. When you start gettting 
> to moderately large buffer sizes, this may mean that the  buffer over-expands 
> during a growth event, and grows to a larger size than is needed, again 
> leading to memory wastage.
> 3) I'm not sure what would happen if memory were unavailable when the buffer 
> wanted to grow; I think it would be a very hard error. There may be ways to 
> handle this better, such as: waiting a while to see if memory becomes 
> available; writing previously chained messages out of the buffer to free up 
> space, etc. At the very least, it would be nice if an out-of-memory problem 
> were handled cleanly, for example by terminating this connection but leaving 
> the rest of the Network Server online and available for other users.
> 4) Perhaps we could eliminate the expansion all together by instead of 
> expanding have a pool of buffers available to all the DDMWriters.  If  a 
> DDMWriter needs to write more,  it picks up a new buffer and returns it to 
> the pool when no longer needed.
> 5) Large DDM objects which require Layer B segmentation are written as a 
> single object, then later the segmentation is added after the payload data is 
> complete. This processing is handled by endDdm() and finalizeDssLength(). 
> This code currently copies the bytes around in the buffer two "extra" times: 
> once to insert the extended length bytes at the front of the large DDM 
> object, and a second time to insert the DSS Continuation Headers every 32K 
> bytes. Given the API between DDMWriter and its callers, it may be impossible 
> to totally remove this memory copying, but it does seem like we could reduce 
> from 2 full copies to 1, by combining the insertion of the extended length 
> bytes with the continuation header segmentation. It might also be possible to 
> detect a large object once it spills out from one DSS block into the second 
> block, and hence avoid copying for subsequent blocks, even if those first two 
> blocks do have to be copied once.
> There may be other opportunities in this part of the code; this issue is just 
> a collection of the ideas that came up while the developers were discussing 
> bugs DERBY-125, DERBY-170, DERBY-491, and DERBY-492. A review of the 
> processing that occurs in those test cases should be performed as part of 
> working on this bug.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to