请教跑在阿里云服务器上的 tomcat 莫名被杀掉的问题

2015-09-21 15:07:04 +08:00
 raycloud
在阿里云服务器上放了三个 tomcat ,其中一个不知在什么情况下被停止了,已出现过 2 次,请问有什么办法查看被停的原因么? tomcat 的日志没有相关信息
9640 次点击
所在节点    Java
19 条回复
jwangkun
2015-09-21 16:58:41 +08:00
系统会检测内存,如果内存占用过大,会自动清理,你查看一下系统日志
raycloud
2015-09-21 17:30:26 +08:00
@jwangkun 嗯,看到 /var/log/messages 文件里有这么一行:
Sep 21 10:34:26 iZ94dvgpg40Z kernel: Out of memory: Kill process 11462 (java ) score 358 or sacrifice child
Sep 21 10:34:26 iZ94dvgpg40Z kernel: Killed process 11462 (java ) total-vm:3100672kB, anon-rss:695128kB, file-rss:0kB
onlyxuyang
2015-09-21 18:38:52 +08:00
…… 我搬瓦工上跑的服务器经常因为 memory 被直接 killed 掉……泪奔……
raycloud
2015-09-21 19:21:52 +08:00
@onlyxuyang 我也泪奔...老板准备做几百上千家店的 APP 还准备上市的,租的这台 2G2 核的阿里云还是在我提了几个月的情况下租的,现在私活不肯升级配置,要我从程序上解决
Zzzzzzzzz
2015-09-21 19:26:13 +08:00
连硬件都不肯加的话, 跳槽吧.
raycloud
2015-09-21 19:39:06 +08:00
@Zzzzzzzzz 嗯,正在准备中...
tobyxdd
2015-09-21 19:41:38 +08:00
OOM
ljbha007
2015-09-21 19:41:41 +08:00
1. 准备做几百上千家店的 APP 却连一个月几百块钱的服务器都舍不得租。。。。
从这个心态来看就觉着是 想趁着浪潮投机做点东西搞钱 而不是想踏踏实实创造产品的

2. 你用 log 监控一下内存使用情况和并发连接数 2g 内存跑 java 绰绰有余 一般情况你 cpu 或者带宽都满负载了都不一定能用到 2g 内存

这种情况我基本可以肯定是你代码有问题 导致内存使用不当或者内存泄漏
使用 ThreadLocal 很容易遇到这种情况
raycloud
2015-09-21 19:45:21 +08:00
@ljbha007 并发数很少,使用了 springMVC 框架,内存占用是稍微多点,多个 tomcat ,每家店都是独立运行的,每个店跑一个 tomcat ,按照老板那种不懂技术的想法是想把几百家店的都放同一台机的
raycloud
2015-09-21 19:51:24 +08:00
@ljbha007 代码是没什么问题的,没几个人用也没几个线程,不知是不是阿里的服务器喜欢自清?用的同样的框架代码类似在台湾服务器 1G 内存上跑 3 个 tomcat 几个月都不会被清
ljbha007
2015-09-21 19:56:16 +08:00
@raycloud
1. 没有必要每个店配一个 tomcat
容器本来就是可以一个容器跑多个 app 的 多个 app 用虚拟主机就可以绑定不同的域名

2. 即便是这样也非常有可能是内存泄漏 内存泄漏跟线程的数量和几个人用没有任何关系 我举 ThreadLocal 的例子仅仅是说明最高发的一种情况 最好自己 profile 一下
ljbha007
2015-09-21 19:59:10 +08:00
@raycloud
2g 内存的机子正常情况 跑上千并发都不会把内存用完 一般都是带宽先用完 然后是 cpu 满负荷 最后才会轮到内存

你跑 100 个 app 和跑 1 个 app 并没有太大区别 因为这些框架优化都做的很好 框架本身的内存占用量和应用的内存占用量相比是非常小的
ljbha007
2015-09-21 19:59:38 +08:00
ljbha007
2015-09-21 20:00:20 +08:00
老板吝啬是一回事 自己技术没做到位是另外一回事 两方面都要找原因
raycloud
2015-09-21 20:06:17 +08:00
@ljbha007 我说的内存不足主要是启动的 tomcat 太多问题,如果用同一个 tomcat ,那以后维护不是很麻烦?假如一个客户需要添加某项功能,那么重启服务是不是几千个客户都会受到影响?
onlyxuyang
2015-09-21 20:20:19 +08:00
……阿里云能加 swap 么…… 没租过云服务器…… vps 的话 kvm 方案的话 swap 随意加…… 最多慢点……
ljbha007
2015-09-21 20:48:25 +08:00
@raycloud 这种问题可以用专门的热代码部署方案 这都不是问题

而且自带的 manager 都可以做到不重启 tomcat 的情况下重新部署 app
你直接把 app 对应的 war 文件替换了 tomcat 也会自动重新加载 而不影响其他应用

总的来说还是可以看出来楼主对容器的各种配置和使用并不了解而胡乱设计部署方案

即便是这种多 app 的模式我也是认为没有必要的
多 app 之间隔离唯一的作用就是隔离每个应用之间的内存 从而防止不同 app 之间能够相互访问而导致的信息泄漏、攻击等安全问题
但是如果所有代码的控制权都在你们自己手里 那就完全没有必要担心这个问题 应用层面的访问控制完全足够了 只需要在业务逻辑上把不同店铺的数据独立开即可

如果想要支持不同的域名 /子域名访问不同店铺的数据 可以用 nginx 或者 apache 做反向代理 配合 url_rewrite
比如

子域名转发
rewrite http://(.+).example.com http://www.example.com/$1

或者
域名转发
rewrite ^ http://www.example.com/$hostname/$request_uri

SpringMVC 里这样配置:
@RequestMapping("/:shop_name/buy")
@RequestMapping("/:shop_name/sell")

那两个 rewrite 规则是我查了下文档随便写的 自己没有测试 反正用 rewrite 是可以实现的
raycloud
2015-09-22 00:35:47 +08:00
@ljbha007 嗯,感谢你的耐心解答。也不是胡乱设计部署,从技术上来讲一个 tomcat 放多个 application 肯定是没问题的,因为刚开始按老板的要求就是每个商家所对应的服务都是独立运行的,服务还包括微信后台以及 web 后台管理。为了部署简单明了减少耦合就一个商户开一个 tomcat ,因为我之前遇到做 p2p 系统的公司他的每个客户都是一个独立的服务器,我以为一台机开了多个已经服务为老板减少成本了。没想到老板的意思是上千个商家都不准备多租服务器了。
对 nginx 相关配置我多少也懂点的,关键是这公司在我来之前申请域名都是叫外面的人帮忙的,现在域名还在别人手里,上次叫加个二级域名都是搞了半天,叫他把域名所有权拿回来由公司内部人管理一直没反应
ljbha007
2015-09-22 00:47:18 +08:00
@raycloud
产品设计老板可以拍板 但是架构设计没有必要听他的 瞎指挥就是瞎指挥 当面跟他说清楚

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/222457

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX