Advertisement
keybounce

Rel 1, 32/64-bit memory adjusting minecraft server launcher

May 11th, 2013
1,871
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2. # This line is for starting from mac os icon double click
  3. cd "$( dirname "$0" )"
  4.  
  5. # V1.7.1. Minor tweaks:
  6. # - compile threshold lowered from 3,000 to 300. Oracle's default for servers is 15,000;
  7. #   my testing fails to show any benefit from this. Faster startup, quicker initial block
  8. #   breaking, etc.
  9. # - Initial memory allocation lowered
  10. # - Clarification to the comments at the end where you select "favor extra space for tenured"
  11. #   or "favor extra space for new" memory.
  12. # - MinHeapFreeRatio=21 instead of 20 -- solves a borderline issue where 80% of memory was
  13. #   used, 20% was free, and repeated full CMS collections were run without expanding memory
  14. #   allocation to java.
  15. # - Keep one old GC.log file around.
  16. # - Changed from "Release Candidate" to "Official first release" :-).
  17.  
  18. # V1.7: Borderline case existed where memory allocation would be in error.
  19. # Example: Survivor copy of 90, 90% => Survivor space of 100.
  20. # Desired Eden of 250.
  21. # Would attempt to allocate 200 for eden, 200 for two survivors.
  22. # That's 400 for new, even if "MaxNew" was 350.
  23.  
  24. # Right behavior in this case?
  25. # No clear answer.
  26. # What's more important: making sure you have as much eden as you ask for,
  27. # or limiting your "new" memory?
  28. #
  29. # Answer used here: "new" memory is more important than tenured,
  30. # as long as tenured is big enough. So, if that happens, we force maxnew up to fit.
  31. # When this happens, a warning is printed. Pay attention to your logs when this
  32. # happens -- tenured overflow results in very large amounts of full collections
  33. # because small collections cannot clear eden.
  34.  
  35. ## V1.6. This time the 64 bit flag works.
  36. # Again: This is throwing "too much" memory at eden/survivor.
  37. # Pay attention to the GC log. Sections like
  38.  
  39. # 1552.959: [CMS-concurrent-reset-start]
  40. # 1552.965: [CMS-concurrent-reset: 0.005/0.005 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
  41. # {Heap before GC invocations=17 (full 1):
  42. #  par new generation   total 180224K, used 146721K [0000000009000000, 0000000016c00000, 0000000025200000)
  43. #   eden space 135168K, 100% used [0000000009000000, 0000000011400000, 0000000011400000)
  44. #   from space 45056K,  25% used [0000000014000000, 0000000014b48750, 0000000016c00000)
  45. #   to   space 45056K,   0% used [0000000011400000, 0000000011400000, 0000000014000000)
  46. #  concurrent mark-sweep generation total 102400K, used 63696K [0000000025200000, 000000002b600000, 000000003b000000)
  47. #  concurrent-mark-sweep perm gen total 24940K, used 21197K [000000003b000000, 000000003c85b000, 0000000044600000)
  48.  
  49. # The "CMS-concurrent-reset" means it has finished a full collection.
  50. # The "concurrent mark-sweep generation" line has the tenured allocation
  51. # In this case, 63 MB of long-term data.
  52.  
  53. # Sections like
  54.  
  55. # 56.089: [GC 56.089: [ParNew
  56. # Desired survivor size 41523608 bytes, new threshold 4 (max 4)
  57. # - age   1:   17033216 bytes,   17033216 total
  58. # - age   2:   22458216 bytes,   39491432 total
  59. # - age   3:      14552 bytes,   39505984 total
  60. # - age   4:     136648 bytes,   39642632 total
  61.  
  62. # 17 MB of temporary space was recently allocated; just under 40 MB of temporaries are "surviving"
  63. # and not immediately useless. (This comes from startup; almost all of that will be valid for the life
  64. # of the program run.)
  65.  
  66. # Age 4 overflows (age 4's total larger than the max, or worse, "new threshold 2" or other small number)
  67. # means the potential for tenured space to grow unnecessarily. This kills long-term performance.
  68.  
  69. ## V1.5-corrected: 64 bit version, and ** LOTS OF MEMORY ALLOCATION **
  70. # This is to give information for data collection.
  71. # Determine how much your system uses, and then adjust numbers down to avoid waste
  72. #
  73. # Specifically: By making the memory pools large, we see how much is used.
  74. # Then, we can determine what to cut them down to.
  75. #
  76. # This will probably be the last CMS version; G1GC next.
  77.  
  78. java=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Commands/java
  79.  
  80. ## V1.4: Java is now customizable (see the above line), thank you oracle for a
  81. ## java (1.7) that does not support 32 bit servers for reduced memory consumption.
  82.  
  83. ## V1.3: The -XX:SoftRefLRUPolicyMSPerMB=0 flag got lost! Back in now.
  84. ## This flag defaults to 1000, and can cause memory leaks.
  85.  
  86. ## V1.2: We now play with -XX:TargetSurvivorRatio=n to reduce waste in new, permitting more
  87. ## space to be used
  88.  
  89. # Configurables:
  90. # -d32 is for heap size up to 2.5gb. (NB: apparently only 1.5 gb on microsoft windows?)
  91. # Change to "-d64 XX:+UseCompressedOops" if you use more.
  92. # ** Mention that flag specifically, do not rely on it being autoset.
  93. # ** Known and documented JVM bug -- https://forums.oracle.com/forums/thread.jspa?messageID=10017916
  94.  
  95. JVM_SIZE="-d32 -server"
  96. # JVM_SIZE="-d64 -XX:+UseCompressedOops -server"
  97.  
  98. # CMSInitiatingOccupancyFraction: Determine how frequently to do a full CMS
  99. # Special: New "Most important". This primarily affects long-term growth
  100. # of the heap. The percentage of used space before CMS starts a collection.
  101. # 95 is sufficient for general stuff. 85 is useful for things that suddenly
  102. # need a lot.
  103. # Dynamic maps, in particular, no longer needs 125 MB of survivor -- it can
  104. # get by with 60-75. It can go much lower, but then the garbage collections
  105. # need to be started sooner, or else it will never have enough memory and
  106. # always grow the heap.
  107. #
  108. # To clarify: This is obsolete -- completely -- in G1GC.
  109. # This needs to be low enough that sudden spurts of temporary memory trigger
  110. # garbage collection first.
  111. # This should be re-worked as a "MB safety level" -- for example, if you have
  112. # 300 MB of tenured, and want at least 30 MB free. But Java don't work that way.
  113. # As tenured increases, this will also increase the "keep free" level.
  114. CMSInitiatingOccupancyFraction=80
  115.  
  116. # Memory tuning:
  117. # Command line controls total heap, and "new". "Tenured" is the difference.
  118. # Bigger "new": Less frequent collections.
  119.  
  120. # These numbers are in "Megabytes", the java "m" suffix.
  121.  
  122. # The rule of memory tuning:
  123. # SurvivorSpace * (SurvivorRatio + 2) = New
  124. # ("SurvivorSpace" is twice the actual surviving threshold.)
  125. # SurvivorSpace * SurvivorRatio = Eden.
  126. # Two additional survivor spaces are used to copy surviving objects across minor collections.
  127.  
  128. # MAX: Maximum heap space used.
  129. # Does not include permanent (byte/compiled code)
  130. # Does not include JVM overhead
  131. MAX=550
  132.  
  133. # Tenured: Desired long-term storage space
  134. # Will vary based on mods, and "loaded chunks"
  135. # -- how many parties of players close to each other.
  136. #
  137. # Starting assumption: 250 for 1 person, plus 50 per group
  138. # of players near each other.
  139. #
  140. # That is a guess. Please report what numbers work for your server.
  141. #
  142. # ** More testing.
  143. # Multiple people in the same area: No detectable difference between 1 and 2 people.
  144. # Actual space needed varied from (LDS minimum) 55 (1.5.1) to 75 (1.4.7, dynamic maps)
  145. # The old guess of 250 was way too high.
  146.  
  147. # This will need to be higher on servers with more players.
  148. Tenured=100
  149.  
  150.  
  151. # Most important tuning number. Survivor copy size.
  152. # Making this higher: Fewer full collections, but more wasted space.
  153. # During startup, expect this to overflow frequently.
  154. # Actual space allocated is 2 spaces, each one twice this size.
  155. # "waste/overhead" will be two about to three times this number.
  156. # *** Maximum of 1/6rd of "new"
  157. # Pay attention to the tenuring distribution logs.
  158. # *** This should be enough for generation 3 99%+ of the time. ***
  159. # ** TOO SMALL WILL KILL YOUR GARBAGE COLLECTION **
  160. # (worse, it will cause tenured space to grow.)
  161. # ** TOO BIG WILL WASTE SPACE **
  162. # (this is a minor issue overall.)
  163. #
  164. # To clarify: You can easily use 12 here if you stay primarily in one place.
  165. # You can even use less, but the memory savings are not significant.
  166. # Biggest usage I've seen: dimension travel (see below) and dynamic maps with
  167. # low angle (20 degree) maps.
  168. #
  169. # *** Recommendations
  170. # If you do a lot of dimension travel -- including using a nether hub to get
  171. # around, or lots of Mystcraft books (two links to go from A to B in the same
  172. # world), then you want 65 MB if you can afford it, or 53 MB minimum. That's
  173. # for one person; groups will be higher.
  174. # (tested in a world with forests at the hub zone; may be higher for extreme hills,
  175. # jungles, or jungle-hills (expected to be the worst case.))
  176. #
  177. # If you do a lot of high speed rail travel over large distances, a minimum of
  178. # 40 MB. Ditto if you use a lot of flight mode movement. More if you have a
  179. # speed boost.
  180. #
  181. # If you do very little travel -- if you are just building in one spot -- then
  182. # 15 MB is plenty.
  183. #
  184. # If you are testing a new mod pack, and have no clue what you need, start at 100.
  185. # If you are working with a multiplayer server, I don't know what to advise --
  186. # test and tell me.
  187. #
  188. # More testing: 147, dynamic maps, ocean area: 30
  189. # 151, jungles/desert/forest: 38
  190.  
  191. # Probably are good at 32 here
  192. # Defaulting to 35 MB, works well on a server with extreme hills and no massive dimension
  193. # travel. Again: Changing dimension once every few minutes won't bother anything. Rapid
  194. # changing multiple times a minute will.
  195.  
  196. SurvivorCopySize=35
  197.  
  198. # Survivor target ratio. Java defaults to 50%, which wastes a lot of space. If you know how much
  199. # you need (see below), you can set this value higher; this gives less waste and "better performance".
  200.  
  201. TargetSurvivorRatio=90
  202.  
  203. ## Notes on "SurvivorCopySize":
  204. # Flying around in creative mode, in already generated chunks will want
  205. #   at least 30-35, preferrably 40 meg.
  206. # Standing around, single player, can be happy with less than 1.
  207. # Even in Mystcraft, with massive amounts of decay everywhere (implies lots of block
  208. # updates), 95% of the time 1 meg suffices.
  209. # Moving around a little, doing basic building/digging, about 3.
  210. #
  211. # The rule: You want to see "new threshold 4 (max 4)" most of the time.
  212. # The total value at age three --
  213. # - age   3:      36712 bytes,    5897520 total
  214. # should be less than this almost all of the time, at least after startup.
  215. #
  216. # 12 meg is more than enough for one person with EBXL, Mystcraft, Twilight Forest,
  217. # and Custom Ore Gen. Even in EBXL's extreme jungle with Mystcraft's decay littering the ground.
  218. #
  219. # The single biggest factor is chunks loaded; that will depend more on parties than on players,
  220. # and the speed at which they move. Adjust to your server, and your mods. Remember, teleportation
  221. # will raise this value very rapidly.
  222. #
  223. # To clarify the problem: An overflow here forces memory into tenured space. If tenured is
  224. # nearly full -- lets say Java will start a garbage collection soon -- then this can force
  225. # more space to be allocated to tenured.
  226. #
  227. # Forcing more space into tenured is the disaster that this is all about preventing.
  228. # Tenured space is more expensive to collect, and Java does not release this back to the
  229. # operating system when it does not need it. This means, on systems that are doing more than
  230. # just a minecraft server (say, a client, a browser, perhaps voice chat software, etc), this
  231. # will impact your whole system's performance.
  232. #
  233. # A secondary effect of overflow is forcing earlier/more frequent full collections.
  234. # For single/dual processors, this may be the more dominant factor.
  235. # For 4/8 core processors, this is minor.
  236.  
  237. # Second most important tuning. Eden.
  238. # Making this bigger means less frequent small collections.
  239. # General rule: Make this as big as your memory can handle.
  240. # Must be at least 2x Survivor. Java requires it to be
  241. # an integer multiple of Survivor.
  242. #
  243. # If you have no idea what to use here, then right at the end
  244. # there are a pair of commended lines that will calculate
  245. # something for you. That calculation uses Max, Tenured, and
  246. # copy, and assumes everything else is new/Eden. Result is a
  247. # bigger footprint (should always use max or close to it) and
  248. # the biggest eden space available.
  249. #
  250. # Specifying a value here will reduce the starting eden, and
  251. # give space for tenured to grow later.
  252.  
  253. desiredEden=30
  254.  
  255. # Summary: Approximately desiredEden, plus 2 times Survivor,
  256. # plus 130, will be used by java to start the heap. Up to a max of MAX.
  257. # Script will attempt to ensure at least Tenured space exist;
  258. # should exit with a message if it cannot.
  259. #
  260. # In theory, Java will allocate extra space to new or tenured as needed.
  261. # In practice, I've never seen it increase "new".
  262. #
  263. # See the bottom of the config section for more.
  264.  
  265. # If your shell cannot do math, replace these with an appropriate constant
  266.  
  267. MaxNew=$(($MAX - $Tenured))
  268.  
  269. ## Survivor=$((2 * $SurvivorCopySize))
  270. ## Working with survivor target. "2" is for 50%. For 90%, it's much closer to 1.
  271. ## What we want is 100 / target percentage, as the ratio instead of 2.
  272. ## For integer only shell math, we re-write as (100 * survivor) / target, which gives us
  273. ## close integer to the desired result -- as close as we can get in the shell.
  274.  
  275. Survivor=$(( ($SurvivorCopySize * 100 ) / $TargetSurvivorRatio ))
  276.  
  277. ## Equally, the "3" in sanity test is from 3 bins -- two survivors, one eden.
  278. ## But that does NOT change here -- it's still the sanity test lower limit.
  279.  
  280. sanityTest=$((3 * $Survivor))
  281. if [ $sanityTest -gt $MaxNew ]
  282. then
  283.     echo Memory config error >& 2
  284.     exit 1
  285. fi
  286.  
  287. # We cannot use more than MaxNew.
  288.  
  289. # The idea:
  290. # 1. Find the multiple of Survivor that is bigger than S and less than MN.
  291. # 2. Determine survivor ratio from that. Subtract 2 (java.)
  292. # 3. Specify -Xmn for new, and survivor ratio, to set eden and new.
  293.  
  294. # "New" will be Eden plus 2* Survivor.
  295.  
  296. # MaxRatio -- what the ratio is if we use all of maxnew.
  297. MaxRatio=$(( ($MaxNew / $Survivor) - 2 ))
  298. # DesiredRatio -- what the ratio is based on declared eden space
  299. # There is no "-2" here -- this will allocate eden plus 2* survivor.
  300. desiredRatio=$(( ($desiredEden / $Survivor)  ))
  301.  
  302. # SurvivorSpace * (SurvivorRatio + 2) = New
  303.  
  304. # Now check for "desired Eden". If survivor is not an exact multiple of DE,
  305. # then we have just rounded down. Test for this, and if so, see if we can
  306. # raise it up (watch out for maxnew)
  307.  
  308. ## TODO! FIXME! This is a cheap approximation
  309. if ( [ $(( $desiredRatio + 1 )) -le $MaxRatio ] )
  310. then    desiredRatio=$(( $desiredRatio + 1 ))
  311. fi
  312.  
  313. desiredNew=$(($Survivor * ($desiredRatio + 2) ))
  314. biggerNew=$(($Survivor * ($MaxRatio + 2) ))
  315.  
  316. echo Debug: Max ratio $MaxRatio, desiredRatio $desiredRatio
  317. echo Debug: biggerNew $biggerNew, should be less than MaxNew $MaxNew
  318. echo Debug: desired eden $desiredEden, survivor $Survivor, actual new $desiredNew
  319.  
  320. # desiredNew: Gives an eden up to, not bigger, than desiredEden.
  321. # biggerNew: Gives an eden at least as big as desiredEden.
  322. # FIXME: DesiredNew / ratio should be smallest at least as big as desiredEden
  323. # This means, if less, then add 1 to ratio and add to new.
  324. #
  325. # "Bigger" assigns ALL non-tenured memory to new.
  326.  
  327. # Q: Desired numbers? Bigger/Max numbers?
  328.  
  329. # Choose one of these pairs
  330.  
  331. # Use the user specified Eden. Starting memory footprint will be smaller.
  332. # Tenured can grow if needed.
  333.  
  334. NEW=$desiredNew
  335. RATIO=$desiredRatio
  336.  
  337. # If you have no idea what values to use for Eden, then this will determine
  338. # eden values on it's own. This will use your specified tenured, max, and
  339. # copy values, and assign close to the maximum footprint and eden space.
  340.  
  341. # NEW=$biggerNew
  342. # RATIO=$MaxRatio
  343.  
  344. ### 1.7 bug fix! Turns out that borderline cases could fail.
  345. if ( [ $NEW -gt $MaxNew ] )
  346. then
  347.     MaxNew=$NEW
  348.     ## CAUTION! "Start" below may fail.
  349.     ## If you get here, then you need to watch out for tenured overflow
  350.     echo "** Launcher adjusted MaxNew; make sure tenured space is big enough"
  351. fi
  352.  
  353. START=$(($NEW + 90))
  354. # Experimal behavior: Starting up, and loading one person into a world, takes
  355. # about 70-90 MB of tenured space to have Java "happy". Less just results in repeated
  356. # full collections while Java raises the amount of allocated memory. (Range depends on
  357. # mods.)
  358.  
  359. ## TESTME: Does "MaxNewSize" matter if we have adaptive GC boundary? Does it hurt?
  360.  
  361. # A few more notes ...
  362.  
  363. # -XX:+UseAdaptiveGCBoundary -- apparently, adjust the boundary between new and tenured as needed.
  364. # Nice to see; did not know about it before.
  365. # Sadly, it seems to have no effect.
  366.  
  367. # -XX:+CMSIncrementalMode: Tells the garbage collector to break the job into many small parts.
  368. # May result in better performance. Essential on systems with few cores.
  369.  
  370. # -XX:CompileThreshold: Tells Java when to convert bytecode into compiled code.
  371. # Server defaults to something like 15,000, which is appropriate for something that will
  372. # run for months, and horrible for something that will run for a few hours.
  373. # Non-server defaults to ... 1000? 1500? Much lower.
  374.  
  375. # "-f" prevents an error message on the first run
  376. mv -f GC.log GC.log.old
  377.  
  378. exec $java \
  379.     $JVM_SIZE \
  380.     -Xms${START}m -Xmx${MAX}m \
  381.     -XX:+UseAdaptiveGCBoundary \
  382.     -XX:TargetSurvivorRatio=$TargetSurvivorRatio \
  383.     -XX:NewSize=${NEW}m -XX:MaxNewSize=${MaxNew}m \
  384.     -XX:SurvivorRatio=$RATIO \
  385.     -XX:CompileThreshold=300 \
  386.     -XX:+UseConcMarkSweepGC -XX:+UseParNewGC \
  387.     -XX:CMSInitiatingOccupancyFraction=$CMSInitiatingOccupancyFraction \
  388. \
  389.     -XX:SoftRefLRUPolicyMSPerMB=0 \
  390.     -XX:MaxPermSize=150m \
  391.     -XX:+UseParNewGC \
  392.     -XX:MaxHeapFreeRatio=25 \
  393.     -XX:MinHeapFreeRatio=21 \
  394.     -XX:+DisableExplicitGC \
  395.     -XX:MaxTenuringThreshold=4 \
  396.     -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution \
  397.     -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -Xloggc:GC.log \
  398.     -jar new_server.jar nogui 147Main
  399.  
  400.  
  401. # The last word of that exec statement -- '147Main' -- is just something that shows up in
  402. # the process list, so I can tell which process is which server (each copy of this script
  403. # has a different name in that field).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement