On Fri, 2011-06-03 at 18:19 +0200, Nicolas CARRIER wrote: > Hello ! > I'm investigating on pppob memory and CPU consumption which seems rather > high when it is "doing nothing" (i.e. blocked on its select()) > When I issue > $ strace -f -p pid_of_pppob > > I see a bunch of > [pid 13886] select(4, NULL, [3], NULL, {0, 1000}) = 0 (Timeout) > [pid 13886] gettimeofday({1307117559, 919982}, NULL) = 0 > [pid 13886] ioctl(3, USBDEVFS_REAPURBNDELAY or > USBDEVFS_REAPURBNDELAY32, 0xf736129c) = -1 EAGAIN (Resource temporarily > unavailable) > with 13886 not being the real pid of pppob... I suspect there is a fork > somewhere, but this pid doesn't appears when I do a top. > > The version of barry I use is still the git version of the 5 may I > pulled, I will test Monday with a more recent checkout. > Do you have a clue of what could cause these errors ?
I think it's something to do with how libusb 0.1 works. If I run brawchannel with strace -ft then I get similar output to what you see with pppob. The last parameter to the select call is a struct timespec which specifies to wait for 1000 microseconds (so 1 millisecond). This means that the select will trigger every millisecond, or one thousand times a second. Looking at the libusb 0.1 code seems to confirm this behaviour. See the code which calls select in usb_urb_transfer in the libusb 0.1 code: http://libusb.cvs.sourceforge.net/viewvc/libusb/libusb/linux.c?revision=1.83&view=markup Luckily libusb 1.0 appears to be more sensible, calling select with a timeout of 1 second: [pid 8334] 17:46:42 <... select resumed> ) = 0 (Timeout) [pid 8334] 17:46:42 select(1, [0], NULL, NULL, {1, 0} <unfinished ...> [pid 8335] 17:46:42 <... poll resumed> ) = 1 ([{fd=8, revents=POLLIN}]) [pid 8335] 17:46:42 timerfd_settime(8, 0, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0 [pid 8335] 17:46:42 ioctl(9, USBDEVFS_DISCARDURB, 0x1bad320) = 0 [pid 8335] 17:46:42 poll([{fd=6, events=POLLIN}, {fd=8, events=POLLIN}, {fd=9, events=POLLOUT}], 3, 60000) = 1 ([{fd=9, revents=POLLOUT}]) [pid 8335] 17:46:42 ioctl(9, USBDEVFS_REAPURBNDELAY, 0x7f8b77a13b88) = 0 [pid 8335] 17:46:42 timerfd_settime(8, 0, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0 [pid 8335] 17:46:42 futex(0x1ba6d80, FUTEX_WAKE_PRIVATE, 1) = 0 [pid 8335] 17:46:42 ioctl(9, USBDEVFS_SUBMITURB, 0x1bad320) = 0 [pid 8335] 17:46:42 timerfd_settime(8, TFD_TIMER_ABSTIME, {it_interval={0, 0}, it_value={2345, 306889000}}, NULL) = 0 [pid 8335] 17:46:42 poll([{fd=6, events=POLLIN}, {fd=8, events=POLLIN}, {fd=9, events=POLLOUT}], 3, 60000 <unfinished ...> [pid 8334] 17:46:43 <... select resumed> ) = 0 (Timeout) So if you're feeling really brave it might be interesting to see if the libusb 1.0 changes that are currently in my github branch help with your CPU usage problem. There's certainly far less output from strace when using libusb 1.0 compared to libusb 0.1. Regards, Toby ------------------------------------------------------------------------------ Simplify data backup and recovery for your virtual environment with vRanger. Installation's a snap, and flexible recovery options mean your data is safe, secure and there when you need it. Discover what all the cheering's about. Get your free trial download today. http://p.sf.net/sfu/quest-dev2dev2 _______________________________________________ Barry-devel mailing list Barry-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/barry-devel