Red Hat Enterprise Linux Performance and Tuning 

Name: Larry Woodman , John Shakshober

Agenda
Red Hat Enterprise Linux (RHEL) Performance and Tuning

References ­ valuable tuning guides/books 

Part 1 ­ Memory Management/Filesystem Cache

Part 2 ­ Performance Monitoring Tools

Perf 3 ­ Performance Tuning/Analysis 

Part 4 ­ Case Study – RHEL4 vs RHEL3 Perf Comparison

Notes:

Network, NFS Performance covered in separate talks.

What OS version and architectures is everyone using?

Linux Performance Tuning References

Alikins, ?System Tuning Info for Linux Servers, 
http://people.redhat.com/alikins/system_tuning.html

Axboe, J., ?Deadline IO Scheduler Tunables, SuSE, EDF R&D, 2003.

Braswell, B, Ciliendo, E, ?Tuning Red Hat Enterprise Linux on 
IBMeServer xSeries Servers,  http://www.ibm.com/redbooks  

Corbet, J., ?The Continuing Development of IO Scheduling?, 
http://lwn.net/Articles/21274.

Ezolt, P, Optimizing Linux Performance, www.hp.com/hpbooks, Mar 
2005.

Heger, D, Pratt, S, ?Workload Dependent Performance Evaluation of the 
Linux 2.6 IO Schedulers?, Linux Symposium, Ottawa, Canada, July 
2004.

Red Hat Enterprise Linux “Performance Tuning Guide” 
http://people.redhat.com/dshaks/rhel3_perf_tuning.pdf.

 kupdated . smp. bdflush.Memory Management  Physical Memory(RAM) Management  Virtual Address Space Maps   ● 32­bit: x86 up. IA64 Kernel Wired Memory ● Static Boot­time ● Slabcache ● Pagetables ● HughTLBfs Reclaimable User Memory ●  Pagecache/Anonymous split Page Reclaim Dynamics ● kswapd. hugemem. 1G/3G vs 4G/4G  ● 64­bit: x86_64.

Physical Memory(RAM) Management  Physical Memory Layout  Zones  mem_map array  NUMA  Page lists ● Free list ● Active ● Inactive .

Memory Zones 32­bit 64­bit Up to 64 GB(PAE)  Highmem Zone End of RAM    Normal  Zone 896 MB(or 3968MB)    Normal Zone 16MB    DMA Zone 0 16MB(or 4GB)    DMA Zone 0 .

Memory Zone Utilization DMA Normal 24bit I/O Kernel Static Kernel Dynamic   slabcache   bounce buffers   driver allocations User Overflow Highmem User   Anonymous   Pagecache   Pagetables .

Per­Zone Resources  mem_map  Free lists  Active and inactive page lists  Page reclamation(kswapd)  Page reclamation watermarks .

  Page struct size: ● RHEL3 32­bit = 60bytes ● RHEL3 64­bit = 112bytes ● RHEL4 32­bit = 32bytes ● RHEL4 64­bit = 56bytes 16GB x86 running RHEL3: ●  17179869184 / 4096 * 60 = ~250MB mem_map array!!! RHEL4 mem_map is only about 50% of the RHEL3 mem_map.mem_map  Kernel maintains a “page” struct for each 4KB(16KB on IA64)  page of RAM  The mem_map array consumes significant amount of  lowmem at boot time. .

● Freelist fragmentation. .Per zone Free list/buddy allocator lists  Kernel maintains per­zone free list  Buddy allocator coalesces free pages into larger physically contiguous pieces DMA 1*4kB 4*8kB 6*16kB 4*32kB 3*64kB 1*128kB 1*256kB 1*512kB 0*1024kB 1*2048kB 2*4096kB = 11588kB) Normal  217*4kB 207*8kB 1*16kB 1*32kB 0*64kB 1*128kB 1*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 3468kB) HighMem  847*4kB 409*8kB 17*16kB 1*32kB 1*64kB 1*128kB 1*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 7924kB)  Memory allocation failures ● Freelist exhaustion.

 bss ● Pagecache­filesystem data Inactive­not referenced ● Dirty­modified ● Laundry­writeback in progress ● Clean­ready to free Free ● Coalesced buddy allocator . heap.Per­zone page lists    Active­recently referenced ● Anonymous­stack.

Virtual Address Space Maps   32­bit ● 3G/1G address space ● 4G/4G address space 64­bit ● X86_64 ● IA64 .

Linux 32-bit Address Spaces 3G/1G Kernel(SMP) VIRT 0GB                                  3GB                  4GB RAM DMA Normal           HighMem 4G/4G Kernel(Hugemem) VIRT User(s) Kernel 0 GB                                                 3968MB DMA                    Normal                    3968MB      HighMem .

Linux 64-bit Address Space x86_64 VIRT kernel User 0                                       1TB                          RAM IA64 VIRT 0 RAM 1 2 3 4 5 6 7 .

Memory Pressure 32­ bit DMA Normal Highmem Kernel Allocations                   User Allocations 64­ bit DMA Normal Kernel and User Allocations .

 data. dentry cache and buffer header dynamics Pagetables(Highmem/Normal zone) ●  32bit versus 64bit  HughTLBfs(Highmem/Normal zone) ● Ie 4K page w/ 4GB  memory = 1 Million TLB entries ●     4M page w/ 4GB memory = 1000 TLB entries . BSS ● Bootmem allocator ● Tables and hashes(mem_map) Slabcache(Normal zone) ● Kernel data structs ● Inode cache.Kernel Memory Pressure     Static – Boot­time(DMA and Normal zones) ● Kernel text.

User Memory Pressure Anonymous/pagecache split Pagecache Allocations                            Page Faults pagecache anonymous .

● Dynamic. Anonymous memory is private and grows on user demmand ● Allocation followed by pagefault.PageCache/Anonymous memory split  Pagecache memory is global  and grows when filesystem data is accessed   until memory is exhausted. .    Pagecache is freed: ● Underlying files are deleted. ● Kswapd reclaims pagecache pages when memory is exhausted. ● Swapin. Anonymous memory is freed: ● Process unmaps anonymous region or exits. ● Unmount of the filesystem. ● Kswapd reclaims anonymous pages(swapout) when memory is  exhausted  Balance between pagecache and anonymous memory.

32-bit Memory Reclamation Kernel Allocations                   User Allocations DMA Normal Highmem Kernel Reclamation               User Reclamation   (kswad)                                     (kswapd.bdflush/kupdate)    slapcache reaping                page aging    inodecache pruning                 pagecache shrinking               bufferhead freeing                   swapping .

64-bit Memory Reclamation RAM Kernel and User Allocations                                                           Kernel and User Reclamation .

Anonymous/pagecache reclaiming Pagecache Allocations                            Page Faults pagecache anonymous kswapd(bdflush. kupdated)              kswapd    page reclaim     page reclaim (swapout) deletion of a file  unmount filesystem                                         unmap              exit .

Per Zone Paging Dynamics User Allocations Reactivate ACTIVE INACTIVE  INACTIVE DIRTY CLEAN Page aging Swapout bdflush User deletions Reclaiming FREE .

 mem. kprobe (separate summit talk) 3rd party profiling/ capacity monitoring ● ● Perfmon. process. dmesg.Part 2 ­ Performance Monitoring Tools     Standard Unix OS tools ● Monitoring  ­ cpu. info (cpu. profile=2 Tracing  ● strace. AltSysrq ● Profiling ­ nmi_watchdog=1. ltrace ● dprobe. slab). Caliper. vtune . memory. disk ● oprofile Kernel Tools  ● /proc.

rss 4 – strace.ltrace 5 – sar ­u  5 – sar ­r ­B ­W 5 – sar 6 – procinfo 6 – meminfo  7 – iostat  7 – free 1 – iostat ­x 8 – gnome­ 8 – gnome­ 2 – vmstat ­ D system­monitor system­monitor 3 – sar ­DEV # 9 – KDE­monitor 9 – KDE­monitor 4 – nsfstat 10 – oprofile  10 – oprofile  5 – NEED MORE! Disk Tools . Red Hat Top Tools (priority order?)  CPU Tools  Memory Tools  Process Tools 1 – top 1 – top 1 – top 2 – vmstat  2 – vmstat ­s 2 – ps ­o pmem 3 – mpstat ­P all 3 – ipcs 3 – gprof 4 – ps ­ef  4 – ps ­o vss.

#! now transition from write to reads procs                      memory      swap          io     system         cpu  r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy wa id  1  4      0  51040 200524 6705544    0    0     2 133519 1265   839  0 26 56 18  1  1      0  35064 200524 6712724    0    0    40 118911 1367  2021  0 35 42 23  0  1      0  68264 234372 6647020    0    0 76744    54 2048  4032  0  7 20 73  0  1      0  34468 234372 6678016    0    0 77391    34 1620  2834  0  9 18 72  0  1      0  47320 234372 6690356    0    0 81050    77 1783  2916  0  7 20 73  1  0      0  38756 234372 6698344    0    0 76136    44 2027  3705  1  9 19 72  0  1      0  31472 234372 6706532    0    0 76725    33 1601  2807  0  8 19 73 ..vmstat of IOzone to EXT3 fs 6GB mem #! deplete memory until pdflush turns on procs                      memory      swap          io     system         cpu  r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy wa id  2  0      0 4483524 200524 234576    0    0    54    63  152   513  0  3  0 96  0  2      0 1697840 200524 2931440   0    0   578 50482 1085  3994  1 22 14 63  3  0      0 1537884 200524 3841092   0    0   193 58946 3243 14430  7 32 18 42  0  2      0 528120 200524 6228172    0    0   478 88810 1771  3392  1 32 22 46  0  1      0  46140 200524 6713736    0    0   179 110719 1447 1825  1 30 35 35  2  2      0  50972 200524 6705744    0    0   232 119698 1316 1971  0 25 31 44 ...

00   255.00 133408.00 70656.90   0.86  97.00    0.33     0.60   0.ELsmp (node1)       05/09/2005 avg­cpu:  %user   %nice    %sys %iowait   %idle            0.00 .90  0.78   1.2.63    0.00 553.00 145040.00    0.12     0.88  98.iostat ­x of same IOzone EXT3 file system  Iostat metrics rates perf sec                                  sizes and response time r|w rqm/s – request merged/s        averq­sz – average request sz r|w sec/s – 512 byte sectors/s       avequ­sz – average queue sz r|w KB/s – Kilobyte/s                      await – average wait time ms r|w /s – operations/s                       svcm – ave service time ms Linux 2.00 66752.10  0.99    1.00     0.40 sdi        17110.07     1.98    1.06   Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq­sz avgqu­sz   await  svctm  %util sdi        16164.00 522.00 568.00     0.00     0.80   1.00 133504.00 72520.00   255.91   1.40    0.88   1.01    1.78  98.40  0.00    0.50  0.00     0.00   255.00 sdi        17561.0.00 141312.40 sdi        16153.00    1.50   0.76 100.00 66704.00 523.00   255.21­27.00    2.00    0.31     1.91   96.4.10   0.

10 oracle 27828 oracle    15   0 27584 6648 4620 S  0.0  0. m­memory.  0.39.7% wa.  0.0  0.  2036840k used.0   0:00.11 oracle 27805 oracle    17   0 1315m 1.00 ksoftirqd/0 .0  0.71.3% us.8   0:00. 15:22.3% sy.0% ni. 92.3  0.11 migration/0     3 root      34  19     0    0    0 S  0.0% id.0 61.2g 1.0   0:00.      160k used.exe     1 root      16   0  4744  580  480 S  0.7% id.  0.17 tpcc.08 oracle 27827 oracle    16   0 1315m 1.0   0:00.09 oracle 27802 oracle    16   0 1315m 1.  2 users.3   0:00. > ­ column sort top ­ 09:01:04 up 8 days. 0.2g D  0.50 init     2 root      RT   0     0    0    0 S  0.   0 stopped.  2. 0. t­threads.0 60.3% si Cpu1  :  0.0   0:00.   1 running.3% us.2g D  1.0 61.  0. 89.0% hi.9   0:00.  0.2g 1.7 61.  0.0% wa. 113 sleeping.2g D  1.2g 1.   417720k cached                                                                                          PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 27830 oracle    16   0 1315m 1.  0.  load average: 1.0% si Mem:   2053860k total.  2031448k free.   0 zombie Cpu0  :  5.10 oracle 27811 oracle    16   0 1315m 1.2g 1.0% hi.2g 1.    17020k free.  0.2g D  1.0   0:00.12 Tasks: 114 total.  9.top ­ press h – help.0   0:00.3 60.0% ni.    99556k buffers Swap:  2031608k total.3% sy.2g D  1.

00    100.33     98.00      0.00 01:20:00 PM      eth1      0.49    306.localdomain)      05/16/2005   10:32:28 PM       CPU     %user     %nice   %system     %idle 10:32:31 PM       all      0.66 Average:          all      0.11     99.00 .00      0.localdomain)      03/16/2005   01:10:01 PM     IFACE   rxpck/s   txpck/s   rxbyt/s   txbyt/s   rxcmp/s    txcmp/s  rxmcst/s 01:20:00 PM        lo      3.00      0.00      0.00       0.4.21­20.00 10:32:34 PM       all      1.49      3.00      0.16      0.21­20.00       0.33 10:32:37 PM       all      1.00     98.00      0.00       0.00      0.EL (localhost.EL (localhost.34      0.SAR [root@localhost redhat]# sar ­u 3 3 Linux 2.00      0.89      3.00      0.33      0.00 [root] sar ­n DEV  Linux 2.4.53   2395.16    306.70      0.89      0.00      0.34    484.00      0.00 01:20:00 PM      eth0      3.00      0.

free/numastat –  memory allocation [root@localhost redhat]# free ­l              total       used       free     shared    buffers      cached Mem:        511368     342336     169032          0      29712      167408 Low:        511368     342336     169032          0          0           0 High:            0          0          0          0          0           0 ­/+ buffers/cache:     145216     366152 Swap:      1043240          0    1043240 numastat (on 2­cpu x86_64 based system)                          node1         node0 numa_hit               9803332      10905630 numa_miss              2049018       1609361 numa_foreign           1609361       2049018 interleave_hit           58689         54749 local_node             9770927      10880901 other_node             2081423       1634090 .

00    193.00    0.00    199.localdomain)      05/16/2005   10:40:34 PM  CPU   %user   %nice %system   %idle    intr/s 10:40:37 PM  all    3.67 10:40:40 PM  all    1.00   98.67    208.4.00   97.22 .00    0.00    0.21­20.67    0.ps.33    0.00   98.33    196. mpstat [root@localhost root]# ps ­ef UID        PID  PPID  C STIME TTY          TIME CMD root         1     0  0 20:30 ?        00:00:04 init root         2     1  0 20:30 ?        00:00:00 [keventd] root         3     1  0 20:30 ?        00:00:00 [kapmd] root         4     1  0 20:30 ?        00:00:00 [ksoftirqd/0] root         7     1  0 20:30 ?        00:00:00 [bdflush] root         5     1  0 20:30 ?        00:00:00 [kswapd] [root@localhost redhat]# mpstat 3 3 Linux 2.00 10:40:43 PM  all    1.00   98.00    0.00    0.00    0.00 Average:     all    2.EL (localhost.

[root@dhcp83­36 proc]# pstree pstree init─ ─atd       ─auditd       ─2*[automount]       ─bdflush       ─2*[bonobo­activati]       ─cannaserver       ─crond       ─cupsd       ─dhclient       ─eggcups       ─gconfd­2       ─gdm­binary───gdm­binary─ ─X      │                          ─gnome­session───ssh­agent       ─2*[gnome­calculato]       ─gnome­panel       ─gnome­settings­       ─gnome­terminal─ ─bash───xchat      │                 ─bash───cscope───bash───cscope───bash───cscope───bash───cscope───bash───cscope───bash      │                 ─bash───cscope───bash───cscope───bash───cscope───bash───cscope───vi      │                 ─gnome­pty­helpe       ─gnome­terminal─ ─bash───su───bash───pstree      │                 ─bash───cscope───vi      │                 ─gnome­pty­helpe .

The /proc filesystem  /proc ● acpi ● bus ● irq ● net ● scsi ● sys ● tty ● pid# .

60.2.3.so 0023b000­0023c000 rw­p 0000c000 03:03 4137068    /lib/tls/libpthread­0.3.2.so 00f91000­00f94000 rw­p 00000000 00:00 0 08048000­0804f000 r­xp 00000000 03:03 1046791    /sbin/ypbind 0804f000­08050000 rw­p 00007000 03:03 1046791    /sbin/ypbind 09794000­097b5000 rw­p 00000000 00:00 0 b5fdd000­b5fde000 ­­­p 00000000 00:00 0 b5fde000­b69de000 rw­p 00001000 00:00 0 b69de000­b69df000 ­­­p 00000000 00:00 0 b69df000­b73df000 rw­p 00001000 00:00 0 b73df000­b75df000 r­­p 00000000 03:03 3270410    /usr/lib/locale/locale­archive b75df000­b75e1000 rw­p 00000000 00:00 0 bfff6000­c0000000 rw­p ffff8000 00:00 0 .so 00c5a000­00c5b000 rw­p 00015000 03:03 523268     /lib/ld­2.so 00391000­00392000 rw­p 00011000 03:03 523285     /lib/libnsl­2.2./proc/<pid>/maps [root@dhcp83­36 proc]# cat 5808/maps 0022e000­0023b000 r­xp 00000000 03:03 4137068    /lib/tls/libpthread­0.so 00392000­00394000 rw­p 00000000 00:00 0 00c45000­00c5a000 r­xp 00000000 03:03 523268     /lib/ld­2.3.3.3.60.so 00f8e000­00f91000 rw­p 00131000 03:03 4137064    /lib/tls/libc­2.2.3.so 0023c000­0023e000 rw­p 00000000 00:00 0 0037f000­00391000 r­xp 00000000 03:03 523285     /lib/libnsl­2.2.so 00e5c000­00f8e000 r­xp 00000000 03:03 4137064    /lib/tls/libc­2.2.

[root@hairball ~]# cat /proc/meminfo MemTotal:       514060 kB MemFree:         23656 kB Buffers:         53076 kB Cached:         198344 kB SwapCached:          0 kB Active:         322964 kB Inactive:        60620 kB HighTotal:           0 kB HighFree:            0 kB LowTotal:       514060 kB LowFree:         23656 kB SwapTotal:     1044216 kB SwapFree:      1044056 kB Dirty:              40 kB Writeback:           0 kB Mapped:         168048 kB Slab:            88956 kB Committed_AS:   372800 kB PageTables:       3876 kB VmallocTotal:   499704 kB VmallocUsed:      6848 kB VmallocChunk:   491508 kB HugePages_Total:     0 HugePages_Free:      0 Hugepagesize:     2048 kB /proc/meminfo  .

/proc/slabinfo slabinfo ­ version: 2.0 biovec­128           256    260   1536    5    2 : tunables   24   12    8 : slabdata     52     52      0 biovec­64            256    260    768    5    1 : tunables   54   27    8 : slabdata     52     52      0 biovec­16            256    270    256   15    1 : tunables  120   60    8 : slabdata     18     18      0 biovec­4             256    305     64   61    1 : tunables  120   60    8 : slabdata      5      5      0 biovec­1          5906938 5907188     16  226    1 : tunables  120   60    8 : slabdata  26138  26138      0 bio               5906946 5907143    128   31    1 : tunables  120   60    8 : slabdata 190553 190553      0 file_lock_cache        7    123     96   41    1 : tunables  120   60    8 : slabdata      3      3      0 sock_inode_cache      29     63    512    7    1 : tunables   54   27    8 : slabdata      9      9      0 skbuff_head_cache    202    540    256   15    1 : tunables  120   60    8 : slabdata     36     36      0 sock                   6     10    384   10    1 : tunables   54   27    8 : slabdata      1      1      0 proc_inode_cache     139    209    360   11    1 : tunables   54   27    8 : slabdata     19     19      0 sigqueue               2     27    148   27    1 : tunables  120   60    8 : slabdata      1      1      0 idr_layer_cache       82    116    136   29    1 : tunables  120   60    8 : slabdata      4      4      0 buffer_head        66027 133800     52   75    1 : tunables  120   60    8 : slabdata   1784   1784      0 mm_struct             44     70    768    5    1 : tunables   54   27    8 : slabdata     14     14      0 kmem_cache           150    150    256   15    1 : tunables  120   60    8 : slabdata     10     10      0 .

 inactive_laundry: 2429. delete 918749. race 0+1 27234 pages of slabcache 244 pages of kernel stacks 1303 lowmem pagetables. 0 are on the emergency list Free swap:       598960kB 130933 pages of RAM 0 pages of HIGHMEM 3497 reserved pages 34028 pages shared 39370 pages swap cached . free: 4870 )   aa:0 ac:0 id:0 il:0 ic:0 fr:2929   aa:46140 ac:26264 id:13523 il:2429 ic:1730 fr:1941   aa:0 ac:0 id:0 il:0 ic:0 fr:0 1*4kB 4*8kB 2*16kB 2*32kB 1*64kB 2*128kB 2*256kB 1*512kB 0*1024kB 1*2048kB 2*4096kB = 11716kB) 1255*4kB 89*8kB 5*16kB 1*32kB 0*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4096kB = 7764kB) Swap cache: add 958119. 0 highmem pagetables 0 bounce buffer pages. inactive_clean: 1730.Alt Sysrq M – RHEL3  SysRq : Show Memory Mem­info: Zone:DMA freepages:  2929 min:     0 low:     0 high:     0 Zone:Normal freepages:  1941 min:   510 low:  2235 high:  3225 Zone:HighMem freepages:     0 min:     0 low:     0 high:     0 Free pages:        4870 (     0 HighMem) ( Active: 72404/13523. find 4611302/5276354.

 race 0+0 Free swap:       1044056kB 130933 pages of RAM 0 pages of HIGHMEM 2499 reserved pages 71122 pages shared 0 pages swap cached . find 3/5.Alt Sysrq M ­ RHEL4 SysRq : Show Memory Mem­info: Free pages:      20128kB (0kB HighMem) Active:72109 inactive:27657 dirty:1 writeback:0 unstable:0 free:5032 slab:19306 mapped:41755 pagetables:945 DMA free:12640kB min:20kB low:40kB high:60kB active:0kB inactive:0kB present:16384kB pages_scanned:847  all_unreclaimable? yes protections[]: 0 0 0 Normal free:7488kB min:688kB low:1376kB high:2064kB active:288436kB inactive:110628kB present:507348kB  pages_scanned:0 all_unreclaimable? no protections[]: 0 0 0 HighMem free:0kB min:128kB low:256kB high:384kB active:0kB inactive:0kB present:0kB pages_scanned:0  all_unreclaimable? no protections[]: 0 0 0 DMA: 4*4kB 4*8kB 3*16kB 4*32kB 4*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 1*2048kB 2*4096kB = 12640kB  0*1024kB 0*2048kB 0*4096kB = 7488kB Normal: 1052*4kB 240*8kB 39*16kB 3*32kB 0*64kB 1*128kB 0*256kB 1*512kB HighMem: empty Swap cache: add 52. delete 52.

Alt Sysrq T – RHEL –  bash          R current      0  1609   1606                      (NOTLB) Call Trace:   [<c02a1897>] snprintf [kernel] 0x27 (0xdb3c5e90) [<c01294b3>] call_console_drivers [kernel] 0x63 (0xdb3c5eb4) [<c01297e3>] printk [kernel] 0x153 (0xdb3c5eec) [<c01297e3>] printk [kernel] 0x153 (0xdb3c5f00) [<c010c289>] show_trace [kernel] 0xd9 (0xdb3c5f0c) [<c010c289>] show_trace [kernel] 0xd9 (0xdb3c5f14) [<c0125992>] show_state [kernel] 0x62 (0xdb3c5f24) [<c01cfb1a>] __handle_sysrq_nolock [kernel] 0x7a (0xdb3c5f38) [<c01cfa7d>] handle_sysrq [kernel] 0x5d (0xdb3c5f58) [<c0198f43>] write_sysrq_trigger [kernel] 0x53 (0xdb3c5f7c) [<c01645b7>] sys_write [kernel] 0x97 (0xdb3c5f94) * this can get BIG logged in /var/log/messages .

 do echo. Enable kernel profiling.27smp ro profile=2  nmi_watchdog=1 root=0805        Then reboot.date /usr/sbin/readprofile ­v | sort ­nr +2 | head ­15 /usr/sbin/readprofile ­r sleep 5 .e.4.21­E.Kernel profiling 1. kernel /vmlinuz­2. On the kernel boot line add “profile=2 nmi_watchdog=1” i.                                                                                                                 2. Create a and run a shell script containing the following lines: #!/bin/sh while /bin/true.

boston.1048 ffffffff8023e480 md_do_sync                                   40   0.0279 ffffffff80191cf0 dma_read_proc                                30   0.2679 ffffffff801633b0 get_unused_buffer_head                       25   0.lab.ELsmp (perf1.1607 Linux 2.0288 ffffffff80192070 read_profile                                 22   0.0809 ffffffff80191f80 swaps_read_proc                              18   0.text.com)   01/28/2005 .0036 ffffffff80130540 del_timer                                    95   0.6.0329 ffffffff801202f0 scheduler_tick                               38   0.5398 ffffffff80115940 read_ldt                                     50   0.9­5.1500 ffffffff80153450 scan_active_list                             24   0.lock.0919 ffffffff801565d0 rw_swap_page_nolock                          25   0.shmem                             44   0.6250 ffffffff8015d21c .0106 ffffffff801590a0 try_to_unuse                                 23   0.1291 ffffffff8010e3a0 do_arch_prctl                            238564 213.log Fri Jan 28 08:59:19 EST 2005 0000000000000000 total                                    239423   0.Kernel profiling /usr/sbin/readprofile ­v | sort ­nr +2 | head ­15 [root] tiobench]# more rhel4_read_64k_prof.0822 ffffffff8023d850 status_unused                                24   0.redhat.

oprofile – builtin to RHEL4 (smp)   opcontrol – on/off data  opreport – analyze profile ● ­­start   start collection ● ­r reverse order sort ● ­­stop   stop collection ● ­t [percentage] theshold  ● ­­dump output to disk ● ­­event=:name:count to view Example: # opcontrol –start  ● ­f /path/filename  ● ­d details opannotate  # /bin/time test1 & ● ­s /path/source # sleep 60 ● ­a /path/assembly # opcontrol –stop # opcontrol dump .

 exit or loop . network  Performance Tuning   Methodology 1) Document config 2) Baseline results 3) While results non­optimal a) Monitor/Instrument system/workload b) Apply tuning 1 change at a time c) Analyze results. memory.Part 3 – General System Tuning  How to tune Linux  Capacity tuning ● Fixed by adding resources ● Cpu. disk.

Tuning ­ how to set kernel parameters  /proc [root@hairball fs]# cat /proc/sys/kernel/sysrq 0 [root@hairball fs]# echo 1 > /proc/sys/kernel/sysrq [root@hairball fs]# cat /proc/sys/kernel/sysrq 1  Sysctl command [root@hairball fs]# sysctl kernel.sysrq=1 kernel.conf # Kernel sysctl configuration file for Red Hat Linux # # Controls the System Request debugging functionality of the kernel .sysrq kernel.sysrq = 1 [root@hairball fs]# sysctl kernel.sysrq kernel.sysrq = 0 [root@hairball fs]# sysctl ­w kernel.sysrq = 1  /etc/sysctl.

Capacity Tuning    Memory ● /proc/sys/vm/overcommit_memory ● /proc/sys/vm/overcommit_ratio ● /proc/sys/vm/max_map_count ● /proc/sys/vm/nr_hugepages Kernel ● /proc/sys/kernel/msgmax ● /proc/sys/kernel/msgmnb ● /proc/sys/kernel/msgmni ● /proc/sys/kernel/shmall ● /proc/sys/kernel/shmmax ● /proc/sys/kernel/shmmni ● /proc/sys/kernel/threads­max Filesystems ● /proc/sys/fs/aio_max_nr .

 delete 620870. free: 1101 )   aa:1938 ac:18 id:44 il:0 ic:0 fr:974   aa:115717 ac:1148 id:357 il:0 ic:0 fr:126   aa:0 ac:0 id:0 il:0 ic:0 fr:0 6*4kB 0*8kB 0*16kB 1*32kB 0*64kB 0*128kB 1*256kB 1*512kB 1*1024kB 1*2048kB 0*4096kB = 3896kB) 0*4kB 1*8kB 1*16kB 1*32kB 1*64kB 1*128kB 1*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 504kB) Swap cache: add 620870. 0 highmem pagetables Free swap:            0kB 129008 pages of RAM 0 pages of HIGHMEM 3045 reserved pages 4009 pages shared 0 pages swap cached . inactive_laundry: 0. inactive_clean: 0. find 762437/910181. race 0+200 2454 pages of slabcache 484 pages of kernel stacks 2008 lowmem pagetables.OOM kills – swap space exhaustion Mem­info: Zone:DMA freepages:   975 min:  1039 low:  1071 high:  1103 Zone:Normal freepages:   126 min:   255 low:  1950 high:  2925 Zone:HighMem freepages:     0 min:     0 low:     0 high:     0 Free pages:        1101 (     0 HighMem) ( Active: 118821/401.

. inactive_laundry: 99878. inactive_clean: 99730. free: 4024 )  aa:0 ac:0 id:0 il:0 ic:0 fr:2029  aa:128 ac:3346 id:113 il:240 ic:0 fr:1249  aa:545577 ac:154397 id:664813 il:99713 ic:99730 fr:746 1*4kB 0*8kB 1*16kB 1*32kB 0*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 1*2048kB 1*4096kB = 8116 kB) 543*4kB 35*8kB 77*16kB 1*32kB 0*64kB 0*128kB 1*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB = 4996kB) 490*4kB 2*8kB 1*16kB 1*32kB 1*64kB 1*128kB 1*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 29 84kB) Swap cache: add 4327. 233961 highmem pagetables Free swap:       8189016kB 2097152 pages of RAM 1801952 pages of HIGHMEM 103982 reserved pages 115582774 pages shared 154 pages swap cached Out of Memory: Killed process 27100 (oracle). delete 4173. find 190/1057.OOM kills – lowmem consumption Mem­info: Zone:DMA freepages:  2029 min:     0 low:     0 high:     0 Zone:Normal freepages:  1249 min:  1279 low:  4544 high:  6304 Zone:HighMem freepages:   746 min:   255 low: 29184 high: 43776 Free pages:        4024 (   746 HighMem) ( Active: 703448/665000. race 0+0 178558 pages of slabcache 1078 pages of kernel stacks 0 lowmem pagetables.

Performance Tuning – VM(RHEL3)  /proc/sys/vm/bdflush  /proc/sys/vm/inactive_clean_percent  /proc/sys/vm/pagecache  /proc/sys/vm/page­cluster  Swap device location  Kernel selection  ● X86 smp ● X86 Hughmem x86_64 numa .

     /* Percentage of buffer cache dirty to activate bdflush */        int ndirty.   /* jiffies delay between kupdate flushes */        int age_buffer./* Percentage of buffer cache dirty to activate bdflush synchronously         int nfract_stop_bdflush. /* Time for normal buffer to age before we flush it */        int nfract_sync.     /* unused */        int interval.     /* unused */     /proc/sys/vm/inactive_clean_percent         Controls the percentage of inactive memory that is kept clean.          . /* Percetange of buffer cache dirty to stop bdflush */        int dummy5./proc/sys/vm/bdflush         int nfract.     /* Maximum number of dirty blocks to write out per wake­cycle */        int dummy2.     /* old "nrefill" */        int dummy3.

● Kswapd will stop reclaiming pagecache pages below this  percnet of RAM.1 – hardlimit.minpercent ● Lower limit for pagecache page reclaiming.borrowpercnet ●  Kswapd attempts to keep the pagecache at this percent or RAM pagecache.  pagecache. ● RHEL2./proc/sys/vm/pagecache  pagecache. pagecache will not grow above this percent  of RAM.maxpercent ● Upper limit for pagecache page reclaiming. ● RHEL3 – kswapd only reclaims pagecache pages above this  percent of RAM. ● RHEL4 ­  Example: echo “1 10 50” > /proc/sys/vm/pagecache .

kernel selection    X86 standard kernel(no PAE. 3G/1G) ● UP systems with <= 4GB RAM ● PAE costs ~5% X86 SMP kernel(PAE. 4G/4G) ●  SMP systems >= 12GB RAM X86_64. IA64 ● “numa=off” cmdline option ● (for single app > 1 NUMA zone of RAM) . 3G/1G) ● SMP systems with <= 8GB RAM ● Highmem/Lowmem ratio <= 10:1 ● 4G/4G costs ~5% X86 Hugemem kernel(PAE.

 race 0+2 138138 pages of slabcache 1100 pages of kernel stacks 0 lowmem pagetables. find 107105/1540587. 37046 highmem pagetables Free swap:       3986092kB 4194304 pages of RAM 3833824 pages of HIGHMEM . inactive_clean: 194668. free: 2957 )   aa:0 ac:0 id:0 il:0 ic:0 fr:2207   aa:630 ac:1009 id:189 il:233 ic:0 fr:484   aa:195237 ac:48952 id:1297057 il:194493 ic:194668 fr:266  1*4kB 1*8kB 1*16kB 1*32kB 1*64kB 0*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 2*4096kB = 8828kB)  48*4kB 8*8kB 97*16kB 4*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB =  1936kB)  12*4kB 1*8kB 1*16kB 1*32kB 1*64kB 1*128kB 1*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB =  1064kB) Swap cache: add 3838024.kernel selection(16GB x86 running SMP) Zone:DMA freepages:  2207 min:     0 low:     0 high:     0 Zone:Normal freepages:   484 min:  1279 low:  4544 high:  6304 Zone:HighMem freepages:   266 min:   255 low: 61952 high: 92928 Free pages:        2957 (   266 HighMem)  ( Active: 245828/1297300. delete 3808901. inactive_laundry: 194673.

x86_64 numa=off aa:0 ac:0 id:0 il:0 ic:0 fr:0 aa:901913 ac:1558 id:61553 il:11534 ic:6896 fr:10539 aa:0 ac:0 id:0 il:0 ic:0 fr:0 aa:0 ac:0 id:0 il:0 ic:0 fr:0 aa:867678 ac:879 id:100296 il:19880 ic:10183 fr:17178 aa:0 ac:0 id:0 il:0 ic:0 fr:0 aa:0 ac:0 id:0 il:0 ic:0 fr:0 aa:869084 ac:1449 id:100926 il:18792 ic:11396 fr:14445 aa:0 ac:0 id:0 il:0 ic:0 fr:0 aa:0 ac:0 id:0 il:0 ic:0 fr:2617 aa:769 ac:2295 id:256 il:2 ic:825 fr:861136 aa:0 ac:0 id:0 il:0 ic:0 fr:0 .

 nodes (gfs) . luns. adaptors. affinity mask scalability  ● kernel.Disk IO     iostack lun limits  ● RHEL3 ­ 255 in SCSI stack ● RHEL4 – 2**20. 18k useful with Fiber Channel  /proc/scsi tuning ● que­depth tuning per lun ● IRQ distribution default.

Performance Tuning – DISK RHEL3 [root@dhcp83­36 sysctl]# /sbin/elvtune /dev/hda   /dev/hda elevator ID            0         read_latency:           2048         write_latency:          8192         max_bomb_segments:      6   [root@dhcp83­36 sysctl]# /sbin/elvtune ­r 1024 ­w  2048 /dev/hda   /dev/hda elevator ID            0         read_latency:           1024         write_latency:          2048         max_bomb_segments:      6 .

conf on kernel parameter line . ● Deadline – elevator=deadline. simple.  balanced. fair for multiple luns. leave opt to ramdisk.  Optimize for run­time­like  behavior.  Inserts delays to help stack  aggregate IO. low  cpu overhead. low latency per IO. raid cntrl etc. best on system w/ limited physical IO – SATA  Set in /boot/grub/grub.Disk IO tuning ­ RHEL4  RHEL4 – 4 tunable I/O elevators ● CFQ – elevator=cfq. balance issues with large IO  luns/controllers ● Anticipatory – elevator=as. adaptors. smp servers ● NOOP – elevator=noop.  Completely Fair Queuing  default. No­operation in kernel.

 data/metadata  GFS – global file system – cluster file system  Tuning using tune2fs. 3 ● Tune2fs. alter journal modes. reiserFS . or mount options  Separate swap and busy partitions  RHEL4 EXT3 improves performance   ● Scalability upto 5 M file/system ● Sequential write by using Block Reservations  ● Increase file system upto 8TB  Continued support xfs. default RHEL2.File Systems  EXT2/EXT3 – fast efficient.

Part – 4 RHEL3 vs RHEL4 Performance Case Study  Scheduler – O(1) – taskset  IOzone RHEL3/4   ● EXT3 ● GFS ● NFS OLTP Oracle 10G  ● o_direct. asyncIO. hughmem/page ● RHEL IO elevators  .

 dual core and NUMA .CPU Schedulers  O(1) algorithm   Active and Expired priority arrays   Scheduling includes HT.

  0.0% id.0% us. 99.0% wa.  0.   0 zombie Cpu0  :  0. 100.  0.0% us.  0.  0.0% si .0% wa.  0.  0.0% ni.0% wa.0% si Cpu2  : 100.  0.0% us.0% si Cpu3  : 100.0% hi.7% id.  0.0% hi.0% ni.  0.  0.   0 stopped.0% hi.  0.0% id.  0.  0.0% hi.0% ni.  0.0% id.  0.  0.0% wa.   0 zombie Cpu0  :  0.0% si Cpu2  :  0.0% id.  0.0% si 2)  scheduler w/ taskset ­c cpu#  .  0.0% ni.0% id.0% sy.  0. round robin odd.  96 sleeping.0% us.0% hi.  0.  0.  0.3% sy.0% sy.  0.  96 sleeping.0% sy.  0.0% hi.  0.0% hi./stream.0% id.   2 running.  0.  0.  0.  0.  0.  0.0% wa.0% us.   2 running.0% hi. then even cpus Tasks: 101 total.0% ni.0% ni.0% us.0% ni.0% id.0% wa.0% wa.0% us.  0. 100.  0.0% us.  0.  0.top  2­streams running on 2­dualcore AMD cpus 1) default scheduler – sometimes chooses cpu pair on same memory interface Tasks: 101 total.  0.  0.0% sy.  0.0% si Cpu1  :  0.0% wa.  0.0% sy.  0. 100.0% sy.0% ni.0% si Cpu1  : 100.  0.  0.  0.0% sy.0% si Cpu3  : 100.   0 stopped.

 4CPU  binding via taskset RHEL4 U1 ­ 2­cpu. dual­core AMD64 McCalpin Stream Copy b(x) = a(x) RHEL4 U1 ­ 2­cpu. dual­core AMD64 McCalpin Stream Triad c(x) = a(x) + b(x).c(x) 7000 6000 5000 Copy 4000 Copy w/ Aff 3000 2000 1000 0 1 2 Number of CPUs 4 Bandwidth in MB/sec Bandwidth in MB/sec 7000 6000 5000 Triad smp 4000 Triad w/ Aff 3000 2000 1000 0 1 2 Number of CPUs 4 .McCalpin Stream on 2­cpu­dualcore.

random read. fwrite. read strided. re-write. pread – Fread. aio_read.IOzone Benchmark • http://www.iozone. aio_write . mmap. re-read. random write – Read.org/ • IOzone is a filesystem benchmark tool. read backwards. • The benchmark tests file I/O performance for the following operations: – Write.

IOzone Sample Output .

– Out-of-cache – file sizes more tan 2x memory size • • Global File System – GFS goal --> 90-95% of local EXT3 GeoMean per category are statistically meaningful. HBA. RAID.Understanding IOzone Results • Understand HW setup – Disk. Use raw command  fdisk /dev/sdX  raw /dev/raw/rawX /dev/sdX1  dd if=/dev/raw/rawX bs=64k Mount file system  mkfs –t ext3 /dev/sdX1  Mount –t ext3 /dev/sdX1 /perf1 IOzone commands  Iozone –a –f /perf1/t1 (incache)  Iozone –a -I –f /perf1/t1 (w/ dio)  Iozone –s 2xmem –f /perf1/t1 (big) . PCI • Layout file systems – LVM or MD devices – Partions w/ fdisk • • Baseline raw IO DD/DT EXT3 perf w/ IOzone – O_DIRECT – 95% of raw – In-cache – file sizes which fit goal -> 90% memory BW.

0% 2000000 100.0% 40.0% 0 Fwrite Re-fwrite Fread Re-fread 2­cpu Xeon 3.0% 60. 4GB mem 1lun 8dsk HW Raid0  Improvements from EXT3 block reservations and CFQ R4 IO scheduler  RHEL3 U5 RHEL4 %Diff .0% 80. 4k-1M transfers) 2500000 140.0% 0.0% 1500000 1000000 500000 20.0% 120.IN­Cache FS IO Perf (RHEL4 12­18% gain) EXT3 Iozone Perf (KB/sec) R3-U5 vs R4-U1 In-cache AVE(1M-2G files.4 Ghz.

0% read reread rand backwd stride read read read write rewrite record rand rewrite write 2­cpu Xeon 3.0% 2.ELsmp %diff .4 Ghz.EXT3 out­of­cache (RHEL4 upto 2.0% 30000 20000 50. 4GB mem 1lun 8dsk HW Raid0  Improvements from EXT3 block reservations and CFQ R4 IO scheduler  2.21-27.EL 80000 200.5x RHEL3) EXT3 Iozone Perf (KB/sec) R4 U1 vs R3 U5 32GB Out-Of-Cache.96.memory pressure 90000 250.6.0% 10000 0 0.4.0% 50000 40000 100.26.0% 70000 KB/sec 60000 150.

5% 0.5% 1.0% 3.0% 1200000 1000000 800000 600000 400000 200000 0 Fw rite Re-fw rite Fread Re-fread 2­cpu Xeon 3.0% 2.0% 1.NFS + EXT3 Perf (RHEL4 +3­5% vs RHEL3) IOzone NFS Perf (KB/sec) Rhel3 U5 vs Rhel4 U1 in-cache Ave 1m-4gb files 1400000 5.4 Ghz.0% 4. 4GB mem 1lun 8dsk HW Raid0  Improvements from EXT3 block reservations and CFQ R4 IO scheduler  RHEL4 NFS RHEL3 NFS %Diff .5% 2.5% 3.5% 4.0% 0.

Using IOzone w/ o_direct – mimic database  Problem : ● Filesystems use memory for file cache ● Databases use memory for database cache ● Users want filesystem for management outside  database access (copy.   Solution : ● Filesystems that support Direct IO ● Open files with o_direct option ● Databases which support Direct IO (ORACLE) ● NO DOUBLE CACHING! . backup etc)   You DON'T want BOTH to cache.

0% 100. 4GB mem 1lun 8dsk HW Raid0  Improvements from EXT3 block reservations and CFQ R4 IO scheduler  RHEL3 U5 RHEL4 %Diff .0% Stride Read Record Rewrite Backward Read Random Write Random Read Rereader Reader Re-writer Writer 98.0% 103.0% 101.4 Ghz.0% 102.RHEL4 EXT3 o_direct (RHEL4 3­5% gain) EXT3 IOzone Perf (KB/sec) R3-U5 vs R4-U1 O_Direct AVE(1M-2G files. 4k-1M transfers) 80000 70000 60000 50000 40000 30000 20000 10000 0 104.0% 99.0% 2­cpu Xeon 3.

0% 140.0% 100.NFS + EXT3  w/ o_direct (RHEL4 40­140% gain) IOzone NFS Perf (KB/sec) Rhel U5 vs Rhel4 U1 O_Direct Ave 1m-4gb files Stride Read Record Rewrite Backward Read Random Write Random Read Rereader Reader Re-writer 160.0% 40.4 Ghz.0% Writer 60000 50000 40000 30000 20000 10000 0 2­cpu Xeon 3. 4GB mem 1lun 8dsk HW Raid0  Improvements from EXT3 block reservations and CFQ R4 IO scheduler  RHEL4 NFS RHEL3 NFS %Diff .0% 80.0% 20.0% 120.0% 0.0% 60.

 8 GB memory ● 1 QLA2300 Fiber Channel.4 Ghz.0 shipping in RHEL3 ● V6.GFS Global Cluster File System   GFS – separate summit talk ● V6. 2. 1 EVA 5000 Compared GFS iozone to EXT3 .1 ships w/ RHEL4 U1 Hint at GFS Performance in RHEL3 ● ● Data from different server/setup ● HP AMD64 4­cpu.

0% 600000 100.Global File System GFS vs EXT3 (parity) IOzone Perf (KB/sec) GFS vs EXT3 RHEL3 U5 GeoMean 1mb-4gb files. 1k-1m transfers 800000 150.4Ghz. 8GB mem 1­FC 1lun 14dsk HW Raid0 EXT3 R3_U5 GFS6 R3_U5 %Diff .0% 200000 0 0.0% Fwrite Re-fwrite Fread Re-fread Overall GeoMean 4­cpu AMD64 2.0% 400000 50.

0% 20. 1k-1m transfers 120000 120.GFS Performance w/ o_direct (95% of EXT3) IOzone (DIO) Perf (KB/sec) GFS vs EXT3 RHEL3 U5 GeoMean 1mb-4gb files. 8GB mem 1­FC 1lun 14dsk HW Raid0 GFS6 R3_U5 .0% EXT3 R3_U5 40.0% 4­cpu AMD64 2.4Ghz.0% 100.0% %Diff Record Rewrite Stride Read Backward Read Random Read Random Write Rereader Reader Re-writer Writer 0.0% 60.0% 100000 80000 60000 40000 20000 0 80.

Evaluating Oracle Performance

Use OLTP workload based on TPC­C

Results with various Oracle Tuning options

RAW vs EXT3 w/ o_direct (ie directIO in iozone)

ASYNC IO options w/ Oracle, supported in 
RHEL4/EXT3

HUGHMEM kernels on x86 kernels

Results comparing RHEL4 IO schedulers

CFQ

DEADLINE

NOOP

AS

Oracle 10G OLTP raw ext3, sync/aio
TPC-C Results
RHEL4U1
Oracle 10g

35000
32500
30000
27500

tpmC

25000
22500

EXT3 syncio

20000

RAW syncio

17500

EXT3 asyncio

15000

RAW asyncio

12500
10000
7500
5000
2500
0

SMP kernel(1G3G)

hugemem kernel(4G4G)

TPC-C Results
RHEL4U1
Oracle 10g

35000
32500
30000
27500

tpmC

25000
22500

EXT3 syncio

20000

RAW syncio

17500

EXT3 asyncio
RAW asyncio

15000
12500
10000
7500
5000
2500
0

SMP kernel(1G3G)

hugemem kernel(4G4G)

0% 150.7% Noop OLTP – 4k random 50%R/50%W As 0.2% 50.  simple. low latency.9% Anticipatory – insert IO to help  stack aggregate IO.1% Rhel3 84.0% default.4% 23.0% . fair ● NOOP – No­operation in kernel.2% line 108. balanced. low overhead ● Deadline – Optimize for run­time­ like behavior.8% difficult with large IO  luns/controllers ● w/ limited physical IO – SATA 2­Oracle 10G workloads ● ● 75.0% %tran/min 100. but  Dead­ 87.9% 84.Disk IO elevators  R3 – general purpose I/O elevators   RHEL4 IO schedules vs RHEL3 for Database Oracle 10G oltp/dss (relative performance) parameters  R4 – 4 tunable I/O elevators ● CFQ ­ Completely Fair Queuing   100. best on system   77.0% CFQ 100.0% % queries/hou r 28.

 top. NFS improves with EXT3 ● Oracle w/ FS o_direct.Linux Performance Tuning Summary   Linux Performance Monitoring Tools ● *stat. aio. /proc/*. sar. oprofile ● Determine cacacity vs tunable performance issue  ● Tune OS parmeters and repeat   RHEL4 vs RHEL3 Perf Comparison ● CPU Scheduler expanded for HT/multi­cores ● RHEL4 vs RHEL3 ● “have it your way” IO with 4 IO schedulers ● EXT3 improved block reservations upto 3x ● GFS within 95% of EXT3. ps. hughpages 95% of raw .

Backup Slides ­ Network IO  Focus on reliability and low latency  New network API – NAPI  NFS v3 vs V4  send/recv size packet tuning  IB and RDMA still not mainstream .

Sign up to vote on this title
UsefulNot useful