PHP 网站内存占用很高,一做活动就挂了,大佬们帮忙看看

2019-07-16 09:03:49 +08:00
 haiyan
服务器就一个小说网站,服务器阿里云的 2 核 4G 配置,mysql 数据库 1.5G ,日活 2000 这样,平时网站内存就占到了 80%多了,mysql 占了 20%。如果发个促销网址,人同时一上来就挂,实际那两分钟来的人也还不多 1000,必须重启 php-fpm 才行。同配置的.net 版系统就毫无压力,索引设置了,日志也看了,现在不知道是配置低了,还是程序性能太差了。
请大家帮忙提点见解,谢谢了!
7784 次点击
所在节点    程序员
74 条回复
yumenoks
2019-07-16 18:36:51 +08:00
上服务器吧,一个月 300 左右的,
然后把数据库分离出来,丢到阿里云啥的,
服务器可以弄 2 台,或者 1 台多 IP,然后开 1 台 linux 跑 web,一台 window 跑关关采集.
看你自己的预算了.
1981
2019-07-16 19:00:17 +08:00
个人建议把数据库分开来,我 10m 的数据库都卡卡卡卡卡卡卡
encro
2019-07-16 20:47:30 +08:00
可以帮你解决,服务费 2000 元。
也可以自己看我这篇日志吧:
https://c4ys.com/archives/1609

PHP 是进程模式的,1000 个并发,那么需要的 cpu 和内存你这配置确实不够。(没有用 swoole 之类的话)
1000*10M 大约,大约需要 10G 内存。
通常都没有 1000 个并发,估计数据库先挂了,挂的原因可能是慢 SQL,导致进程卡住一直上涨,连接不释放内存爆掉,或者连接数超过上线,套路云默认 5000。

提示:
nginx 开启 request_time;
php-fpm 慢日志
mysql 慢日志
php-fpm 错误日志
nginx 错误日志
php 进程数
mysql 连接数
nginx 连接数

以上文字价值 5000
encro
2019-07-16 20:57:02 +08:00
request_terminate_timeout = 120
request_slowlog_timeout = 0

request_terminate_timeout 和 nginx 的 timeout 配置冲突,导致 nginx 主动断开,php 不回收,然后就会 not such file。

google 下这个错误,就会发现答案的。
如果百度的话,我可以保证没有一个是对的。
ginjedoad
2019-07-16 21:02:35 +08:00
golang 重构一下,4 台一样的配置的机器,百万并发支持。
encro
2019-07-16 21:11:45 +08:00
通常我用 Yii 框架,一个请求大约是 10-50ms,100 个进程( static 模式),1 分钟理论上支持的请求数是 1000*100/50=2000。
caoyouming
2019-07-16 21:43:17 +08:00
我在学校做的那个选课系统,单次选课人数最多可达到 5000 左右,并没有感到有压力呀。我用的也是单服务器,apache+mysql+php,对,服务器也是 winserver,我记得我开始做这个项目时候有一次也遇到类似的问题,改了 apache 的配置文件,包括连接数等等之后就没有这样的问题了。你可以看看你的服务器配置文件,找个懂配置文件的看看就行了。
jhdxr
2019-07-16 21:48:21 +08:00
@Snail233 laravel 也没那么不堪。。。

小说网站能卡成这样多半是程序没写好。说不定在循环里写个 sql 查询之类的。。。

另外拿别的语言比较的多半没用意义。换语言本身就是一个重构过程,你换的过程中又不会一句一句去翻译,肯定会解决原来的一些不合理之处。
akira
2019-07-17 00:59:10 +08:00
方案 1. 每个月多花几百块 升级下服务器
方案 2. 付费找人帮忙优化服务器
方案 3. 自学服务器优化相关技能并完成优化工作
ragnaroks
2019-07-17 08:38:46 +08:00
haiyan
2019-07-17 09:01:03 +08:00
一早来这么多回复,很感谢大家,指了很多方向,够我去了解的了。
这个网站不着急马上解决,只要不发促销就行了😺。
我看了代码,基本上压力在这几个:
1,推送,每 5 分钟查询前 5 分钟未付款的订单,订单表 3 万多数据,查出来后循环发送;
2,十几个推广在用着后台,生成二维码推广海报,时不时刷下各种统计;
3,前台小说章节目录,是个大变量,两千多章节全部都是显示;
4,登录和状态检查,通过子域名区分是谁的客户,用户表 40 多万,这个操作繁琐。
我准备先去加缓存,推送换成队列,后续把优化结果发出来。
flashrick
2019-07-17 10:16:28 +08:00
@haiyan 这 4 条都可以用 redis 解决 手动狗头
haiyan
2019-07-22 09:32:53 +08:00
回来更新下,上周改完之后,终于可以顶住了。
基本就是把上面的,1,4 两点改成用 redis 缓存实现,网站首页很少变化的也放缓存,微信获取 access_token 也放缓存,查询数据库量大大减少了,看来是 mysql 堵塞了。
再次感谢各位帮助,学到了很多。
CODEWEA
2019-11-20 12:33:51 +08:00
for 循环 mysql ?,果然是来黑 php 的

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

https://tanronggui.xyz/t/583298

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

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

© 2021 V2EX