Admittedly, set_buffer_hint() is not used much, and all it does is to 
sometimes avoid immediate writes by the HTTP/2 transport in gRPC. Your 
usecase does not seem one where this behavior is going to be useful. 

To be clear, a write is considered to be "committed" when it passes flow 
control in gRPC's HTTP/2 layer (not TCP) and it will not always result in 
bytes being sent out to the socket immediately. 
On Thursday, May 28, 2020 at 4:53:20 PM UTC-7 igor.ber...@gmail.com wrote:

> What is the point of WriteOptions::set_buffer_hint() then? If only one 
> write can be outstanding anyway, then I cannot simply fill-up the socket 
> buffer for WriteOptions::set_buffer_hint()  to work, because the second 
> write can only happen after the first write has been committed and then 
> *acked *the event queue! This must definitely affect throughput as it is 
> not at-par to just keep pushing data to socket write buffer. *I do one 
> write, then wait for the event loop to tells me "ok your write is 
> committed, you can do another one"*. This is inherently slow by design 
> due to overcommunication for writing messages.
>
>
> On Friday, May 29, 2020 at 12:32:31 AM UTC+1, yas...@google.com wrote:
>>
>> Hi,
>>
>> From what I understand, it seems that you are getting bottlenecked by the 
>> network. You are right that gRPC allows only one outstanding write at any 
>> given time but that decision itself probably won't affect the throughput 
>> much. If the application does not buffer the messages, it would instead 
>> need to buffered by gRPC and the end performance would remain about the 
>> same.
>>
>> On Monday, May 18, 2020 at 5:41:17 AM UTC-7 igor.ber...@gmail.com wrote:
>>
>>> Hi all,
>>>
>>> I've trying to implement a high-performance async server in C++ where 
>>> throughput matters, but also don't want to keep messages too long in a 
>>> buffer (say up to 200ms). 
>>> WriteOptions::set_buffer_hint() seems like a perfect candidate to enable 
>>> high throughput. However whenever a Write method is called on 
>>> ServerAsyncReaderWriter, then it just gets blocked, because it gets 
>>> buffered! But then ironically I cannot call another Write method, because 
>>> GRPC API demands another Write to be only called after another successful 
>>> Write has completed. How then is supposed to work if async buffered Write 
>>> does not commit the write right away, but then I cannot call Write method 
>>> in a batch as well? Am I getting this wrong somehow? I appreciate any help.
>>>
>>> void grpc_impl::ServerAsyncReaderWriter 
>>> <https://grpc.github.io/grpc/cpp/classgrpc__impl_1_1_server_async_reader_writer.html><
>>>  
>>> W, R >::Write ( const W &  msg,
>>> ::grpc::WriteOptions 
>>> <https://grpc.github.io/grpc/cpp/classgrpc_1_1_write_options.html>  
>>> options,
>>> void *  tag 
>>> ) inlineoverridevirtual
>>>
>>> Request the writing of *msg* using WriteOptions *options* with 
>>> identifying tag *tag*.
>>>
>>> *Only one write may be outstanding at any given time. This means that 
>>> after calling Write, one must wait to receive tag from the completion queue 
>>> BEFORE calling Write again*. WriteOptions *options* is used to set the 
>>> write options of this message
>>>
>>> Kind Regards,
>>>  Igor
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to grpc-io+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/33ebbacb-ab3c-4790-be13-b9740d9a6b0en%40googlegroups.com.

Reply via email to