Hi Greg,

Greg Troxel wrote:

> The good news is that the problem is not subtle and I have been able to
> reproduce the lockup.  And several times, if just barely provoked, the system
> came back. At least once, it didn't come back.
>
> I created a netbsd-current domU (pvhvm) with
>
>   6G RAM 
>   xbd0: 32G ffs2 root
>   xbd1: 8G swap
>   xbd2: 32G gpt with one big zfs partiition
>
>   tank11: pool with just dk0 from xbd2
>
> Not sure it matters, but the backing disks for the xbdN are zvol in zfs on
> dom0, on a not particularly new Sandisk 1T SATA SSD.
>
> I wrote a script:
>
>   create 100 dirs with 100 files each
>   sync
>   sleep 10
>   remove the files
>   sync
>
> Long ago I wrote a program "touchmem" to allocate a specific amount of memory,
> writing into each page to force allocation.

I can reproduce this behaviour with:

        for d in $(seq 0 99); do
          echo dir $d; mkdir dir$d
          seq 0 99 | xargs -n 1 -I % sh -c "echo $d % > dir$d/%"
        done
        rm -rf dir? dir?? &
        vmstat
           [ check how much KB is free ]
        dd if=/dev/zero of=/dev/null bs=820000k count=50
           [ where 820000 kB was just under the amount of memory free ]

After creating the files, this also works to trigger the messages:

        vmstat
           [ check how many KB is free ]
        dd if=/dev/zero of=/dev/null bs=820000k count=50
           [ where 820000 kB was just under the amount of memory free ]
        find dir* -type f | xargs cat > /dev/null


The "dd if=/dev/zero of=/dev/null bs=XXX" thing is a good way to
allocate a chunk of user memory, probably quite similar to how your
"touchmem" program does in practice.

> I found that the removal process was slow, and if I ran touchmem 6000 (to
> allocate 6000K) I would get on the console (this is an example where it
> came back).

zfs rm is known to be slow and not simple to fix :/  It effectively
does a synchronous write for each unlink.


> [ 2247.3254720] arc_reclaim_thread: negative free_memory -15888384

Doesn't this mean "Can you try to free 15888384 bytes if possible"?

On my test host I see a number of these types of messages

[ 21715.5174433] arc_reclaim_thread: free memory = -2420736

and

   # vmstat -s | awk '/target/ { print ; print $1 * 4096, "bytes" }'
        2730 target free pages
   11182080 bytes

which means we'd like to free up about 2.3MB (591 pages) to reach the
system target of 2730 pages.

Running a few "sysctl kstat.zfs.misc.arcstats.size" shows:

 - before the "dd" and "find ... cat":
        kstat.zfs.misc.arcstats.size = 31990280
 - during the "dd":
        kstat.zfs.misc.arcstats.size = 31991240
        kstat.zfs.misc.arcstats.size = 31996984
 - after "dd" and "find ... cat" finishes
        kstat.zfs.misc.arcstats.size = 31995776

I think this is ZFS noticing free memory is low and trying to do
something about it, but perhaps not very successfully?

> I wonder if others who have problems also see this kernel message.

This is on an amd64 qemu VM with 1GB of RAM and a 384MB disk (all ZFS).

Cheers,
Simon.

Reply via email to