为了追求写入速度,/tmp
被我挂载为tmpfs(内存文件系统)。
最近虎绿林时不时卡顿,数据库还会崩溃重启,我一看是服务器内存不足了。
看来看去都没找到占用内存的程序,最后去/tmp
一看,hu60-cc.log
(访问日志)高达4GB。
删除后,内存占用马上下降了。
看起来必须添加一个自动删除日志的定时任务了。
https://gitee.com/hu60t/hu60wap6/blob/master/src/sub/cc.php#L117
为什么要使用tmpfs?因为文件系统可能会成为瓶颈,导致高并发时访问慢。
不用删除,定时回写到硬盘然后清空内容,这样既保证了速度,日志也能保留
小米20定制版
每天深夜xz压缩存储?日志重复内容应该挺多吧,压缩率应该可观?
每分钟删一次
其实最好是让文件成为环形缓冲区,大小固定不变,写入一行新内容就丢弃一行旧内容。不知道有没有这样的方案。
@老虎会游咏q,hu60-cc.log
不用于超速计算,只是我自己看的而已。超速计算的文件是hu60-cc.dat
,它是IP寻址的固定大小记录文件,始终是384KB。
/**
* 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];
老虎的修BUG之路 第999章