Saturday, July 9, 2011

basic JVM tuning - 2 focuses

JVM tuning is part of system tuning, often a small part. I feel DB tuning and application tuning often/usually provide better ROI. In a sense, JVM is already very well-turned compared to application code (in any langauge). It's worthwhile to keep the ROI in mind. After you make sure JVM performance metrics look reasonable, further effort often yields diminishing ROI. Better focus on other parts of the system.
It's critical to establish measurable targets, otherwise we can't tell when JVM performance metrics are reasonable. In practice, 2 main targets are

- OO) GC overall overhead - to be reduced, expressed as a percentage of system resources spent on GC
- PP) long pauses are often unacceptable and should be eliminated. Short jitters are more common and more tolerable

Once OO and PP are in reasonable range, further JVM tuning gives diminishing return, according to real world experiences.

You can see OO) in verbose GC output (more easily on GCHisto). 1-3% is ok. This goal is important to batch systems. An exchange gateway guy told me PP is more important. 10% OO is tolerable in the low-pause CMS.

You can see PP) in verbose GC output. One minute would be too long.  This goal is important to latency sensitive systems like most trading engines, where Even 100millis is bad. Long pause is often due to full GC. A first step is to turn on concurrent mark and sweep collector. Some trading shops create their own GC.

Real time java addresses PP. Not easy. UBS claims they incur a single GC "penalty" a day, so PP is eliminated. See other blog posts on "GC/day"

If your overall Overhead is too high, you need to see breakdown, then divide and conquer. A key metric is allocation rate.

Related tools needed for jvm tuning
- jstat
- jconsole
- hpjmeter

No comments:

Total Pageviews

my favorite topics (labels)

_fuxi (302) _misLabel (13) _orig? (3) _rm (2) _vague (2) clarified (58) cpp (39) cpp_const (22) cpp_real (76) cpp/java/c# (101) cppBig4 (54) cppSmartPtr (35) cppSTL (33) cppSTL_itr (27) cppSTL_real (26) cppTemplate (28) creditMkt (14) db (65) db_sybase (43) deepUnder (31) dotnet (20) ECN (27) econ/bank` (36) fin/sys_misc (43) finGreek (34) finReal (45) finRisk (30) finTechDesign (46) finTechMisc (32) finVol (66) FixedIncom (28) fMath (7) fMathOption (33) fMathStoch (67) forex (39) gr8IV_Q (46) GTD_skill (15) GUI_event (30) inMemDB (42) intuit_math (41) intuitFinance (57) javaMisc (68) javaServerSide (13) lambda/delegate (22) marketData (28) math (10) mathStat (55) memIssue (8) memMgmt (66) metaProgram` (6) OO_Design (84) original_content (749) polymorphic/vptr (40) productive (21) ptr/ref (48) py (28) reflect (8) script`/unix (82) socket/stream (39) subquery/join (30) subvert (13) swing/wpf (9) sysProgram` (16) thread (164) thread_CAS (15) thread_cpp (28) Thread* (22) timeSaver (80) transactional (23) tune (24) tuneDB (40) tuneLatency (30) z_ajax (9) z_algoDataStruct (41) z_arch (26) z_arch_job (27) z_automateTest (17) z_autoTrad` (19) z_bestPractice (39) z_bold (83) z_bondMath (35) z_book (18) z_boost (19) z_byRef^Val (32) z_c#GUI (43) z_c#misc (80) z_cast/convert (28) z_container (67) z_cStr/arr (39) z_Favorite* (8) z_FIX (15) z_forex (48) z_fwd_Deal (18) z_gz=job (33) z_gzBig20 (13) z_gzMgr (13) z_gzPain (20) z_gzThreat (19) z_hib (19) z_IDE (52) z_ikm (5) z_IR_misc (36) z_IRS (26) z_javaWeb (28) z_jdbc (10) z_jobFinTech (46) z_jobHunt (20) z_jobRealXp (10) z_jobStrength (15) z_jobUS^asia (27) z_letter (42) z_linq (10) z_memberHid` (11) z_MOM (54) z_nestedClass (5) z_oq (24) z_PCP (12) z_pearl (1) z_php (20) z_prodSupport (7) z_py (31) z_quant (14) z_regex (8) z_rv (38) z_skillist (48) z_slic`Problem (6) z_SOA (14) z_spring (25) z_src_code (8) z_swingMisc (50) z_swingTable (26) z_unpublish (2) z_VBA/Excel (8) z_windoz (17) z_wpfCommand (9)

About Me

New York (Time Square), NY, United States
http://www.linkedin.com/in/tanbin