From: Matthew Dillon <dil...@apollo.backplane.com>
Subject: Review and report of linux kernel VM
Date: 1999/01/13
Message-ID: <199901140720.XAA22609@apollo.backplane.com>
X-Deja-AN: 432449302
Approved: n...@news1.mpcs.com
Sender: n...@news1.mpcs.com
Delivered-To: vmailer-hack...@freebsd.org
X-Gateway: Unidirectional mail2news gateway at MPCS
Newsgroups: mpc.lists.freebsd.hackers,muc.lists.freebsd.hackers
X-Loop: FreeBSD.ORG
General Overview
I've been looking at the linux kernel VM - mainly just to see what they've
changed since I last looked at it. It's quite interesting... not bad at
all though it is definitely a bit more memory-resource-intensive then
FreeBSD's. However, it needs a *lot* of work when it comes to freeing
up pages.
I apologize in advance for any mistakes I've made!
Basically, the linux kernel uses persistent hardware-level page tables
in a mostly platform-independant fashion. The function of the persistent
page tables is roughly equivalent to the function of FreeBSD's vm_object's.
That is, the page tables are used to manage sharing and copy-on-write
functions for VM objects.
For example, when a process fork()'s, pages are duplicated literally by
copying pte's. Writeable MAP_PRIVATE pages are write-protected and marked
for copy-on-write. A global resident-page array is used to keep track
of shared reference counts.
Swapped-out pages are also represented by pte's and also marked for
copy-on-write as appropriate. The swap block is stored in the PFN
area of the pte (as far as I can tell). The swap system keeps a separate
shared reference count to manage swap usage. The overhead is around
3 bytes per swap page (whether it is in use or not), and another pte-sized
(int usually) field when storing the swap block in the pagetable.
Linux cannot swap out its page tables, mainly due to the direct use of
the page tables in handling VM object sharing.
In general terms, linux's VM system is much cleaner then FreeBSD's... and
I mean a *whole lot* cleaner, but at the cost of eating some extra memory.
It isn't a whole lot of extra memory - maybe a meg or two for a typical
system managing a lot of processes, and much less for typical 'small'
systems. They are able to completely avoid the vm_object stacking
(and related complexity) that we do, and they are able to completely
avoid most of the pmap complexity in FreeBSD as well.
Linux appears to implement a unified buffer cache. It's pretty
straight forward except the object relationship is stored in
the memory-map management structures in each process rather then
in a vm_object type of structure.
Linux appears to map all of physical memory into KVM. This avoids
FreeBSD's (struct buf) complexity at the cost of not being able to
deal with huge-memory configurations. I'm not 100% sure of this, but
its my read of the code until someone corrects me.
Problems
Swap allocation is terrible. Linux uses a linear array which it scans
looking for a free swap block. It does a relatively simple swap
cluster cache, but eats the full linear scan if that fails which can be
terribly nasty. The swap clustering algorithm is a piece of crap,
too -- once swap becomes fragmented, the linux swapper falls on its face.
It does read-ahead based on the swapblk which wouldn't be bad if it
clustered writes by object or didn't have a fragmentation problem.
As it stands, their read clustering is useless. Swap deallocation is
fast since they are using a simple reference count array.
File read-ahead is half-hazard at best.
The paging queues ( determing the age of the page and whether to
free or clean it) need to be written... the algorithms being used
are terrible.
* For the nominal page scan, it is using a one-hand clock algorithm.
All I can say is: Oh my god! Are they nuts? That was abandoned
a decade ago. The priority mechanism they've implemented is nearly
useless.
* To locate pages to swap out, it takes a pass through the task list.
Ostensibly it locates the task with the largest RSS to then try to
swap pages out from rather then select pages that are not in use.
From my read of the code, it also botches this badly.
Linux does not appear to do any page coloring whatsoever, but it would
not be hard to add it in.
Linux cannot swap-out its page tables or page directories. Thus, idle
tasks can eat a significant amount of memory. This isn't a big deal for
most systems ( small systems: no problem. Big systems: probably have lots
of memory anyway ). But, mmap()'d files can create a significant burden
if you have a lot of forked processes ( news, sendmail, web server,
etc...). Not only does Linux have to scan the page tables for all the
processes mapping the file, whether or not they are actively using the
page being checked for, but Linux's swapout algorithm scans page tables
and, effectively, makes redundant scans of shared objects.
What FreeBSD can learn
Well, the main thing is that the Linux VM system is very, very clean
compared to the FreeBSD implementation. Cleaning up FreeBSD's VM system
complexity is what I've been concentrating on and will continue to
concentrate on. However, part of the reason that FreeBSD's VM system
is more complex is because it does not use the page tables to store
reference information. Instead, it uses the vm_object and pmap modules.
I actually like this feature of FreeBSD. A lot.
The biggest thing we need to do to clean up our VM system is, basically,
to completely rewrite the struct buf filesystem buffering mechanism to
make it much, much less complex - basically it should only be used as
placeholders for read and write ops and not used to cache block number
mappings between the files and the VM system, nor should it be used to
map pages into KVM. Separating out these three mechanisms into three
different subsystems would simplify the code enormously, I think. For
example, we could implement a simple vm_object KVM mapping mechanism
using FreeBSD's existing vm_object stacking model to map portions of a
vm_object (aka filesystem partition) into KVM.
Linux demarks interrupts from supervisor code much better then we do.
If we move some of the more sophisticated operational capabilities
out of our interrupt subsystem, we could get rid of most of the spl*()
junk we currently have to do. This is a real sore spot in current
FreeBSD code. Interrupts are just too complex. I'd also get rid of
FreeBSD's intermediate 'software interrupt' layer, which is able to
do even more complex things then hard interrupt code. The latency
considerations just don't make any sense verses running pending software
interrupts synchronously in tsleep(), prior to actually sleeping. We
need to do this anyway ( or move softints to kernel threads ) to be able
to take advantage of SMP mechanisms. The *only* thing our interrupts
should be allowed to do is finish I/O on a page or use zalloc().
-Matt
Matthew Dillon
<dil...@backplane.com>
To Unsubscribe: send mail to majord...@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
From: Stephen Hocking-Senior Programmer PGS Tensor Perth <shock...@prth.pgs.com>
Subject: Re: Review and report of linux kernel VM
Date: 1999/01/15
Message-ID: <199901150137.JAA22504@ariadne.tensor.pgs.com>#1/1
X-Deja-AN: 432773393
Approved: n...@news1.mpcs.com
Sender: n...@news1.mpcs.com
Delivered-To: vmailer-hack...@freebsd.org
Content-Type: text/plain; charset=us-ascii
X-Gateway: Unidirectional mail2news gateway at MPCS
Mime-Version: 1.0
Newsgroups: mpc.lists.freebsd.hackers,muc.lists.freebsd.hackers
X-Loop: FreeBSD.ORG
Looks good, fair & accurate. Now, do you have the cojones to post it to
linux-kernel? 8^)
Stephen
--
The views expressed above are not those of PGS Tensor.
"We've heard that a million monkeys at a million keyboards could produce
the Complete Works of Shakespeare; now, thanks to the Internet, we know
this is not true." Robert Wilensky, University of California
To Unsubscribe: send mail to majord...@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
From: "Daniel C. Sobral" <d...@newsguy.com>
Subject: Re: Review and report of linux kernel VM
Date: 1999/01/15
Message-ID: <369E9EF6.179F1A84@newsguy.com>#1/1
X-Deja-AN: 432773394
Approved: n...@news1.mpcs.com
Sender: n...@news1.mpcs.com
Content-Transfer-Encoding: 7bit
References: <199901150137.JAA22504@ariadne.tensor.pgs.com>
Delivered-To: vmailer-hack...@freebsd.org
X-Accept-Language: pt-BR,ja
Content-Type: text/plain; charset=us-ascii
X-Gateway: Unidirectional mail2news gateway at MPCS
MIME-Version: 1.0
Newsgroups: mpc.lists.freebsd.hackers,muc.lists.freebsd.hackers
X-Loop: FreeBSD.ORG
Stephen Hocking-Senior Programmer PGS Tensor Perth wrote:
>
> Looks good, fair & accurate. Now, do you have the cojones to post it to
> linux-kernel? 8^)
I think Dillon actually worked on Linux VM before seeing the light,
isn't that so?
--
Daniel C. Sobral (8-DCS)
d...@newsguy.com
If you sell your soul to the Devil and all you get is an MCSE from
it, you haven't gotten market rate.
To Unsubscribe: send mail to majord...@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
From: Matthew Dillon <dil...@apollo.backplane.com>
Subject: Re: Review and report of linux kernel VM
Date: 1999/01/14
Message-ID: <199901150356.TAA28463@apollo.backplane.com>#1/1
X-Deja-AN: 432809071
Approved: n...@news1.mpcs.com
Sender: n...@news1.mpcs.com
Delivered-To: vmailer-hack...@freebsd.org
X-Gateway: Unidirectional mail2news gateway at MPCS
Newsgroups: mpc.lists.freebsd.hackers,muc.lists.freebsd.hackers
X-Loop: FreeBSD.ORG
:Stephen Hocking-Senior Programmer PGS Tensor Perth wrote:
:>
:> Looks good, fair & accurate. Now, do you have the cojones to post it to
:> linux-kernel? 8^)
:
:I think Dillon actually worked on Linux VM before seeing the light,
:isn't that so?
:
:--
:Daniel C. Sobral (8-DCS)
:d...@newsguy.com
:
: If you sell your soul to the Devil and all you get is an MCSE from
:it, you haven't gotten market rate.
I did some minor work on the linux TCP stack about 3 iterations ago.
Moving to FreeBSD was more an interest issue then a seeing-the-light
issue. I also wrote dcron which was used in Linux for a bit, a long
time ago.
It should also be noted that I also did some work with the 4.2
and 4.3 kernels at UCB, long before either FreeBSD or Linux came
on the scene and that is another reason why I moved over to FreeBSD.
( I changed the serial driver on the Perkin Elmer we had to use
microcoded DMA rather then discrete serial interrupts. Unfortunately,
the microcode was still subject to interrupt disablement so the
improvement to the serial subsystem was only moderate ).
I do feel that FreeBSD works better as an ISP platform, though,
which is one reason why BEST went with FreeBSD rather then Linux.
-Matt
Matthew Dillon
<dil...@backplane.com>
To Unsubscribe: send mail to majord...@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
From: Ville-Pertti Keinonen <w...@iki.fi>
Subject: Re: Review and report of linux kernel VM
Date: 1999/01/22
Message-ID: <8690evpkc4.fsf@not.oeno.com>#1/1
X-Deja-AN: 435633909
Approved: n...@news1.mpcs.com
Sender: n...@news1.mpcs.com
References: <199901140720.XAA22609@apollo.backplane.com>
Delivered-To: vmailer-hack...@freebsd.org
X-Gateway: Unidirectional mail2news gateway at MPCS
Newsgroups: mpc.lists.freebsd.hackers,muc.lists.freebsd.hackers
X-Loop: FreeBSD.ORG
dil...@apollo.backplane.com (Matthew Dillon) writes:
> In general terms, linux's VM system is much cleaner then FreeBSD's... and
> I mean a *whole lot* cleaner, but at the cost of eating some extra memory.
Whaat?
You appear to be confusing cleanliness (as I understand it, and I'm
afraid that many other readers of your review might understand it)
with simplicity.
I would claim the exact opposite. The Linux VM system is simpler, but
far *less* clean because of the very inflexible (almost non-existent)
"layers". Not to mention the code, which shares the (IMHO) poor
source organization and apparently arbitrary dependencies of Linux as
a whole.
The Linux VM system looks like it hasn't been designed at all, just
implemented. The basic organization (although not that much of the
code) is still based on versions of Linux that only had one page table
for all tasks, was fully i386-specific (complete with hard-coded
constants all over the place), implemented shared libraries by having
a per-task array of shared library addresses, sharing pages by
scanning through all tasks to find one with the same library etc.
Subsystems in Linux don't seem to get re-written, they only evolve.
Perhaps my critique addresses the Linux code more than the
functionality...but they are related.
What's my definition of clean then? For example, common operations
shouldn't need to resort to brute-forceish approaches (not in many
cases, anyhow). Which reminds me, your swp_pager_meta_free_all looks
a bit frightening...do you intend to keep it like it is?
> Problems
...
In addition to the problems you stated, as far as I can tell, swap
backing is not shared for copy-on-write associations (copy-on-write
pages get swapped out multiple times, all but the last don't free any
memory) unless the page was swapped out when the maps were copied, in
which case it ends up copy-on-access...maybe, I'm not sure whether the
swap cache eliminates this.
This (and many of the things you pointed out) is due to the simplistic
approach where pages don't really have an identity (only mappings)
unless they are backed by an inode. Which is perhaps at the core of
most of the algorithmic differences between Mach/4.4BSD and Linux VM
systems.
IMHO pages need to have an identity even when they are not associated
with files (based on a quick glance, NetBSD's UVM seems to retain
this property while optimizing the management of anonymous pages. I'm
not convinced in terms of the choice of data structures for the anon
maps in UVM, though).
> reference information. Instead, it uses the vm_object and pmap modules.
> I actually like this feature of FreeBSD. A lot.
Additionally, the way FreeBSD does things has better potential for
concurrency (even though the locks have been ripped out) compared to
Linux.
> Linux demarks interrupts from supervisor code much better then we do.
You seem to consider simpler to mean cleaner/better. Although in this
case, I'd agree that much of the complexity of FreeBSD is unnecessary.
To Unsubscribe: send mail to majord...@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
From: dil...@apollo.backplane.com (Matthew Dillon)
Subject: Re: Review and report of linux kernel VM
Date: 1999/01/22
Message-ID: <199901222036.MAA56617@apollo.backplane.com>
X-Deja-AN: 435757119
Approved: n...@camelot.de
References: <199901140720.XAA22609@apollo.backplane.com>
X-Complaints-To: abuse@camelot.de
X-Trace: lancelot.camelot.de 917037589 24147 195.30.224.3 (22 Jan 1999 20:39:49 GMT)
Organization: Mail2News Gateway at CameloT Online Services
NNTP-Posting-Date: 22 Jan 1999 20:39:49 GMT
Newsgroups: muc.lists.freebsd.hackers,mpc.lists.freebsd.hackers
:Whaat?
:
:You appear to be confusing cleanliness (as I understand it, and I'm
:afraid that many other readers of your review might understand it)
:with simplicity.
:
:I would claim the exact opposite. The Linux VM system is simpler, but
:far *less* clean because of the very inflexible (almost non-existent)
:"layers". Not to mention the code, which shares the (IMHO) poor
:source organization and apparently arbitrary dependencies of Linux as
:a whole.
The Linux VM system implements all the core features that the
FreeBSD VM system implements, just not as efficiently. Its
use of a page table paradigm to do VM-specific object layering
is really not that bad of an idea. It *does* lock them into a more
ridgid scheme ( for example, the linux scheme starts to break down
when you share huge objects between processes ), but so far they've been
able to implement the same core feature set that we have in our VM system.
Thus, it is not possible to argue that their system is inferior from an
algorithmic standpoint, only from an implementation standpoint and a
flexibility standpoint.
We can hardly be proud of our VFS/BIO layering which has been so buggy
these last few years. The types of bugs I'm finding in FreeBSD have
nothing to do with the algorithms and everything to do with the code
being uncommented and virtually unreadable due to the hundreds of
badly thought out optimizations and other hacks that have obscured the
core implementation.
When I say clean, I mean 'readable, obvious, and functionallty layered'.
I had no trouble following the linux code even going deep into the paging
and VFS subsystems. Following FreeBSD code has been like pulling nails.
It's why we are *still* finding bugs in our VM system, after years of work.
FreeBSD's VM system is definitely more flexible and efficient. Given the
choice, I would much rather keep FreeBSD's VM system. That flexibility
has come at the cost of dirtying up the code considerably, though. What
use is flexibility if every new feature brings half a dozen bugs to light
and creates half a dozen more of its own?
My current work is to keep the flexibility while cleaning up the code.
If we can clean up the code, we will have a clean, flexible, AND kickass
VM system rather then simply a kickass VM system.
:
:What's my definition of clean then? For example, common operations
:shouldn't need to resort to brute-forceish approaches (not in many
:cases, anyhow). Which reminds me, your swp_pager_meta_free_all looks
:a bit frightening...do you intend to keep it like it is?
'efficiency'. As I stated, Linux's VM code is not terribly efficient.
I would disagree with the 'brute force' line, though. They've stuck
to their guns pretty well and the core concepts are sound. Linux simply
has not had the long operational history that BSD has and they are having
to relearn many of the same lessons.
It should be noted that linux can still implement inode-based object
layering underneath their existing VM system. Their direct use of
pagetables for bookkeeping does not prevent that.
:In addition to the problems you stated, as far as I can tell, swap
:backing is not shared for copy-on-write associations (copy-on-write
:pages get swapped out multiple times, all but the last don't free any
:memory) unless the page was swapped out when the maps were copied, in
:which case it ends up copy-on-access...maybe, I'm not sure whether the
:swap cache eliminates this.
:
:This (and many of the things you pointed out) is due to the simplistic
:approach where pages don't really have an identity (only mappings)
:unless they are backed by an inode. Which is perhaps at the core of
:most of the algorithmic differences between Mach/4.4BSD and Linux VM
:systems.
:
:IMHO pages need to have an identity even when they are not associated
:with files (based on a quick glance, NetBSD's UVM seems to retain
:this property while optimizing the management of anonymous pages. I'm
:not convinced in terms of the choice of data structures for the anon
:maps in UVM, though).
Pages under linux *DO* have an identity, but you have to look it up
in the meta objects backing the page tables based on the position of the
page in the page table. They do not implement swap as a paging layer as
we do, but then again our implementation of swap as a paging layer is
a mostly degenerate case in our vm_object layering system so it amounts
to pretty much the same thing.
I don't think COW pages get swapped multiple times, but I could be wrong.
My read is that when a linux process forks, the swap block associates are
shared even for COW pages. The COWed pages are marked read-only and
split if a write fault occurs. Unless it's writing the same shared
page from different processes to the same swap block over and over again,
that is. It shouldn't have to - I was under the impression that the
swap had a bunch of per-swap-block flags to keep track of the clean/dirty
state, so once one process swaps out a page, the others may scan it but
will not redundantly swap it out.
:> reference information. Instead, it uses the vm_object and pmap modules.
:> I actually like this feature of FreeBSD. A lot.
:
:Additionally, the way FreeBSD does things has better potential for
:concurrency (even though the locks have been ripped out) compared to
:Linux.
I disagree. FreeBSD still must hold locks through pmap changes and those
scan all related processes, just as linux does. The difference is that
since FreeBSD can delete page tables, it generally winds up scanning many
FEWER processes to change the pmap state for a page then linux. Linux
must scan/adjust the pmap state for e very process mmap()ing the page
whether or not it is using the page.
:> Linux demarks interrupts from supervisor code much better then we do.
:
:You seem to consider simpler to mean cleaner/better. Although in this
:case, I'd agree that much of the complexity of FreeBSD is unnecessary.
:
My philosophy is, in general, that (1) one must separate the algorithm
from the implementation and that (2) any algorithm can be cleanly
implemented. If it isn't, it should be rewritten. If the programmer
can't reimplement it, either the programmer is unworthy of the algorithm
or the programmer isn't experienced enough to do it right, or the
algorithm is bad. There is no middle ground in my world view.
-Matt
Matthew Dillon
<dil...@backplane.com>
To Unsubscribe: send mail to majord...@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message