On Wed, Nov 16, 2022 at 10:19 AM Jie Zhang <tx.zhi...@gmail.com> wrote:

> Actually, we used go1.16.5 before go1.19 released. Now we're consider
> using go1.19 GOMEMLIMIT instead.
>
> But GOMEMLIMIT is a soft limit, if you deploy multiple services in the
> same host (not per container per service), there will be problems.
> The GC is delayed, and if combined with GOGC=off, the memory usage will be
> higher.
>
In that scenario, I might suggest setting GOGC higher than 100 (not off)
but with some memory limit on each process instead.

>
> Maybe manually trigger forced GC, and combine GOMEMLIMIT will be better.
> I'm testing...
>
Manually triggering GCs has a relatively high risk of hurting performance.
Even if it doesn't hurt performance today, it might in the next release,
unless used very carefully. I don't recommend it outside of testing.

>
> 在2022年11月11日星期五 UTC+8 05:58:54<mkny...@google.com> 写道:
>
>> That's correct. The runtime has a simple heuristic for avoiding zeroing
>> but it's far from perfect. As a result, a ballast is inherently always
>> going to be a little risky. This is especially true on some platforms, such
>> as Windows, since there's no way to avoid marking the memory as committed
>> (Windows is free to use demand paging for memory in the range, so overall
>> system memory pressure may increase, but you can't avoid it being
>> *counted* as committed for a particular process).
>>
>> Taking a step back: why a ballast? What about your application makes a
>> ballast a better idea than, for example, setting GOMEMLIMIT=<something> and
>> GOGC=off?
>>
>> (For additional context, back when the memory limit was proposed, so was
>> a memory target (
>> https://go.googlesource.com/proposal/+/master/design/44309-user-configurable-memory-target.md)
>> which more directly replaces a ballast. I found very little interest in
>> this feature.)
>>
>> On Monday, November 7, 2022 at 9:08:23 AM UTC-5 hit.zh...@gmail.com
>> wrote:
>>
>>> Hi, guys, I know what happened.
>>>
>>> When we write `ballast := make([]byte, 1<<30)`, it will call makeslice
>>> to create a new slice. It's a large object. The memory will be allocated
>>> directly via allocLarge() function from heap.
>>>
>>> Actually, after allocating a mspan for it, it will check the address
>>> range whether it should be zeroed. Please check function `func
>>> allocNeedsZero(base, npage uintptr) bool`. When this function returns true,
>>> it means the slice underlying memory will be written to zero, otherwise it
>>> won't write it to zero.
>>>
>>> When we make a ballast as mentioned before, maybe it succeed (no RSS
>>> taken up) or fail (RSS taken up), it's relevant with the return value of
>>> function allocNeedsZero(...). And this function return true or false is
>>> relevant with the arena's state which is affected by previous object
>>> allocation and recycle.
>>>
>>> On Monday, November 7, 2022 at 1:26:41 PM UTC+8 tapi...@gmail.com wrote:
>>>
>>>> I ever also found this problem: global ballast doesn't work.
>>>> So I always use local ballast instead now.
>>>>
>>>> On Sunday, November 6, 2022 at 8:37:55 PM UTC+8 hit.zh...@gmail.com
>>>> wrote:
>>>>
>>>>> Before, I think the memory is allocated by mmap anon, which Linux OS
>>>>> guarantees reading will return zero value and no physical pages allocated.
>>>>> When writing happens, the physical pages will be allocated. Then I think
>>>>> the create a byte slice maybe the same.
>>>>>
>>>>> Your idea is clear. I agree with it.
>>>>>
>>>>> Just now, I use gdb to dump the ballast anon memory and use hexdump to
>>>>> check its dirty content, all data is zero (Maybe zeroing happens).
>>>>> But after turning GC off, it works as expected (no RSS is taken, no
>>>>> DIRTY).
>>>>> I think there must be something I didn't get it.
>>>>>
>>>>> On Sunday, November 6, 2022 at 8:11:51 PM UTC+8 Jan Mercl wrote:
>>>>>
>>>>>> On Sun, Nov 6, 2022 at 12:54 PM Kn (Kn) <hit.zh...@gmail.com> wrote:
>>>>>>
>>>>>> > Now the problem begins. I expect the ballast like `ballast :=
>>>>>> make([]byte, 1<<30)` shouldn't take up any physical memory because 
>>>>>> there's
>>>>>> no any writing to it.
>>>>>>
>>>>>> The backing array is specified to be zeroed, so we cannot say there's
>>>>>> no writing to it. Depending on the size of the backing array and the
>>>>>> operating system it may not get written as an optimization if backed
>>>>>> by memory the OS can guarantee to be zero filled. Only then it may
>>>>>> remain not yet bound to physical memory.
>>>>>>
>>>>>> A simple implementation will just zero it, meaning the opposite
>>>>>> happens - every byte of the backing array gets written and backing
>>>>>> pages for it get allocated.
>>>>>>
>>>>> --
> You received this message because you are subscribed to a topic in the
> Google Groups "golang-nuts" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/golang-nuts/66d0cItfkjY/unsubscribe.
> To unsubscribe from this group and all its topics, 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/858a4a4d-d049-40d7-9efe-ee6cfae0fa2dn%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/858a4a4d-d049-40d7-9efe-ee6cfae0fa2dn%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/CAFza%2Bu_T7dHsuc7tn1%3DPhentuaaGdfKcEejB89NWrOXesZtnTw%40mail.gmail.com.

Reply via email to