Re: Chasing OOM Issues - good sysctl metrics to use?
Date: Wed, 11 May 2022 03:31:35 UTC
On 2022-May-10, at 17:49, Mark Millard <marklmi@yahoo.com> wrote:
> On 2022-May-10, at 11:49, Mark Millard <marklmi@yahoo.com> wrote:
>
>> On 2022-May-10, at 08:47, Jan Mikkelsen <janm@transactionware.com> wrote:
>>
>>> On 10 May 2022, at 10:01, Mark Millard <marklmi@yahoo.com> wrote:
>>>>
>>>> On 2022-Apr-29, at 13:57, Mark Millard <marklmi@yahoo.com> wrote:
>>>>
>>>>> On 2022-Apr-29, at 13:41, Pete Wright <pete@nomadlogic.org> wrote:
>>>>>>
>>>>>>> . . .
>>>>>>
>>>>>> d'oh - went out for lunch and workstation locked up. i *knew* i shouldn't have said anything lol.
>>>>>
>>>>> Any interesting console messages ( or dmesg -a or /var/log/messages )?
>>>>>
>>>>
>>>> I've been doing some testing of a patch by tijl at FreeBSD.org
>>>> and have reproduced both hang-ups (ZFS/ARC context) and kills
>>>> (UFS/noARC and ZFS/ARC) for "was killed: failed to reclaim
>>>> memory", both with and without the patch. This is with only a
>>>> tiny fraction of the swap partition(s) enabled being put to
>>>> use. So far, the testing was deliberately with
>>>> vm.pageout_oom_seq=12 (the default value). My testing has been
>>>> with main [so: 14].
>>>>
>>>> But I also learned how to avoid the hang-ups that I got --but
>>>> it costs making kills more likely/quicker, other things being
>>>> equal.
>>>>
>>>> I discovered that the hang-ups that I got were from all the
>>>> processes that I interact with the system via ending up with
>>>> the process's kernel threads swapped out and were not being
>>>> swapped in. (including sshd, so no new ssh connections). In
>>>> some contexts I only had escaping into the kernel debugger
>>>> available, not even ^T would work. Other times ^T did work.
>>>>
>>>> So, when I'm willing to risk kills in order to maintain
>>>> the ability to interact normally, I now use in
>>>> /etc/sysctl.conf :
>>>>
>>>> vm.swap_enabled=0
>>>
>>> I have been looking at an OOM related issue. Ignoring the actual leak, the problem leads to a process being killed because the system was out of memory. This is fine. After that, however, the system console was black with a single block cursor and the console keyboard was unresponsive. Caps lock and num lock didn’t toggle their lights when pressed.
>>>
>>> Using an ssh session, the system looked fine. USB events for the keyboard being disconnected and reconnected appeared but the keyboard stayed unresponsive.
>>>
>>> Setting vm.swap_enabled=0, as you did above, resolved this problem. After the process was killed a perfectly normal console returned.
>>>
>>> The interesting thing is that this test system is configured with no swap space.
>>>
>>> This is on 13.1-RC5.
>>>
>>>> This disables swapping out of process kernel stacks. It
>>>> is just with that option removedfor gaining free RAM, there
>>>> fewer options tried before a kill is initiated. It is not a
>>>> loader-time tunable but is writable, thus the
>>>> /etc/sysctl.conf placement.
>>>
>>> Is that really what it does? From a quick look at the code in vm/vm_swapout.c, it seems little more complex.
>>
>> I was going by its description:
>>
>> # sysctl -d vm.swap_enabled
>> vm.swap_enabled: Enable entire process swapout
>>
>> Based on the below, it appears that the description
>> presumes vm.swap_idle_enabled==0 (the default). In
>> my context vm.swap_idle_enabled==0 . Looks like I
>> should also list:
>>
>> vm.swap_idle_enabled=0
>>
>> in my /etc/sysctl.conf with a reminder comment that the
>> pair of =0's are required for avoiding the observed
>> hang-ups.
>>
>>
>> The analysis goes like . . .
>>
>> I see in the code that vm.swap_enabled !=0 causes
>> VM_SWAP_NORMAL :
>>
>> void
>> vm_swapout_run(void)
>> {
>>
>> if (vm_swap_enabled)
>> vm_req_vmdaemon(VM_SWAP_NORMAL);
>> }
>>
>> and that in turn leads to vm_daemon to:
>>
>> if (swapout_flags != 0) {
>> /*
>> * Drain the per-CPU page queue batches as a deadlock
>> * avoidance measure.
>> */
>> if ((swapout_flags & VM_SWAP_NORMAL) != 0)
>> vm_page_pqbatch_drain();
>> swapout_procs(swapout_flags);
>> }
>>
>> Note: vm.swap_idle_enabled==0 && vm.swap_enabled==0 ends
>> up with swapout_flags==0. vm.swap_idle. . . defaults seem
>> to be (in my context):
>>
>> # sysctl -a | grep swap_idle
>> vm.swap_idle_threshold2: 10
>> vm.swap_idle_threshold1: 2
>> vm.swap_idle_enabled: 0
>>
>> For reference:
>>
>> /*
>> * Idle process swapout -- run once per second when pagedaemons are
>> * reclaiming pages.
>> */
>> void
>> vm_swapout_run_idle(void)
>> {
>> static long lsec;
>>
>> if (!vm_swap_idle_enabled || time_second == lsec)
>> return;
>> vm_req_vmdaemon(VM_SWAP_IDLE);
>> lsec = time_second;
>> }
>>
>> [So vm.swap_idle_enabled==0 avoids VM_SWAP_IDLE status.]
>>
>> static void
>> vm_req_vmdaemon(int req)
>> {
>> static int lastrun = 0;
>>
>> mtx_lock(&vm_daemon_mtx);
>> vm_pageout_req_swapout |= req;
>> if ((ticks > (lastrun + hz)) || (ticks < lastrun)) {
>> wakeup(&vm_daemon_needed);
>> lastrun = ticks;
>> }
>> mtx_unlock(&vm_daemon_mtx);
>> }
>>
>> [So VM_SWAP_IDLE and VM_SWAP_NORMAL are independent bits
>> in vm_pageout_req_swapout.]
>>
>> vm_deamon does:
>>
>> mtx_lock(&vm_daemon_mtx);
>> msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep",
>> vm_daemon_timeout);
>> swapout_flags = vm_pageout_req_swapout;
>> vm_pageout_req_swapout = 0;
>> mtx_unlock(&vm_daemon_mtx);
>>
>> So vm_pageout_req_swapout is regenerated after thata
>> each time.
>>
>> I'll not show the code for vm.swap_idle_enabled!=0 .
>>
>
> Well, with continued experiments I got an example of
> a hangup for which looking via the db> prompt did not
> show any swapping out of process kernel stacks
> ( vm.swap_enabled=0 was the context, so expected ).
> The environment was ZFS (so with ARC).
>
> But this was testing with vm.pageout_oom_seq=120 instead
> of the default vm.pageout_oom_seq=12 . It may be that
> let sit long enough things would have unhung (external
> perspective).
>
> It is part of what I'm experimenting with so we will see.
>
Looks like I might have overreacted, in that for my
current tests there can be brief periods of delayed
response, but things respond in a little bit.
Definately not like the hang-ups I was getting with
vm.swap_enabled=1 .
===
Mark Millard
marklmi at yahoo.com