Hi Robert, you misunderstand my point. Your first response was talking 
about the difference between chan and mutex implementation, here I am 
comparing mutex with difference number of goroutines.
Basically what you suspected doesn't match what was observed from 
statistics.

On Tuesday, August 27, 2019 at 12:34:25 AM UTC+2, Robert Engels wrote:
>
> I said in my very first response to you, that the mechanisms of the 
> implementation are different, with the in-kernel futex of the channel 
> implementation faster that the Go. Much of this is probably because the 
> thread is dedicated at this point. All that means is that up to a certain 
> point - the CAS works, but then due to contention that path no longer works.
>
> So you get better far performance up to N routines and slightly worse 
> performance after. Seems like a decent design decision for a lot of 
> workloads.
>
> Still, you keep ignoring this aspect - in the context of actual workloads 
> the difference is negligible.
>
> -----Original Message----- 
> From: changkun 
> Sent: Aug 26, 2019 4:08 PM 
> To: golang-nuts 
> Subject: Re: [go-nuts] sync.Mutex encounter large performance drop when 
> goroutine contention more than 3400 
>
> Based on the pprof graph, I would rather believe that the massive 
> performance drop happens because of the `semacquire1` implementation.
> When the number of goroutines is small, most of the `semacquire1` success 
> in the `cansemacquire ` fast path, or a middle path where a lock was 
> required but then `cansemacquire` success again.
> The drop happens in the case that goroutines are failed for fast path and 
> middle path, and therefore needs to be parked, which involves runtime 
> schedule costs.
> How do you refute to this argument?
>
> On Monday, August 26, 2019 at 10:56:21 PM UTC+2, changkun wrote:
>>
>> I also tested many times with `go tool pprof`, and it 
>> reproducible reports the following difference:
>>
>> Here is for 2400 goroutines:
>>
>> [image: 2400.png]
>>
>> Here is for 4800 goroutines:
>>
>> [image: 4800.png]
>>
>> The difference here is: 4800 goroutines heavily call `gopark` and  2400 
>> goroutines heavily calls runtime.procyield, have you notice this 
>> difference? Are they normal?
>> In attachment, you find the SVG graphs.
>>
>> On Monday, August 26, 2019 at 10:41:42 PM UTC+2, Robert Engels wrote:
>>>
>>> You might want to try 'perf mem' to report the access delays - it may be 
>>> contention on the memory controller as well.
>>>
>>> Thinking about it again, I wouldn't expect a large jump if things were 
>>> fair - for example, if at 100 they all fit in the cache, at 110, some are 
>>> still in the cache, but some operations are slower, etc. so I would expect 
>>> a jump but not as large as you see.
>>>
>>> Still, most linux context switches are 3-4 us, and you are talking about 
>>> 300 ns, so you're still doing pretty good, and at approx 40 ns, there are 
>>> so many aspects that come into play, i'm not sure you or anyone has the 
>>> time to figure out - maybe the HFT guys are interested...
>>>
>>> Like I said, on my OSX machine the times are very similar with both 
>>> approaches, so it is OS dependent, and probably OS and hardware 
>>> configuration dependent - so I think I've probably reached the end of being 
>>> able to help.
>>>
>>> And finally, it probably doesn't matter at all - if the Go routine is 
>>> doing anything of value, 300 ns is probably an insignificant cost.
>>>
>>>
>>> -----Original Message----- 
>>> From: changkun 
>>> Sent: Aug 26, 2019 3:15 PM 
>>> To: golang-nuts 
>>> Subject: Re: [go-nuts] sync.Mutex encounter large performance drop when 
>>> goroutine contention more than 3400 
>>>
>>> Did I do anything wrong, the cache hint ratio decrease linearly, is it 
>>> an expected result? I thought the cache hint ratio would have a significant 
>>> drop:
>>>
>>> [image: chart.png]
>>> Raw data:
>>>
>>> #goroutines cache-references cache-misses hint/(hint+miss)
>>> 2400 697103572 17641686 0.9753175194
>>> 3200 798160789 54169784 0.9364451004
>>> 3360 1387972473 148415678 0.9033996208
>>> 3600 1824541062 272166355 0.8701934506
>>> 4000 2053779401 393586501 0.8391795437
>>> 4800 1885622275 461872899 0.8032486268
>>> On Monday, August 26, 2019 at 9:26:05 PM UTC+2, Robert Engels wrote:
>>>>
>>>> You can run the process under 'perf' and monitor the cpu cache hit/miss 
>>>> ratio.
>>>>
>>>> -----Original Message----- 
>>>> From: changkun 
>>>> Sent: Aug 26, 2019 2:23 PM 
>>>> To: golang-nuts 
>>>> Subject: Re: [go-nuts] sync.Mutex encounter large performance drop when 
>>>> goroutine contention more than 3400 
>>>>
>>>> Your cache theory is very reasonable, but this was clear in the 
>>>> beginning post:  "before or after the massive increase, performance drops 
>>>> linearly".
>>>> Your hypothesis is reasonable, but how can you prove your hypothesis? 
>>>> By host machine cache usage monitoring? 
>>>> Matching of a concept is still not persuasive.
>>>>
>>>> On Monday, August 26, 2019 at 8:08:27 PM UTC+2, Robert Engels wrote:
>>>>>
>>>>> Which is what I would expect - once the number of routines exhaust the 
>>>>> cache, it will take the next level (or never since its main memory) to 
>>>>> see 
>>>>> an massive increase in time. 4800 is 30% slower than 3600 - so it is 
>>>>> increasing linearly with the number of Go routines.
>>>>>
>>>>>
>>>>> -----Original Message----- 
>>>>> From: changkun 
>>>>> Sent: Aug 26, 2019 11:49 AM 
>>>>> To: golang-nuts 
>>>>> Subject: Re: [go-nuts] sync.Mutex encounter large performance drop 
>>>>> when goroutine contention more than 3400 
>>>>>
>>>>> According to your formula let's sample three points:
>>>>>
>>>>> 2400 goroutines: 2.508s/(50000000*2400) = 2.09 × 10^-11 s
>>>>> 3600 goroutines: 12.219s/(50000000*3600) = 6.78833333 × 10-11 seconds
>>>>> 4800 goroutines: 16.020s/(50000000*4800) = 6.67500 × 10^-11 s
>>>>>
>>>>> One can observe that 3600 and 4800 mostly equal to each other, but 
>>>>> they both three times slower than 2400.
>>>>>
>>>>> goos: linux
>>>>> goarch: amd64
>>>>> BenchmarkMutexWrite/goroutines-2400-8           50000000              
>>>>>   46.5 ns/op
>>>>> PASS
>>>>> ok      _/home/changkun/dev/tests       2.508s
>>>>>
>>>>> goos: linux
>>>>> goarch: amd64
>>>>> BenchmarkMutexWrite/goroutines-3600-8           50000000              
>>>>>  240 ns/op
>>>>> PASS
>>>>> ok      _/home/changkun/dev/tests       12.219s
>>>>>
>>>>> goos: linux
>>>>> goarch: amd64
>>>>> BenchmarkMutexWrite/goroutines-4800-8           50000000              
>>>>>  317 ns/op
>>>>> PASS
>>>>> ok      _/home/changkun/dev/tests       16.020s
>>>>>
>>>>>
>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "golang-nuts" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to golan...@googlegroups.com.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/golang-nuts/6dd6ec66-b0cc-4c8e-a341-94bff187214f%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/golang-nuts/6dd6ec66-b0cc-4c8e-a341-94bff187214f%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "golang-nuts" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to golan...@googlegroups.com.
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/golang-nuts/495e22e8-4a5f-4a1d-88f8-59ff2b0a4006%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/golang-nuts/495e22e8-4a5f-4a1d-88f8-59ff2b0a4006%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>>
>>>>
>>>>
>>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to golan...@googlegroups.com.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/golang-nuts/0c2b4dc1-3774-4fe6-9cd6-a841dd7265c4%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/0c2b4dc1-3774-4fe6-9cd6-a841dd7265c4%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>>
>>>
>>>
>>> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golan...@googlegroups.com <javascript:>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/ddffa01f-a156-431a-8a3a-0dc247112723%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/ddffa01f-a156-431a-8a3a-0dc247112723%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
>
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/229dc928-b297-4e9d-aedc-9e51c176d86e%40googlegroups.com.

Reply via email to