已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 虎绿林 > 开发

标题: 虎绿林变卡,数据库不时崩溃,原来是因为日志文件占满内存

作者: @Ta

时间: 2022-03-28

点击: 12456

为了追求写入速度,/tmp被我挂载为tmpfs(内存文件系统)。

最近虎绿林时不时卡顿,数据库还会崩溃重启,我一看是服务器内存不足了。

看来看去都没找到占用内存的程序,最后去/tmp一看,hu60-cc.log(访问日志)高达4GB。

删除后,内存占用马上下降了。

看起来必须添加一个自动删除日志的定时任务了。


[隐藏样式|查看源码]


『回复列表(22|隐藏机器人聊天)』

1.

老虎的修BUG之路 第999章

(/@Ta/2022-03-28 16:31//)

2. 访问日志也要保存吗?
(/@Ta/2022-03-28 16:54//)

3.

@大尨,如果网站变得很卡,我会去看有没有人超速。

https://gitee.com/hu60t/hu60wap6/blob/master/src/sub/cc.php#L117

为什么要使用tmpfs?因为文件系统可能会成为瓶颈,导致高并发时访问慢。

(/@Ta/2022-03-28 17:09//)

4.

不用删除,定时回写到硬盘然后清空内容,这样既保证了速度,日志也能保留
小米20定制版

(/@Ta/2022-03-28 17:10//)

5.
用户被禁言,发言自动屏蔽。
(/@Ta/2022-03-28 19:05//
被禁言
)

6. CC并发不是要多少就有多少?
(/@Ta/2022-03-28 21:24//)

7. 既然用了文件系统,不妨试试「 logrotate 」
(/@Ta/2022-03-28 21:45//)

8.

@老虎会游咏q,不会设logrotate的参数,最后还是使用了最简单的rm

(/@Ta/2022-03-29 13:19//)

9. @老虎会游泳,我发现这个地方超速后依然会追加访问日志
https://gitee.com/hu60t/hu60wap6/blob/master/src/sub/cc.php#L85

而这个地方会把REFERER也记录到日志文件
https://gitee.com/hu60t/hu60wap6/blob/master/src/sub/cc.php#L122

那么,假如你的 HTTP Server 最大请求内容限制为 1MB ,服务器最大上传带宽是 10MB/s 的话,我把 referer 搞到 1MB 大小且每秒发送 10 个请求,连续不到 10 分钟你的服务器内存就会被耗尽吧?

(/@Ta/2022-03-29 21:17//)

10.

每天深夜xz压缩存储?日志重复内容应该挺多吧,压缩率应该可观?

(/@Ta/2022-03-29 21:42//)

11.

@老虎会游咏q,你可以尝试

(/@Ta/2022-03-30 03:10//)

12. @老虎会游泳,刚刚是我尝试了下不知道结果如何(如果9楼是个问题的话,你的内存应该被我耗1-2GB吗? ),不知道为什么hu60-cc.log似乎在我停止之前被删除了
(/@Ta/2022-03-30 13:03//)

13.

@老虎会游咏q,确实,你占用了我很多内存。看起来我要加快清理速度,并且根据文件大小删除文件。

图片.png

不知道为什么hu60-cc.log似乎在我停止之前被删除了

并没有,它还在。

图片.png

(/@Ta/2022-03-30 13:13//)

14.

每分钟删一次

图片.png

(/@Ta/2022-03-30 13:20//)

15.

其实最好是让文件成为环形缓冲区,大小固定不变,写入一行新内容就丢弃一行旧内容。不知道有没有这样的方案。

(/@Ta/2022-03-30 13:24//)

16. @老虎会游泳,你这样会削弱防 cc 能力。

如果更快的减少 hu60-cc.log 文件大小将会放走更多的 cc 流量进入你的业务逻辑。

优化日志格式应该可以适当增大你的防 cc 能力
(/@Ta/2022-03-30 13:25//)

17.

@老虎会游咏qhu60-cc.log不用于超速计算,只是我自己看的而已。超速计算的文件是hu60-cc.dat,它是IP寻址的固定大小记录文件,始终是384KB。

图片.png

/**
 * CC行为记录文件
 *
 * 请指定到tmpfs文件系统内,否则性能会很差。
 * 如系统为Windows,请使用memcache,这样就不需要指定该文件。
 */
$CC_DATA = '/dev/shm/hu60-cc.dat';

// 记录数,决定记录文件的大小
$CC_RECORD_NUM = 256 * 256;
// 单个记录字节数
$CC_RECORD_SIZE = 6;

// IP hash,代表记录在文件中的位置
$ipHash = (hexdec(substr(md5($CC_REAL_IP), 0, 8)) % $CC_RECORD_NUM) * $CC_RECORD_SIZE;

if ($CC_USE_MEMCACHE) {
	$key = "cc/$ipHash";
	$record = cache::get($key);
} else {
	if (!is_file($CC_DATA) || filesize($CC_DATA) < $CC_RECORD_NUM * $CC_RECORD_SIZE) {
		file_put_contents($CC_DATA, str_repeat("\0", $CC_RECORD_NUM * $CC_RECORD_SIZE));
	}
	$CC_DATA = fopen($CC_DATA, 'r+');
	fseek($CC_DATA, $ipHash);
	$record = fread($CC_DATA, $CC_RECORD_SIZE);
}

$record = unpack('v3', $record);

// 首次访问时间
$firstAccTime = $record[1];
// 最后访问时间
$lastAccTime = $record[2];
// 访问次数
$accCount = ++$record[3];
(/@Ta/2022-03-30 13:48//)

18.

@老虎会游咏q,即使我完全不记录hu60-cc.log(把它重定向到/dev/null),也不会影响cc.php的统计功能。这个文件存在的价值,只是我自己想看而已。它的作用是让我感知到当前的态势,对程序没有任何用处。

(/@Ta/2022-03-30 13:31//)

19.

@老虎会游泳,哦,这样啊。我没有完全理解你这段代码😂。那应该没问题

<!md>

其实最好是让文件成为环形缓冲区,大小固定不变,写入一行新内容就丢弃一行旧内容。不知道有没有这样的方案。

不知道这样优雅不:你的定时任务可以不是简单的删除 log ,而是保持 log 文件行数基本保持在一个水平上,比如像这样

tail -100000 /tmp/hu60-cc.log > /tmp/hu60-cc.log.txt
rm /tmp/hu60-cc.log

不管怎么样你都要移动文档中的所有行才可能实现 append a line, remove first line,除非是逻辑上的

(/@Ta/2022-03-30 13:52//)

下一页 1/2页,共22楼

回复需要登录

9月15日 04:20 星期一

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1