| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- package controller
- import (
- "net/http"
- "os"
- "runtime"
- "time"
- "github.com/QuantumNous/new-api/common"
- "github.com/gin-gonic/gin"
- )
- // PerformanceStats 性能统计信息
- type PerformanceStats struct {
- // 缓存统计
- CacheStats common.DiskCacheStats `json:"cache_stats"`
- // 系统内存统计
- MemoryStats MemoryStats `json:"memory_stats"`
- // 磁盘缓存目录信息
- DiskCacheInfo DiskCacheInfo `json:"disk_cache_info"`
- // 磁盘空间信息
- DiskSpaceInfo DiskSpaceInfo `json:"disk_space_info"`
- // 配置信息
- Config PerformanceConfig `json:"config"`
- }
- // MemoryStats 内存统计
- type MemoryStats struct {
- // 已分配内存(字节)
- Alloc uint64 `json:"alloc"`
- // 总分配内存(字节)
- TotalAlloc uint64 `json:"total_alloc"`
- // 系统内存(字节)
- Sys uint64 `json:"sys"`
- // GC 次数
- NumGC uint32 `json:"num_gc"`
- // Goroutine 数量
- NumGoroutine int `json:"num_goroutine"`
- }
- // DiskCacheInfo 磁盘缓存目录信息
- type DiskCacheInfo struct {
- // 缓存目录路径
- Path string `json:"path"`
- // 目录是否存在
- Exists bool `json:"exists"`
- // 文件数量
- FileCount int `json:"file_count"`
- // 总大小(字节)
- TotalSize int64 `json:"total_size"`
- }
- // DiskSpaceInfo 磁盘空间信息
- type DiskSpaceInfo struct {
- // 总空间(字节)
- Total uint64 `json:"total"`
- // 可用空间(字节)
- Free uint64 `json:"free"`
- // 已用空间(字节)
- Used uint64 `json:"used"`
- // 使用百分比
- UsedPercent float64 `json:"used_percent"`
- }
- // PerformanceConfig 性能配置
- type PerformanceConfig struct {
- // 是否启用磁盘缓存
- DiskCacheEnabled bool `json:"disk_cache_enabled"`
- // 磁盘缓存阈值(MB)
- DiskCacheThresholdMB int `json:"disk_cache_threshold_mb"`
- // 磁盘缓存最大大小(MB)
- DiskCacheMaxSizeMB int `json:"disk_cache_max_size_mb"`
- // 磁盘缓存路径
- DiskCachePath string `json:"disk_cache_path"`
- // 是否在容器中运行
- IsRunningInContainer bool `json:"is_running_in_container"`
- }
- // GetPerformanceStats 获取性能统计信息
- func GetPerformanceStats(c *gin.Context) {
- // 不再每次获取统计都全量扫描磁盘,依赖原子计数器保证性能
- // 仅在系统启动或显式清理时同步
- cacheStats := common.GetDiskCacheStats()
- // 获取内存统计
- var memStats runtime.MemStats
- runtime.ReadMemStats(&memStats)
- // 获取磁盘缓存目录信息
- diskCacheInfo := getDiskCacheInfo()
- // 获取配置信息
- diskConfig := common.GetDiskCacheConfig()
- config := PerformanceConfig{
- DiskCacheEnabled: diskConfig.Enabled,
- DiskCacheThresholdMB: diskConfig.ThresholdMB,
- DiskCacheMaxSizeMB: diskConfig.MaxSizeMB,
- DiskCachePath: diskConfig.Path,
- IsRunningInContainer: common.IsRunningInContainer(),
- }
- // 获取磁盘空间信息
- diskSpaceInfo := getDiskSpaceInfo()
- stats := PerformanceStats{
- CacheStats: cacheStats,
- MemoryStats: MemoryStats{
- Alloc: memStats.Alloc,
- TotalAlloc: memStats.TotalAlloc,
- Sys: memStats.Sys,
- NumGC: memStats.NumGC,
- NumGoroutine: runtime.NumGoroutine(),
- },
- DiskCacheInfo: diskCacheInfo,
- DiskSpaceInfo: diskSpaceInfo,
- Config: config,
- }
- c.JSON(http.StatusOK, gin.H{
- "success": true,
- "data": stats,
- })
- }
- // ClearDiskCache 清理不活跃的磁盘缓存
- func ClearDiskCache(c *gin.Context) {
- // 清理超过 10 分钟未使用的缓存文件
- // 10 分钟是一个安全的阈值,确保正在进行的请求不会被误删
- err := common.CleanupOldDiskCacheFiles(10 * time.Minute)
- if err != nil {
- common.ApiError(c, err)
- return
- }
- c.JSON(http.StatusOK, gin.H{
- "success": true,
- "message": "不活跃的磁盘缓存已清理",
- })
- }
- // ResetPerformanceStats 重置性能统计
- func ResetPerformanceStats(c *gin.Context) {
- common.ResetDiskCacheStats()
- c.JSON(http.StatusOK, gin.H{
- "success": true,
- "message": "统计信息已重置",
- })
- }
- // ForceGC 强制执行 GC
- func ForceGC(c *gin.Context) {
- runtime.GC()
- c.JSON(http.StatusOK, gin.H{
- "success": true,
- "message": "GC 已执行",
- })
- }
- // getDiskCacheInfo 获取磁盘缓存目录信息
- func getDiskCacheInfo() DiskCacheInfo {
- // 使用统一的缓存目录
- dir := common.GetDiskCacheDir()
- info := DiskCacheInfo{
- Path: dir,
- Exists: false,
- }
- entries, err := os.ReadDir(dir)
- if err != nil {
- return info
- }
- info.Exists = true
- info.FileCount = 0
- info.TotalSize = 0
- for _, entry := range entries {
- if entry.IsDir() {
- continue
- }
- info.FileCount++
- if fileInfo, err := entry.Info(); err == nil {
- info.TotalSize += fileInfo.Size()
- }
- }
- return info
- }
|