156 lines
4.6 KiB
Markdown
156 lines
4.6 KiB
Markdown
#灵感
|
||
|
||
局域网 服务端地址
|
||
|
||
服务器 IP:[[192.168.1.177](http://192.168.1.177)]([http://192.168.1.177/](http://192.168.1.177/)) 用户:root 密码:cZr8YTtp
|
||
|
||
参考的上报日志 分析平台 演示:
|
||
|
||
[https://creporter.inspiregames.cn:81/](https://creporter.inspiregames.cn:81/) lg753951
|
||
|
||
这里是采集到,客户端发过来数据的接口逻辑:
|
||
|
||
![[Pasted image 20250314184241.png]]
|
||
|
||
安卓端,采集内存占用,统计采集耗时,逻辑参考
|
||
|
||
``` java
|
||
public static int getRSSMemoryMBProc() {
|
||
long startTime = System.nanoTime(); // 记录开始时间
|
||
try (BufferedReader br = new BufferedReader(new FileReader("/proc/self/status"))) {
|
||
String line;
|
||
while ((line = br.readLine()) != null) {
|
||
if (line.startsWith("VmRSS:")) {
|
||
String[] parts = line.split("\\s+");
|
||
int kb = Integer.parseInt(parts[1]);
|
||
|
||
long duration = (System.nanoTime() - startTime) / 1000; // 微秒耗时
|
||
Log.d("PerfMonitor", "getRSSMemoryMBProc took " + duration + "μs");
|
||
|
||
return kb / 1024;
|
||
}
|
||
}
|
||
// 如果没有找到VmRSS行也记录耗时
|
||
long duration = (System.nanoTime() - startTime) / 1000;
|
||
Log.d("PerfMonitor", "getRSSMemoryMBProc (no data) took " + duration + "μs");
|
||
} catch (Exception e) {
|
||
long duration = (System.nanoTime() - startTime) / 1000;
|
||
Log.e("PerfMonitor", "getRSSMemoryMBProc failed after " + duration + "μs", e);
|
||
e.printStackTrace();
|
||
}
|
||
return -1;
|
||
}
|
||
```
|
||
|
||
耗时统计:
|
||
|
||
![[Pasted image 20250407134056.png]]
|
||
|
||
微秒和毫秒的换算:
|
||
|
||
![[Pasted image 20250407134132.png]]
|
||
|
||
![[Pasted image 20250407134143.png]]
|
||
|
||
这里是go服务器,检测和创建数据库表的相关逻辑
|
||
|
||
![[Pasted image 20250410175502.png]]
|
||
|
||
这里是整个,go服务器的main启动函数入口:
|
||
|
||
![[Pasted image 20250410175637.png]]
|
||
|
||
main函数运行到这里,就可以判断和创建数据库了
|
||
|
||
![[Pasted image 20250410175756.png]]
|
||
|
||
也是这里,就是服务端,采集到的,相关数据和解析
|
||
|
||
![[Pasted image 20250411111816.png]]
|
||
|
||
然后,这里是之前的相关封装,其中,Msg和ExtMsg等 额外附加数据,可以看到,是封装放到Report里的
|
||
|
||
![[Pasted image 20250411111957.png]]
|
||
|
||
客户端的拼接和上报
|
||
|
||
![[Pasted image 20250411112239.png]]
|
||
|
||
结构体这里,也要加上:
|
||
|
||
![[Pasted image 20250411115605.png]]
|
||
|
||
断点可以采集到,非空的fpsData相关数据
|
||
|
||
![[Pasted image 20250411141921.png]]
|
||
|
||
三消的,lua初始化相关
|
||
|
||
![[Pasted image 20250411154812.png]]
|
||
|
||
解析一下,主逻辑脚本;
|
||
首先,是收集的结构体
|
||
|
||
![[Pasted image 20250415100528.png]]
|
||
|
||
是一个mono的单例,设置上报的时间间隔,是5秒,还有其他声明的变量,例如SkipFrame就是跳过的帧数,FailCheckInterval是发送失败后,间隔多久才开始重新发送,这里设定是60秒
|
||
|
||
![[Pasted image 20250415100730.png]]
|
||
|
||
这是获取,对应操作系统的名称
|
||
|
||
![[Pasted image 20250415102109.png]]
|
||
|
||
在Update函数里,先跳过上述提及的,5帧,然后才开始采集
|
||
|
||
![[Pasted image 20250415102418.png]]
|
||
|
||
这里是检测,上次失败的时间间隔,这里是大于60秒,才会继续重发
|
||
|
||
![[Pasted image 20250415102956.png]]
|
||
|
||
这里是,发送网络消息的接口,设置了超时是10秒,然后重发次数,还有失败多次后,设置enable使能为false
|
||
|
||
![[Pasted image 20250415103219.png]]
|
||
|
||
非常朴素的,获取内存占用相关,这个是不可以直接使用的,因为还使用到,Profiler性能检测的一些接口,后面需要替换成,各原生层的,获取内存的相关接口
|
||
|
||
![[Pasted image 20250415103921.png]]
|
||
|
||
这里是,上报拼接的,具体逻辑
|
||
|
||
![[Pasted image 20250415105531.png]]
|
||
|
||
如果要还原,原本的服务器上报逻辑,参考这个注释,操作即可,一共修改3个地方
|
||
|
||
![[Pasted image 20250418094607.png]]
|
||
|
||
跟日志上报区分一下,服务端,改成collect
|
||
|
||
![[Pasted image 20250418151214.png]]
|
||
|
||
客户端也同步修改一下后缀:
|
||
|
||
![[Pasted image 20250418151248.png]]
|
||
|
||
性能工具 内网服务器:运行测试程序,相关指令
|
||
|
||
``` shell
|
||
cd /usr/local/games/lgcollecter/
|
||
nohup ./lgcollecter > output.log 2>&1 &
|
||
ps -elf | grep lgcollecter
|
||
```
|
||
|
||
可以看到,是正常运行的:
|
||
|
||
![[Pasted image 20250421114219.png]]
|
||
|
||
如果需要,正常中止程序,在获取到进程号之后,直接`kill`就好,例如上述是这个
|
||
|
||
![[Pasted image 20250423160259.png]]
|
||
|
||
``` shell
|
||
kill 2400
|
||
```
|
||
|
||
进阶参考[[获取进程号和kill相关]] |