[RFC] X+SELinux performance work

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



(sorry for everyone who gets this twice, I misspelled the list address
the first time)

As a great example of how much selinux is killing X performance ajax
showed me the x11perf -create test.

Without the SELinux extensions: 175,000 events per second.
With the SELinux extensions:      1,000 events per second.

First thing I did to try to help was to implement creation caching in the AVC:
http://people.redhat.com/~eparis/xorg-selinux/libselinux-create-cache.patch

This resulted in about a 4.5-5x performance improvement

---

Next thing to try was to stop regularly calling recv on the netlink
socket to find policy update information.  So I hacked (poorly)
libselinux and the xselinux.c extention to try to create a seperate
thread which does nothing but listen on the netlink socket (I just stole
most of the code from dbus.)  X people on irc told me they didn't like
the idea of a thread in the X server and what I did to libselinux is
quite hideous.  I can certainly clean up libselinux (do the thread
callback as an selinux_set_callback() rather than this new
avc_open_init() interface.)  As long as the X people object to a
separate thread I guess these might be going into the bit bucket...

http://people.redhat.com/~eparis/xorg-selinux/libselinux-avc-open-init.patch
http://people.redhat.com/~eparis/xorg-selinux/xserver-selinux-netlink-faster.patch

---

Last thing was that translating from raw to whatever looked to be taking
up tons of syscalls, open a socket, bind, fail, close over and over and
over.  So I added new hook where X can just disable translations
altogether.  What does X care if it has raw strings?  I think as soon as
we have things to "display" strings to users they should take care of
translation and just let X internally hand things back and forth the way
the AVC can use them.

http://people.redhat.com/~eparis/xorg-selinux/libselinux-use-raw.patch
http://people.redhat.com/~eparis/xorg-selinux/xserver-selinux-raw.patch

So I've at least got us within one order of magnitude of the non-selinux
case.

Without the SELinux extensions:   175,000 events per second.
With the SELinux extensions:        1,000 events per second.
create-cache:                       5,000 events per second.
create-cache + nl-thread:           5,500 events per second.
create-cache + all-raw:            35,000 events per second.
create-cache + all-raw + nl-thead  65,000 events per second.

So initially the nl-thread didn't seem like a big win (only 10% perf
increase) but as I cut back on the setrans stuff the enforcing netlink
stuff started to dominate and it became a 2x perf win.

If I had a box with oprofile that worked I'd try to run it down more,
but I don't have any hardware with working performance counters.

Anyone how thoughts, comments, complaints, reviews, ideas, pointers,
direction, insults, compliments, etc etc, please share

-Eric


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux