Thanx for the details, sounds cool, good luck with the feature!!!

-Ayush

> On 29 May 2024, at 8:56 AM, zhangjian <1361320...@qq.com> wrote:
> 
> Thank you for taking the time to review this proposal.
> Your opinion does point out the key issues to designing an asynchronous 
> router, but my proposal can address these issues:
> 1. My design does not affect the functionality of existing synchronous 
> routers in throwing stanby or retry exceptions and other aspects, the async 
> router still inherits these implementations.
> 2. Currently, both asynchronous router and sync router support backpressure 
> on client requests when they exceed a certain limit (
>   asynchronous router : cannot obtain semaphores through the handler,
>   sync router : block through handler synchronization, unable to obtain 
> available handler
>   )
>  and return standby exception to allow the client to retry other routers 
> (RouterRpcFairnessPolicyController mechanism).
> 
> Thank you again!
> zhangjian
> 
>> 2024年5月29日 07:05,Ayush Saxena <ayush...@gmail.com> 写道:
>> Thanx folks, I had a very quick pass on the PDF and it looks good.
>> Maybe some doubts around the fact where it was mentioned that if a
>> Namenode returns a StandbyException or something on similar lines, the
>> Router will retry, I think we have some logic in RouterRpcClient
>> checking for such case, if it is StandByException it does try the
>> other Namenode, but for all other Retryable Exceptions, we return them
>> back to the client & let the client operate according to its Retry
>> Policy, I think we should preserve that behaviour, if the intentions
>> were to change it.
>> Regarding controlling the concurrency to prevent OOM at the router,
>> maybe we should consider rejecting the client requests beyond a
>> certain limit/backlog & return back a relevant Retriable Exception to
>> the client, so that it can retry on another Router rather than
>> overloading one Router when there are other available, most of the
>> deployments I believe would be running considerable number of Routers
>> Rest I scratched my head for possible scenario where things can go
>> south, but I think mostly the scenarios that came into my mind are
>> covered
>> Nothing blocker from my side, Good Luck!!!
>> -Ayush
>>> On Tue, 28 May 2024 at 21:52, Sangjin Lee <sj...@apache.org> wrote:
>>> Sounds good. Thanks for sharing your findings.
>>> On Sat, May 25, 2024 at 2:24 AM zhangjian <1361320...@qq.com> wrote:
>>>> Hello everyone, I conducted a performance comparison test between sync and 
>>>> asynchronous router, and the test results showed that in single ns or 
>>>> multi ns scenarios, Asynchronous router in terms of throughput The 
>>>> utilization of CPU and thread, as well as the average processing time of 
>>>> client requests, are better than those of sync router, especially when 
>>>> downstream ns have performance bottlenecks, The performance of the async 
>>>> router is far greater than that of the sync router; And in terms of 
>>>> isolation, Asynchronous router is also better than sync router.
>>>> Detailed testing PDF: https://issues.apache.org/jira/browse/HDFS-17531  
>>>> Comparison of Async router & sync router performance.pdf
>>>> 2024年5月24日 14:13,Yuanbo Liu <liuyuanb...@gmail.com> 写道:
>>>> good job!
>>>> On Fri, May 24, 2024 at 1:57 AM zhangjian <1361320...@qq.com> wrote:
>>>>> Hello everyone, currently, I have tested the performance of async and 
>>>>> sync router for a downstream ns:
>>>>> 1. The throughput, CPU, and thread performance of the async router are 
>>>>> better than those of the sync router, and its memory performance is 
>>>>> within an acceptable range compared to the synchronous router.
>>>>> 2. Asynchronous router can apply pressure downstream to better utilize 
>>>>> the performance of downstream ns, and can almost fill the call queue of 
>>>>> downstream ns.
>>>>> Due to the large size of the test result pdf, it cannot be sent via email,
>>>>> please see: https://issues.apache.org/jira/browse/HDFS-17531
>>>>>> 2024年5月23日 17:03,Xiaoqiao He <hexiaoq...@apache.org> 写道:
>>>>>> Great. Thanks for your addendum information.
>>>>>> cc @Ayush Saxena <ayush...@gmail.com> @inigo...@apache.org
>>>>>> <inigo...@apache.org> Any more feedback for this proposal?
>>>>>> IMO The feature of asynchronous router RPC is a helpful improvement. For 
>>>>>> my
>>>>>> internal practice, it will improve the throughput of requests forward
>>>>>> significantly
>>>>>> and is very valuable to push it forward.
>>>>>> Thanks again and good luck!
>>>>>> Best Regards,
>>>>>> - He Xiaoqiao
>>>>>> On Wed, May 22, 2024 at 9:59 AM zhangjian <1361320...@qq.com> wrote:
>>>>>>> Hi, Sangjin Lee, thank you for your attention. I will use my free time 
>>>>>>> to
>>>>>>> do a performance comparison recently.
>>>>>>>> 2024年5月22日 03:42,Sangjin Lee <sj...@apache.org> 写道:
>>>>>>>> Thanks for the great proposal, Zhangjian. On point #3, I suspect it
>>>>>>> should
>>>>>>>> be fairly straightforward to create a small isolated synthetic test to
>>>>>>>> prove (or disprove) the benefits of this approach. By driving a
>>>>>>> controlled
>>>>>>>> amount of requests per second, you could see latency, memory, CPU, etc.
>>>>>>>> Ideally, it should show meaningful improvements without much 
>>>>>>>> degradation
>>>>>>> in
>>>>>>>> other metrics. Would you be able to spend some time doing that?
>>>>>>>> Thanks,
>>>>>>>> Sangjin
>>>>>>>> On Tue, May 21, 2024 at 5:13 AM zhangjian <1361320...@qq.com.invalid>
>>>>>>> wrote:
>>>>>>>>> Hi, xiaoqiao he, thank you for your reply.
>>>>>>>>> 1.Currently, the server and client protocols within router can be
>>>>>>>>> implemented by extends existing protocols and adding asynchronous
>>>>>>>>> functionality, so it will not affect existing synchronization 
>>>>>>>>> protocols.
>>>>>>>>> RouterClientNamenodeProtocolServerSideTranslatorPB
>>>>>>>>> RouterClientProtocolTranslatorPB
>>>>>>>>> RouterGetUserMappingsProtocolServerSideTranslatorPB
>>>>>>>>> RouterGetUserMappingsProtocolTranslatorPB
>>>>>>>>> RouterNamenodeProtocolServerSideTranslatorPB
>>>>>>>>> RouterNamenodeProtocolTranslatorPB
>>>>>>>>> RouterRefreshUserMappingsProtocolServerSideTranslatorPB
>>>>>>>>> RouterRefreshUserMappingsProtocolTranslatorPB
>>>>>>>>> The following issues have implemented asynchronous callbacks for
>>>>>>>>> Rpc.server, but I have not found any other modules to use related
>>>>>>> functions
>>>>>>>>> Server HADOOP-11552 HADOOP-17046
>>>>>>>>> In the implementation of asynchronous Rpc.client, this issue is 
>>>>>>>>> directly
>>>>>>>>> used
>>>>>>>>> Client HADOOP-13226
>>>>>>>>> Therefore, I believe that asynchronous routers are safe for modifying
>>>>>>> the
>>>>>>>>> RPC protocol, RPC server, and client
>>>>>>>>> 2. Forwarding requests to multiple downstream ns, the synchronous 
>>>>>>>>> router
>>>>>>>>> handler adds requests from multiple downstream ns to the thread pool
>>>>>>>>> (RouterRpcClient.executorService), and then waits for responses from 
>>>>>>>>> all
>>>>>>>>> downstream ns before returning. Since threads in the thread pool also
>>>>>>>>> process rpc requests synchronously, similar to a handler, the number 
>>>>>>>>> of
>>>>>>>>> threads in the thread pool directly affects the performance of
>>>>>>>>> invoiceConcurrent, which in turn affects the performance of the 
>>>>>>>>> handler.
>>>>>>>>> In asynchronous router implementation, the handler calls
>>>>>>> invoiceConcurrent
>>>>>>>>> to simply convert a request into multiple requests and add them to the
>>>>>>> asyn
>>>>>>>>> handler thread pool, which can then process the next request in the 
>>>>>>>>> call
>>>>>>>>> queue; When a connection thread of a downstream ns receives a 
>>>>>>>>> response,
>>>>>>> it
>>>>>>>>> will hand it over to the async response for processing. The async
>>>>>>> response
>>>>>>>>> thread will determine whether it has received all responses from the
>>>>>>>>> downstream ns. If it does, it will continue to process the response.
>>>>>>>>> Otherwise, the async response thread will process the next response. 
>>>>>>>>> The
>>>>>>>>> asynchronous router uses CompletableFuture.allOf() to implement
>>>>>>>>> asynchronous invoiceConcurrent, and the handler, async handler, async
>>>>>>>>> response, and connection thread still does not need to wait
>>>>>>> synchronously.
>>>>>>>>> In addition, synchronous routers not only have drawbacks in multi ns
>>>>>>>>> environments, but also in single downstream ns situations, it is often
>>>>>>>>> difficult to decide how many handlers to set for the router, setting 
>>>>>>>>> it
>>>>>>> too
>>>>>>>>> much will waste thread resources, and setting it too small will not be
>>>>>>> able
>>>>>>>>> to give pressure to downstream ns; Asynchronous routers can push
>>>>>>> requests
>>>>>>>>> to downstream ns without considering how to set handlers. Asynchronous
>>>>>>>>> routers can also better connect to more downstream storage services 
>>>>>>>>> that
>>>>>>>>> support the HDFS protocol, with better scalability.
>>>>>>>>> 3.Since I have not yet deployed asynchronous routers to our own 
>>>>>>>>> cluster,
>>>>>>>>> there is no performance comparison. However, theoretically, I believe
>>>>>>> that
>>>>>>>>> asynchronous routers will occupy more memory than synchronous routers.
>>>>>>>>> However, I do not believe that it will occupy a lot, especially since 
>>>>>>>>> we
>>>>>>>>> can control the maximum number of requests entering the router, as
>>>>>>>>> CompletableFuture is stable and widely used; In other aspects, it
>>>>>>> should be
>>>>>>>>> far superior to synchronous routers, especially in downstream 
>>>>>>>>> scenarios
>>>>>>>>> with more ns.If anyone is interested, you can also help to make a
>>>>>>>>> performance comparison
>>>>>>>>>> 2024年5月21日 11:39,Xiaoqiao He <hexiaoq...@apache.org> 写道:
>>>>>>>>>> Thanks for this great proposal!
>>>>>>>>>> Some questions after reviewing the design doc (sorry didn't review PR
>>>>>>>>>> carefully which is too large.)
>>>>>>>>>> 1. This solution will involve RPC framework update, will it affect
>>>>>>> other
>>>>>>>>>> modules and how to
>>>>>>>>>> keep other modules off these changes.
>>>>>>>>>> 2. Some RPC requests should be forward concurrently to all downstream
>>>>>>> NS,
>>>>>>>>>> will it cover
>>>>>>>>>> this case in this solution.
>>>>>>>>>> 3. Considering there is one init-version implementation, did you
>>>>>>> collect
>>>>>>>>>> some benchmark vs
>>>>>>>>>> the current synchronous model of DFSRouter?
>>>>>>>>>> Thanks again.
>>>>>>>>>> Best Regards,
>>>>>>>>>> - He Xiaoqiao
>>>>>>>>>> On Tue, May 21, 2024 at 11:21 AM zhangjian 
>>>>>>>>>> <1361320...@qq.com.invalid>
>>>>>>>>>> wrote:
>>>>>>>>>>> Thank you for your positive attitude towards this feature. You can
>>>>>>> debug
>>>>>>>>>>> the UTs provided in PR to better understand the current asynchronous
>>>>>>>>>>> calling function.
>>>>>>>>>>>> 2024年5月21日 02:04,Simbarashe Dzinamarira <simbadz...@apache.org> 写道:
>>>>>>>>>>>> Excited to see this feature as well. I'll spend more time
>>>>>>> understanding
>>>>>>>>>>> the
>>>>>>>>>>>> proposal and implementation.
>>>>>>>>>>>> On Mon, May 20, 2024 at 7:55 AM zhangjian 
>>>>>>>>>>>> <1361320...@qq.com.invalid
>>>>>>>>>>> wrote:
>>>>>>>>>>>>> Hi, Yuanbo liu,  thank you for your interest in this feature, I
>>>>>>> think
>>>>>>>>>>> the
>>>>>>>>>>>>> difficulty of an asynchronous router is not only to implement
>>>>>>>>>>> asynchronous
>>>>>>>>>>>>> functions, but also to consider the readability and reusability of
>>>>>>> the
>>>>>>>>>>>>> code, so as to facilitate the development of the community. I also
>>>>>>>>>>> planned
>>>>>>>>>>>>> to do the virtual thread you mentioned at the beginning, virtual
>>>>>>>>> Threads
>>>>>>>>>>>>> can achieve asynchronousization elegantly at the code level, but 
>>>>>>>>>>>>> the
>>>>>>>>>>>>> biggest problem is that it is not easy to upgrade the jdk version,
>>>>>>> no
>>>>>>>>>>>>> matter in the community or in the actual production environment.
>>>>>>>>>>> Therefore,
>>>>>>>>>>>>> I later used CompletableFuture, which is currently supported by 
>>>>>>>>>>>>> jdk
>>>>>>> 8,
>>>>>>>>>>> to
>>>>>>>>>>>>> achieve asynchronousization. The router is stateless, and the 
>>>>>>>>>>>>> router
>>>>>>>>> rpc
>>>>>>>>>>>>> process is very clear. Therefore, even if CompletableFuture itself
>>>>>>> is
>>>>>>>>>>> not
>>>>>>>>>>>>> as readable as the virtual thread, if we design it well, we can 
>>>>>>>>>>>>> make
>>>>>>>>> the
>>>>>>>>>>>>> asynchronous process look very clear.
>>>>>>>>>>>>>> 2024年5月20日 10:56,Yuanbo Liu <liuyuanb...@gmail.com> 写道:
>>>>>>>>>>>>>> Nice to see this feature brought up. I tried to implement this
>>>>>>>>> feature
>>>>>>>>>>> in
>>>>>>>>>>>>>> our internal clusters, and know that it's a very complicated
>>>>>>> feature,
>>>>>>>>>>> CC
>>>>>>>>>>>>>> hdfs-dev to bring more discussion.
>>>>>>>>>>>>>> By the way, I'm not sure whether virtual thread of higher jdk 
>>>>>>>>>>>>>> will
>>>>>>>>> help
>>>>>>>>>>>>> in
>>>>>>>>>>>>>> this case.
>>>>>>>>>>>>>> On Mon, May 20, 2024 at 10:10 AM zhangjian
>>>>>>> <1361320...@qq.com.invalid
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>> Hello everyone, currently there are some shortcomings in the RPC
>>>>>>> of
>>>>>>>>>>> HDFS
>>>>>>>>>>>>>>> router:
>>>>>>>>>>>>>>> Currently the router's handler thread is synchronized, when the
>>>>>>>>>>>>> *handler* thread
>>>>>>>>>>>>>>> adds the call to connection.calls, it needs to wait until the
>>>>>>>>>>>>> *connection* notifies
>>>>>>>>>>>>>>> the call to complete, and then Only after the response is put 
>>>>>>>>>>>>>>> into
>>>>>>>>> the
>>>>>>>>>>>>>>> response queue can a new call be obtained from the call queue 
>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>> processed. Therefore, the concurrency performance of the router 
>>>>>>>>>>>>>>> is
>>>>>>>>>>>>> limited
>>>>>>>>>>>>>>> by the number of handlers; a simple example is as follows: If 
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>> number of
>>>>>>>>>>>>>>> handlers is 1 and the maximum number of calls in the connection
>>>>>>>>> thread
>>>>>>>>>>>>> is
>>>>>>>>>>>>>>> 10, then even if the connection thread can send 10 requests to 
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>> downstream ns, since the number of handlers is 1, the router can
>>>>>>>>> only
>>>>>>>>>>>>>>> process one request after another.
>>>>>>>>>>>>>>> Since the performance of router rpc is mainly limited by the
>>>>>>> number
>>>>>>>>> of
>>>>>>>>>>>>>>> handlers, the most effective way to improve rpc performance
>>>>>>>>> currently
>>>>>>>>>>>>> is to
>>>>>>>>>>>>>>> increase the number of handlers. Letting the router create a 
>>>>>>>>>>>>>>> large
>>>>>>>>>>>>> number
>>>>>>>>>>>>>>> of handler threads will also increase the number of thread
>>>>>>> switches
>>>>>>>>>>> and
>>>>>>>>>>>>>>> cannot maximize the use of machine performance.
>>>>>>>>>>>>>>> There are usually multiple ns downstream of the router. If the
>>>>>>>>> handler
>>>>>>>>>>>>>>> forwards the request to an ns with poor performance, it will 
>>>>>>>>>>>>>>> cause
>>>>>>>>> the
>>>>>>>>>>>>>>> handler to wait for a long time. Due to the reduction of 
>>>>>>>>>>>>>>> available
>>>>>>>>>>>>>>> handlers, the router's ability to handle ns requests with normal
>>>>>>>>>>>>>>> performance will be reduced. From the perspective of the client,
>>>>>>> the
>>>>>>>>>>>>>>> performance of the downstream ns of the router has deteriorated 
>>>>>>>>>>>>>>> at
>>>>>>>>>>> this
>>>>>>>>>>>>>>> time. We often find that the call queue of the downstream ns is
>>>>>>> not
>>>>>>>>>>>>> high,
>>>>>>>>>>>>>>> but the call queue of the router is very high.
>>>>>>>>>>>>>>> Therefore, although the main function of the router is to 
>>>>>>>>>>>>>>> federate
>>>>>>>>> and
>>>>>>>>>>>>>>> handle requests from multiple NSs, the current synchronous RPC
>>>>>>>>>>>>> performance
>>>>>>>>>>>>>>> cannot satisfy the scenario where there are many NSs downstream 
>>>>>>>>>>>>>>> of
>>>>>>>>> the
>>>>>>>>>>>>>>> router. Even if the concurrent performance of the router can be
>>>>>>>>>>>>> improved by
>>>>>>>>>>>>>>> increasing the number of handlers, it is still relatively slow.
>>>>>>> More
>>>>>>>>>>>>>>> threads will increase the CPU context switching time, and in 
>>>>>>>>>>>>>>> fact
>>>>>>>>> many
>>>>>>>>>>>>> of
>>>>>>>>>>>>>>> the handler threads are in a blocked state, which is 
>>>>>>>>>>>>>>> undoubtedly a
>>>>>>>>>>>>> waste of
>>>>>>>>>>>>>>> thread resources. When a request enters the router, there is no
>>>>>>>>>>>>> guarantee
>>>>>>>>>>>>>>> that there will be a running handler at this time.
>>>>>>>>>>>>>>> Therefore, I consider asynchronous router rpc. Please view the
>>>>>>>>> issues:
>>>>>>>>>>>>>>> https://issues.apache.org/jira/browse/HDFS-17531  for the
>>>>>>> complete
>>>>>>>>>>>>>>> solution.
>>>>>>>>>>>>>>> And you can also view this PR:
>>>>>>>>>>>>> https://github.com/apache/hadoop/pull/6838,
>>>>>>>>>>>>>>> which is just a demo, but it completes the core asynchronous RPC
>>>>>>>>>>>>> function.
>>>>>>>>>>>>>>> If you think asynchronous routing is feasible, we can consider
>>>>>>>>>>> splitting
>>>>>>>>>>>>>>> this PR for easy review in the future.
>>>>>>>>>>>>>>> The PDF is attached and can also be viewed through issues.
>>>>>>>>>>>>>>> Welcome everyone to exchange and discuss!
>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>> To unsubscribe, e-mail: common-dev-unsubscr...@hadoop.apache.org
>>>>>>>>>>>>> For additional commands, e-mail: common-dev-h...@hadoop.apache.org
>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>> To unsubscribe, e-mail: hdfs-dev-unsubscr...@hadoop.apache.org
>>>>>>>>>>> For additional commands, e-mail: hdfs-dev-h...@hadoop.apache.org
>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>> To unsubscribe, e-mail: common-dev-unsubscr...@hadoop.apache.org
>>>>>>>>> For additional commands, e-mail: common-dev-h...@hadoop.apache.org
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: hdfs-dev-unsubscr...@hadoop.apache.org
>> For additional commands, e-mail: hdfs-dev-h...@hadoop.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: common-dev-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-dev-h...@hadoop.apache.org

Reply via email to