我在数字海洋上安装了512MB RAM的Ubuntu 14.04云服务器,并安装了tomcat7以接受我的Java应用程序,还有一个wordpress网站运行,几乎没有访问。因此,我创建了一个需要始终在线的REST Web服务,因为Android应用程序可以访问。问题是当我不使用WS时,它会发生故障并且我必须再次手动启动tomcat。
当我要求tomcat'状态时,我得到以下答案:
Tomcat Servlet引擎未运行,但pid文件存在。
以下是服务器处于正常状态的内存日志:
total used free shared buffers cached
Mem: 490 480 9 64 6 119
-/+ buffers/cache: 354 135
Swap: 0 0 0
最高命令:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8835 www-data 20 0 363904 65472 37244 S 16.6 13.0 0:31.02 php5-fpm
12625 www-data 20 0 361052 63896 35704 S 8.3 12.7 0:13.30 php5-fpm
24655 mysql 20 0 891176 56332 1576 S 1.7 11.2 72:04.31 mysqld
11509 www-data 20 0 361696 65796 37168 S 1.3 13.1 0:16.99 php5-fpm
7 root 20 0 0 0 0 S 0.3 0.0 4:31.17 rcu_sched
28 root 20 0 0 0 0 S 0.3 0.0 0:44.41 kswapd0
123 root 20 0 0 0 0 S 0.3 0.0 3:26.29 jbd2/vda1-8
744 www-data 20 0 91112 2400 540 S 0.3 0.5 0:53.93 nginx
13305 tomcat7 20 0 1126588 144516 5792 S 0.3 28.8 0:44.17 java
14557 root 20 0 24820 1508 1100 R 0.3 0.3 0:00.07 top
1 root 20 0 33504 1504 120 S 0.0 0.3 1:59.18 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.29 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:03.83 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
8 root 20 0 0 0 0 R 0.0 0.0 4:37.10 rcuos/0
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
在tomcat进程中使用jmap -heap我有以下详细信息:
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 134217728 (128.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 44695552 (42.625MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 174063616 (166.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 2424832 (2.3125MB)
used = 280872 (0.26786041259765625MB)
free = 2143960 (2.0446395874023438MB)
11.583152977195946% used
Eden Space:
capacity = 2162688 (2.0625MB)
used = 242168 (0.23094940185546875MB)
free = 1920520 (1.8315505981445312MB)
11.197546756628787% used
From Space:
capacity = 262144 (0.25MB)
used = 38704 (0.0369110107421875MB)
free = 223440 (0.2130889892578125MB)
14.764404296875% used
To Space:
capacity = 262144 (0.25MB)
used = 0 (0.0MB)
free = 262144 (0.25MB)
0.0% used
concurrent mark-sweep generation:
capacity = 34521088 (32.921875MB)
used = 26207256 (24.993186950683594MB)
free = 8313832 (7.928688049316406MB)
75.91665708798054% used
Perm Generation:
capacity = 50319360 (47.98828125MB)
used = 43680848 (41.65730285644531MB)
free = 6638512 (6.3309783935546875MB)
86.8072407916158% used
16661 interned Strings occupying 2074936 bytes.
有人知道怎么总是把它上线吗?
答案 0 :(得分:1)
好的,如果你有一个512 MB的RAM服务器,并且你运行了MySQL和PHP5,那么JVM可能会因OutOfMemory异常而崩溃。
在jmap输出中,唯一重要的数字是并发标记扫描生成的空闲内存,其中您只有7.9 MB可用空间,这对于Web服务来说听起来非常小。
在崩溃之前,JVM还会花费大量时间尝试垃圾收集,这可能会导致进程无响应,甚至在它完全崩溃之前。
你可以添加1GB的交换(IIRC,linux管理员建议swap = 2 x ram)。 参见例如AWS的http://www.prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html也可能适用于Digital Ocean。
MySQL和PHP5进程可能会换掉大量未使用的已分配内存。如果这会使您的应用程序放慢太多,您可能需要更多RAM,或者将PHP和MySQL移动到不同的服务器。