V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
raycloud
V2EX  ›  Java

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

  •  
  •   raycloud · 2015-09-21 15:07:04 +08:00 · 9648 次点击
    这是一个创建于 3355 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在阿里云服务器上放了三个 tomcat ,其中一个不知在什么情况下被停止了,已出现过 2 次,请问有什么办法查看被停的原因么? tomcat 的日志没有相关信息
    jwangkun
        1
    jwangkun  
       2015-09-21 16:58:41 +08:00   ❤️ 1
    系统会检测内存,如果内存占用过大,会自动清理,你查看一下系统日志
    raycloud
        2
    raycloud  
    OP
       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
        3
    onlyxuyang  
       2015-09-21 18:38:52 +08:00 via Android
    …… 我搬瓦工上跑的服务器经常因为 memory 被直接 killed 掉……泪奔……
    raycloud
        4
    raycloud  
    OP
       2015-09-21 19:21:52 +08:00
    @onlyxuyang 我也泪奔...老板准备做几百上千家店的 APP 还准备上市的,租的这台 2G2 核的阿里云还是在我提了几个月的情况下租的,现在私活不肯升级配置,要我从程序上解决
    Zzzzzzzzz
        5
    Zzzzzzzzz  
       2015-09-21 19:26:13 +08:00
    连硬件都不肯加的话, 跳槽吧.
    raycloud
        6
    raycloud  
    OP
       2015-09-21 19:39:06 +08:00
    @Zzzzzzzzz 嗯,正在准备中...
    tobyxdd
        7
    tobyxdd  
       2015-09-21 19:41:38 +08:00 via Android
    OOM
    ljbha007
        8
    ljbha007  
       2015-09-21 19:41:41 +08:00
    1. 准备做几百上千家店的 APP 却连一个月几百块钱的服务器都舍不得租。。。。
    从这个心态来看就觉着是 想趁着浪潮投机做点东西搞钱 而不是想踏踏实实创造产品的

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

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

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

    你跑 100 个 app 和跑 1 个 app 并没有太大区别 因为这些框架优化都做的很好 框架本身的内存占用量和应用的内存占用量相比是非常小的
    ljbha007
        14
    ljbha007  
       2015-09-21 20:00:20 +08:00
    老板吝啬是一回事 自己技术没做到位是另外一回事 两方面都要找原因
    raycloud
        15
    raycloud  
    OP
       2015-09-21 20:06:17 +08:00
    @ljbha007 我说的内存不足主要是启动的 tomcat 太多问题,如果用同一个 tomcat ,那以后维护不是很麻烦?假如一个客户需要添加某项功能,那么重启服务是不是几千个客户都会受到影响?
    onlyxuyang
        16
    onlyxuyang  
       2015-09-21 20:20:19 +08:00 via Android
    ……阿里云能加 swap 么…… 没租过云服务器…… vps 的话 kvm 方案的话 swap 随意加…… 最多慢点……
    ljbha007
        17
    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
        18
    raycloud  
    OP
       2015-09-22 00:35:47 +08:00 via Android
    @ljbha007 嗯,感谢你的耐心解答。也不是胡乱设计部署,从技术上来讲一个 tomcat 放多个 application 肯定是没问题的,因为刚开始按老板的要求就是每个商家所对应的服务都是独立运行的,服务还包括微信后台以及 web 后台管理。为了部署简单明了减少耦合就一个商户开一个 tomcat ,因为我之前遇到做 p2p 系统的公司他的每个客户都是一个独立的服务器,我以为一台机开了多个已经服务为老板减少成本了。没想到老板的意思是上千个商家都不准备多租服务器了。
    对 nginx 相关配置我多少也懂点的,关键是这公司在我来之前申请域名都是叫外面的人帮忙的,现在域名还在别人手里,上次叫加个二级域名都是搞了半天,叫他把域名所有权拿回来由公司内部人管理一直没反应
    ljbha007
        19
    ljbha007  
       2015-09-22 00:47:18 +08:00
    @raycloud
    产品设计老板可以拍板 但是架构设计没有必要听他的 瞎指挥就是瞎指挥 当面跟他说清楚
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1116 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:49 · PVG 06:49 · LAX 14:49 · JFK 17:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.