uncovering performance problems in java applications with reference propagation profiling

28
Uncovering Performance Problems in Java Applica5ons with Reference Propaga5on Profiling PRESTO: Program Analyses and So5ware Tools Research Group, Ohio State University Dacong Yan 1 , Guoqing Xu 2 , Atanas Rountev 1 1 Ohio State University 2 University of California, Irvine

Upload: dacong-yan

Post on 28-Nov-2014

248 views

Category:

Technology


6 download

DESCRIPTION

Uncovering Performance Problems in Java Applications with Reference Propagation Profiling, ICSE'2012

TRANSCRIPT

Page 1: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Uncovering  Performance  Problems  in  Java  Applica5ons  with  Reference  Propaga5on  Profiling  

PRESTO:  Program  Analyses  and  So5ware  Tools  Research  Group,  Ohio  State  University  

Dacong  Yan1,  Guoqing  Xu2,  Atanas  Rountev1    

1  Ohio  State  University  2  University  of  California,  Irvine  

   

Page 2: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Overview  •  Performance  inefficiencies  

– O5en  exist  in  Java  applicaKons  – Excessive  memory  usage  – Long  running  Kmes,  even  for  simple  tasks  

•  Challenges  – Limited  compiler  opKmizaKons  – Complicated  behavior  – Large  libraries  and  frameworks  

•  SoluKon:  manual  tuning  assisted  with  performance  analysis  tools  

2  

Page 3: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

3  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

Page 4: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

4  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

Page 5: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

5  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

Page 6: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

6  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

Page 7: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

7  

Page 8: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

An  Example  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

8  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

Page 9: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

ImplementaKon  •  Reference  propagaKon  profiling  

–  Implemented  in  Jikes  RVM  3.1.1  – Modify  the  runKme  compiler  for  code  instrumentaKon  – Create  shadow  loca5ons  to  track  data  dependence  –  Instrument  method  calls  to  track  interprocedural  propaga5on  

•  Overheads  – Space:  2-­‐3×  – Time:  30-­‐50×    

9  

Page 10: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

10  

Page 11: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

11  

Page 12: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

12  

Page 13: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

13  

Page 14: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

14  

Page 15: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Code Shadow Graph

6 a = new A; aʹ = RefAssign(6,6)

7 b = a; bʹ = RefAssign(6,7)

8 c = new C; cʹ = RefAssign(8, 8)

9 b.fld = c; b.fldʹ = RefAssign(8, 9)

Reference  PropagaKon  Profiling  •  Intraprocedural  propagaKon  

– Shadows  for  every  memory  locaKon  (stack  and  heap)  to  record  last  assignment  that  writes  to  it  

– Update  shadows  and  the  graph  accordingly  

15  

•  Interprocedural  propagaKon  – Per-­‐thread  scratch  space  save  and  restore  shadows  for  parameters  and  return  variables  

Page 16: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Client  Analyses  

16  

Page 17: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Client  Analyses  •  Not-­‐assigned-­‐to-­‐heap  (NATH)  analysis  

– Locate  producer  nodes  that  do  not  reach  heap  propagaKon  nodes  (heap  reads  and  writes)  

– Variant:  mostly-­‐NATH  analysis  

17  

Page 18: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Client  Analyses  •  Not-­‐assigned-­‐to-­‐heap  (NATH)  analysis  

– Locate  producer  nodes  that  do  not  reach  heap  propagaKon  nodes  (heap  reads  and  writes)  

– Variant:  mostly-­‐NATH  analysis  •  Cost-­‐benefit  imbalance  analysis  

– Detect  imbalance  between  the  cost  of  interesKng  operaKons,  and  the  benefits  they  produce  

– For  example,  analysis  of  write  read  imbalance  

18  

Page 19: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Client  Analyses  •  Not-­‐assigned-­‐to-­‐heap  (NATH)  analysis  

– Locate  producer  nodes  that  do  not  reach  heap  propagaKon  nodes  (heap  reads  and  writes)  

– Variant:  mostly-­‐NATH  analysis  •  Cost-­‐benefit  imbalance  analysis  

– Detect  imbalance  between  the  cost  of  interesKng  operaKons,  and  the  benefits  they  produce  

– For  example,  analysis  of  write  read  imbalance  •  Analysis  of  never-­‐used  allocaKons  

–  IdenKfy  producer  nodes  that  do  not  reach  the  consumer  node  

– Variant:  analysis  of  rarely-­‐used  allocaKons  19  

Page 20: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

20  

Page 21: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

21  

Page 22: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

22  

1 2

1

2

Page 23: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

23  

1 2

1

2

Page 24: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub_rev(v, res) { 4 res.x = x-v.x; 5 res.y = y-v.y; 6 } 7 }

24  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 in[i+1].sub_rev(a[i-2], nt); 12 // use of fields of nt 13 } … … 80 t=q[*]; 81 // use of fields of t

1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

tuning

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

nt = new Vec; // reusable

Page 25: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

A  Real  Tuning  Session  1 class Vec { 2 double x, y; 3 sub_rev(v, res) { 4 res.x = x-v.x; 5 res.y = y-v.y; 6 } 7 }

25  

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 in[i+1].sub_rev(a[i-2], nt); 12 // use of fields of nt 13 } … … 80 t=q[*]; 81 // use of fields of t

1 class Vec { 2 double x, y; 3 sub(v) { 4 res=new Vec(x-v.x, y-v.y); 5 return res; 6 } 7 }

tuning

8 for (i = 0; i < N; i++) { 9 t = in[i+2].sub(a[i-1]); 10 q[i] = t; 11 t = in[i+1].sub(a[i-2]); 12 // use of fields of t 13 } … … 80 t=q[*]; 81 // use of fields of t

nt = new Vec; // reusable

Reductions: 13% in running time and 73% in #allocated objects

Page 26: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Examples  of  Inefficiency  Pa`erns  •  Temporary  objects  for  method  returns  

– ReducKons  for  euler:  13%  in  running  Kme  and  73%  in  #allocated  objects  

•  Redundant  data  representaKon  – mst:  63%  and  40%  

•  Unnecessary  eager  object  creaKon  – chart:  8%  and  8% – jflex:  3%  and  27%  

•  Expensive  specializaKon  for  sanity  checks  – bloat:  10%  and  11%  

26  

Page 27: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

Conclusions •  Reference  propagaKon  profiling  in  Jikes  RVM  •  Understanding  reference  propagaKon  is  a  good  starKng  point  for  performance  tuning  

•  Client  analyses  can  uncover  performance  inefficiencies,  and  lead  to  effecKve  tuning  soluKons  

27  

Page 28: Uncovering Performance Problems in Java Applications with Reference Propagation Profiling

                                 Thank    you  

28