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

ASF GitHub Bot updated SPARK-59619:
-----------------------------------
    Labels: pull-request-available  (was: )

> Pre-size the RequestMessage serialization buffer in NettyRpcEnv
> ---------------------------------------------------------------
>
>                 Key: SPARK-59619
>                 URL: https://issues.apache.org/jira/browse/SPARK-59619
>             Project: Spark
>          Issue Type: Improvement
>          Components: Spark Core
>    Affects Versions: 4.1.0
>            Reporter: David Mollitor
>            Priority: Minor
>              Labels: pull-request-available
>
> h3. Description
> {{RequestMessage.serialize}} ({{{}core/.../rpc/netty/NettyRpcEnv.scala{}}}) 
> is called for every outgoing Netty RPC ({{{}send{}}} / {{{}ask{}}}). It 
> allocates its output buffer with the no-arg {{{}new 
> ByteBufferOutputStream(){}}}, which starts at the JDK 
> {{ByteArrayOutputStream}} default of *32 bytes* and grows by doubling 
> (reallocate + {{{}Arrays.copyOf{}}}) as bytes are written.
> Every RPC first writes a fixed preamble through an _unbuffered_ 
> {{DataOutputStream}} – two {{{}RpcAddress{}}}'es (each {{{}boolean + UTF host 
> + int port{}}}) and the endpoint name – and then the Java-serialized message 
> body. Measuring the real serialized sizes (through the actual 
> {{{}JavaSerializer{}}}, byte-identical to {{{}serialize{}}}):
> ||Message||Bytes||
> |preamble only (sender set / null)|60 / 43|
> |{{HeartbeatResponse(false)}}|136|
> |{{UpdateBlockInfo}}|205|
> |{{ReviveOffers}}|247|
> |{{GetLocations}}|263|
> |{{BlockManagerHeartbeat}}|291|
> |{{Heartbeat}} (empty accumulators)|637|
> The preamble alone (43-60 bytes) already exceeds the 32-byte default, so 
> *every* RPC pays at least three reallocations (32 -> 64 -> 128 -> 256) before 
> the buffer holds even the smallest message.
> Pre-size the buffer to {*}512 bytes{*}. 512 is the capacity the doubling 
> growth already reaches for the smallest/most-frequent messages, so for those 
> it replaces a multi-step grow-and-copy chain (and the dead intermediate 
> arrays) with a single right-sized allocation at effectively no change in 
> retained memory, and it removes the bulk of the reallocations for the 
> mid-sized control messages. This is an allocation-churn / GC reduction on a 
> hot control-plane path.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to