Re: SMP on IBM eseriesand amd64

Niklas Hallqvist <[email protected]> Mon, 12 Jun 2006 10:06:38 +0200
Newsgroups gmane.os.openbsd.smp
Message-ID <[email protected]>
Eh, 100Mbit throughput on that machine should be achievable with just 
one cpu I think.
I don't think you will need SMP for that.  What kind of interrupt load 
you get (check with
systat vm, or vmstat -i) when you're throttled?  What kind of cpu load 
do you get?
I'm specifically interested in how much are in intr context vs sys, and 
idle.  I am really amazed
you can load this system with just filtering.

Niklas

Lukas Macura wrote:
> Thank you to your answer, now I know that it has no sense to compile
> some new kernels and spend my time :)
>
> Our machine is used as firewall, so we really need to pin irqs to both
> cpu and to utilise both CPUs. 
>
> In this situation, we do not achieve even 100mbit throughput :( Do you
> think it is normal? Is there any other optimalization ? Is ther
> possibility to use first cpu for kernel and interrupts and second for
> applications? Now only one cpu is utilized.. 
>
> Thank you!
> Lukas
>
> On Po, 2006-06-12 at 09:04 +0200, Niklas Hallqvist wrote:
>   
>> Hi!
>>
>> Unfortunately, you seem to have an application where OpenBSD is an 
>> inferior choice.
>> The design-goals behind SMP was to be able to utilize extra CPUs without 
>> adding too
>> much complexity (believe me, it is complex enough anyway).  This is why 
>> we chose the
>> so-called biglock approach, i.e. only one CPU can execute kernel code at 
>> any given time.
>> Interrupts are kernel code, thus only one interrupt can be served 
>> concurrently.  Furthermore,
>> at this point only the boot processor can execute interrupts (except 
>> timer which are cpu-local
>> and thus can occur on all CPUs), which means high-interrupt pressure 
>> will clog one singe CPU.
>> This is not optimal, but for many purposes it works quite OK.  If you 
>> have several processes
>> eating most of its CPU consumption in userland, this is indeed quite 
>> good.  An example is
>> compilation, one CPU will run the compiler, another the preprocessor, 
>> both are expensive
>> CPU consumers.  Web applications can also utilize extra CPUs with 
>> concurrent requests where
>> non-trivial time is spent in the application code (userland).
>>
>> It is not good for mostly-kernel or single-process applications, like 
>> routing, filtering or
>> database servers (unless the database implementation is designed with 
>> multiple worker processes,
>> and the queries are non-trivial, i.e. complexity is in the query 
>> optimization, not in just shoveling
>> data to the clients).
>>
>> We have always had intentions to improve this, but intentions is not 
>> enough.  Capable people must
>> have motivation to do the work.  What kind of motivation depends on 
>> exactly who is doing the work.
>>
>> What kind of application is this?  Pure routing/filtering?  I suspect so 
>> since you don't get any action
>> from the secondary CPU.
>>
>> Sorry for the sad answer,
>> Niklas
>>
>> Lukas Macura wrote:
>>     
>>> Hello all,
>>>
>>> please we have little problem with openbsd runing on $SUBJ.
>>> I think there could be better irq routing. But I don't know how to
>>> achieve this. In BIOS, I cannot change IRQ for anything. Every device in
>>> this server is on same IRQ. I really don't know why but I cannot change
>>> this. When I boot linux on this machine, IRQ routing is OK, probably
>>> bacause linux know how to change IRQ of devices.
>>>
>>> I do not understand what is difference between int and irq in dmesg.
>>> Sorry, I am not expert for this. But reality is, that on OpenBSD, only
>>> one CPU is used. Probably because all interrupts are routed thru this
>>> CPU. Second CPU is still idle. 
>>>
>>> Please can somebody help me what to do to utilise second CPU? We need
>>> more bandwidth and we want to use one NIC/one IRQ. So it shuold bring
>>> better CPU utilisation. Am I right?
>>>
>>> Thanks to all,
>>> Lukas Macura
>>>
>>> Here is dmesg:
>>> OpenBSD 3.8-current (GENERIC.MP) #6: Thu Nov  3 17:32:14 CET 2005
>>>     [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>>> real mem = 1073319936 (1048164K)
>>> avail mem = 908783616 (887484K)
>>> using 22937 buffers containing 107540480 bytes (105020K) of memory
>>> mainbus0 (root)
>>> mainbus0: scanning 0x9d400 to 0x9d7f0 for MP signature
>>> mainbus0: MP floating pointer found in extended bios data area at
>>> 0x9d540
>>> mainbus0: MP config table at 0x9e520, 356 bytes long
>>> mainbus0: Intel MP Specification (Version 1.4) (IBM ENSW X336 SMP    )
>>> cpu0 at mainbus0: apid 0 (boot processor)
>>> cpu0: Intel(R) Xeon(TM) CPU 3.20GHz, 3200.71 MHz
>>> cpu0:
>>> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,SBF,SSE3,NXE,LONG
>>> cpu0: 2MB 64b/line 8-way L2 cache
>>> cpu0: calibrating local timer
>>> cpu0: apic clock running at 200006987Hz
>>> cpu0: kstack at 0xffff80006585c000 for 20480 bytes
>>> cpu0: idle pcb at 0xffff80006585c000, idle sp at 0xffff800065860ff0
>>> cpu1 at mainbus0: apid 6 (application processor)
>>> cpu1: Intel(R) Xeon(TM) CPU 3.20GHz, 3200.12 MHz
>>> cpu1:
>>> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,SBF,SSE3,NXE,LONG
>>> cpu1: 2MB 64b/line 8-way L2 cache
>>> cpu1: kstack at 0xffff800065861000 for 20480 bytes
>>> cpu1: idle pcb at 0xffff800065861000, idle sp at 0xffff800065865ff0
>>> mpbios: bus 0 is type PCI
>>> mpbios: bus 1 is type PCI
>>> mpbios: bus 2 is type PCI
>>> mpbios: bus 3 is type PCI
>>> mpbios: bus 4 is type PCI
>>> mpbios: bus 5 is type PCI
>>> mpbios: bus 6 is type PCI
>>> mpbios: bus 7 is type PCI
>>> mpbios: bus 8 is type ISA
>>> ioapic0 at mainbus0 apid 14: pa 0xffff800001ba7f24, virtual wire mode,
>>> version 20, 24 pins
>>> ioapic1 at mainbus0 apid 13: pa 0xffff800001ba7e24, virtual wire mode,
>>> version 20, 24 pins
>>> ioapic2 at mainbus0 apid 12: pa 0xffff800001ba7d24, virtual wire mode,
>>> version 20, 24 pins
>>> ioapic0: int1 attached to isa0 irq 1 (type 0x0 flags 0x0)
>>> ioapic0: int2 attached to isa0 irq 0 (type 0x0 flags 0x0)
>>> ioapic0: int6 attached to isa0 irq 6 (type 0x0 flags 0x0)
>>> ioapic0: int8 attached to isa0 irq 8 (type 0x0 flags 0x5)
>>> ioapic0: int9 attached to isa0 irq 9 (type 0x0 flags 0x0)
>>> ioapic0: int12 attached to isa0 irq 12 (type 0x0 flags 0x0)
>>> ioapic0: int13 attached to isa0 irq 13 (type 0x0 flags 0x0)
>>> ioapic0: int14 attached to isa0 irq 14 (type 0x0 flags 0x0)
>>> ioapic0: int15 attached to isa0 irq 15 (type 0x0 flags 0x0)
>>> mpbios: can't find ioapic 0
>>> ioapic0: int16 attached to pci0 device 29 INT_A (type 0x0 flags 0x0)
>>> ioapic0: int19 attached to pci0 device 29 INT_B (type 0x0 flags 0x0)
>>> ioapic0: int23 attached to pci0 device 29 INT_D (type 0x0 flags 0x0)
>>> ioapic0: int17 attached to pci0 device 31 INT_B (type 0x0 flags 0x0)
>>> ioapic0: int16 attached to pci1 device 1 INT_A (type 0x0 flags 0x0)
>>> mpbios: can't find ioapic 0
>>> ioapic1: int4 attached to pci4 device 1 INT_A (type 0x0 flags 0x0)
>>> ioapic2: int0 attached to pci5 device 1 INT_A (type 0x0 flags 0x0)
>>> ioapic0: int16 attached to pci6 device 0 INT_A (type 0x0 flags 0x0)
>>> ioapic0: int16 attached to pci7 device 0 INT_A (type 0x0 flags 0x0)
>>> local apic: int1 attached to NMI (type 0x1 flags 0x0)
>>> local apic: int0 attached to ExtINT (type 0x3 flags 0x0)
>>> mainbus0: MP WARNING: 348 bytes of extended entries not examined
>>> pci0 at mainbus0 bus 0: configuration mode 1
>>> pchb0 at pci0 dev 0 function 0 "Intel E7710 SMCH" rev 0x0c
>>> "Intel E7710 MCH ERR" rev 0x0c at pci0 dev 0 function 1 not configured
>>> ppb0 at pci0 dev 2 function 0 "Intel E7710 MCH PCIE" rev 0x0c
>>> pci1 at ppb0 bus 2
>>> ppb1 at pci0 dev 4 function 0 "Intel E7710 MCH PCIE" rev 0x0c
>>> pci2 at ppb1 bus 3
>>> ppb2 at pci2 dev 0 function 0 "Intel PCIE-PCIE" rev 0x09
>>> pci3 at ppb2 bus 4
>>> mpt0 at pci3 dev 1 function 0 "Symbios Logic 53c1030" rev 0x08: apic 13
>>> int 4 (irq 10)
>>> mpt0: sending FW Upload request to IOC (size: 36, img size: 69956)
>>> mpt0: IM support: 4
>>> scsibus0 at mpt0: 16 targets
>>> sd0 at scsibus0 targ 0 lun 0: <LSILOGIC, 1030 IM IM, 1000> SCSI2
>>> 0/direct fixed
>>> sd0: 139898MB, 139898 cyl, 16 head, 128 sec, 512 bytes/sec, 286511104
>>> sec total
>>> mpt0: target 0 Asynchronous at 0MHz width 8bit offset 0 QAS 0 DT 0 IU 0
>>> ppb3 at pci2 dev 0 function 2 "Intel PCIE-PCIE" rev 0x09
>>> pci4 at ppb3 bus 5
>>> em0 at pci4 dev 1 function 0 "Intel PRO/1000MT (82545GM)" rev 0x04: apic
>>> 12 int 0 (irq 10), address 00:0e:0c:9c:07:13
>>> ppb4 at pci0 dev 6 function 0 "Intel E7710 MCH PCIE" rev 0x0c
>>> pci5 at ppb4 bus 6
>>> bge0 at pci5 dev 0 function 0 "Broadcom BCM5721" rev 0x11, BCM5750 B1
>>> (0x4101): apic 14 int 16 (irq 10) address 00:14:5e:0b:3e:ea
>>> brgphy0 at bge0 phy 1: BCM5750 10/100/1000baseT PHY, rev. 0
>>> ppb5 at pci0 dev 7 function 0 "Intel E7710 MCH PCIE" rev 0x0c
>>> pci6 at ppb5 bus 7
>>> bge1 at pci6 dev 0 function 0 "Broadcom BCM5721" rev 0x11, BCM5750 B1
>>> (0x4101): apic 14 int 16 (irq 10) address 00:14:5e:0b:3e:eb
>>> brgphy1 at bge1 phy 1: BCM5750 10/100/1000baseT PHY, rev. 0
>>> vendor "Intel", unknown product 0x359b (class system subclass
>>> miscellaneous, rev 0x0c) at pci0 dev 8 function 0 not configured
>>> uhci0 at pci0 dev 29 function 0 "Intel 82801EB/ER USB" rev 0x02: apic 14
>>> int 16 (irq 10)
>>> usb0 at uhci0: USB revision 1.0
>>> uhub0 at usb0
>>> uhub0: Intel UHCI root hub, rev 1.00/1.00, addr 1
>>> uhub0: 2 ports with 2 removable, self powered
>>> uhci1 at pci0 dev 29 function 1 "Intel 82801EB/ER USB" rev 0x02: apic 14
>>> int 19 (irq 7)
>>> usb1 at uhci1: USB revision 1.0
>>> uhub1 at usb1
>>> uhub1: Intel UHCI root hub, rev 1.00/1.00, addr 1
>>> uhub1: 2 ports with 2 removable, self powered
>>> ehci0 at pci0 dev 29 function 7 "Intel 82801EB/ER USB" rev 0x02: apic 14
>>> int 23 (irq 5)
>>> usb2 at ehci0: USB revision 2.0
>>> uhub2 at usb2
>>> uhub2: Intel EHCI root hub, rev 2.00/1.00, addr 1
>>> uhub2: 4 ports with 4 removable, self powered
>>> ppb6 at pci0 dev 30 function 0 "Intel 82801BA AGP" rev 0xc2
>>> pci7 at ppb6 bus 1
>>> vga1 at pci7 dev 1 function 0 "ATI Radeon VE QY" rev 0x00
>>> wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation)
>>> wsdisplay0: screen 1-5 added (80x25, vt100 emulation)
>>> pcib0 at pci0 dev 31 function 0 "Intel 82801EB/ER LPC" rev 0x02
>>> pciide0 at pci0 dev 31 function 2 "Intel 82801EB SATA" rev 0x02: DMA,
>>> channel 0 configured to compatibility, channel 1 configured to
>>> compatibility
>>> atapiscsi0 at pciide0 channel 0 drive 0
>>> scsibus1 at atapiscsi0: 2 targets
>>> cd0 at scsibus1 targ 0 lun 0: <HL-DT-ST, DVD-ROM GDR8083N, 0L02> SCSI0
>>> 5/cdrom removable
>>> cd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 2
>>> "Intel 82801EB/ER SMBus" rev 0x02 at pci0 dev 31 function 3 not
>>> configured
>>> isa0 at pcib0
>>> isadma0 at isa0
>>> pckbc0 at isa0 port 0x60/5
>>> pckbd0 at pckbc0 (kbd slot)
>>> pckbc0: using irq 1 for kbd slot
>>> wskbd0 at pckbd0: console keyboard, using wsdisplay0
>>> pmsi0 at pckbc0 (aux slot)
>>> pckbc0: using irq 12 for aux slot
>>> wsmouse0 at pmsi0 mux 0
>>> pcppi0 at isa0 port 0x61
>>> spkr0 at pcppi0
>>> sysbeep0 at pcppi0
>>> cpu0: prelint0 0x700 0x0
>>> cpu0: prelint1 0x400 0x0
>>> cpu0: timer0 0x300c0 0x0
>>> cpu0: pcint0 0x10000 0x0
>>> cpu0: lint0 0x10700 0x0
>>> cpu0: lint1 0x400 0x0
>>> cpu0: err0 0x10000 0x0
>>> ioapic2: int0 0xa070 0x0
>>> ioapic1: int4 0xa060 0x0
>>> ioapic0: int16 0xa061 0x0
>>> ioapic0: int19 0xa062 0x0
>>> ioapic0: int23 0xa063 0x0
>>> dkcsum: sd0 matches BIOS drive 0x80
>>> root on sd0a
>>> rootdev=0x400 rrootdev=0xd00 rawdev=0xd02
>>> cpu1: prelint0 0x10000 0x0
>>> cpu1: prelint1 0x10000 0x0
>>> cpu1: timer0 0x200c0 0x0
>>> cpu1: pcint0 0x10000 0x0
>>> cpu1: lint0 0x10700 0x0
>>> cpu1: lint1 0x400 0x0
>>> cpu1: err0 0x10000 0x0