网站做支付宝支付需要哪些资料/关键词优化的软件
背景
目前随着数据和图表的逐渐增多,Grafana 页面加载速度明显变慢,严重影响了用户体验,几次都有骂娘的冲动=.=,因此我们需要对 Grafana 进行优化,以提升加载性能。
对于速度优化,我们可以从以下方面进行入手:
-
优化前端资源加载
使用反向代理和压缩:通过 NGINX 或其他反向代理服务器启用
gzip
压缩和缓存静态资源,减少页面加载的时间。静态资源缓存:确保静态资源如 CSS、JS 等在浏览器中缓存,以避免每次加载都重新获取这些资源。
-
优化grafana server端服务器资源
增加服务器性能:检查服务器的 CPU、内存和 I/O 是否有瓶颈,适当增加服务器资源配置。
调整 Grafana 服务器配置:增加 Grafana 的
concurrent_requests_limit
设置,允许更多的并发请求。 -
数据库优化
如果你使用的是
Grafana
自己的sqlite
或MySQL
/PostgreSQL
,请确保这些数据库被适当优化,数据库性能问题也可能导致慢加载。 -
分离数据源
多实例 Prometheus:如果你使用的是 Prometheus 数据源,可以考虑使用多个 Prometheus 实例来分担负载,特别是如果你的查询数据量很大。
-
优化数据源查询
减少查询时间范围:设置默认时间范围为较短的时间段(如过去 5 分钟或 15 分钟),以减少加载时的数据量。
使用高效的数据源:检查你的数据源(如 Prometheus 或 Elasticsearch)是否有性能瓶颈。数据源的响应速度慢会直接影响 Grafana 的加载速度。
优化查询:确保你的查询尽可能高效,避免不必要的复杂计算或过滤条件。使用
rate()
或avg_over_time()
等函数优化大数据量的查询。 -
检查网络延迟
这些方案从易到难顺序如下: 检查网络延迟 < 优化数据源查询 < 优化grafana server端服务器资源 < 分离数据源 < 优化前端资源加载 < 数据库优化
目前我遇到的问题是网络没有延迟,数据源采集到的数据量不大,使用了多个prometheus实例,而且grafana server端内存使用率不到 30% ,所以只剩两个选择了,一个是前端资源优化,一个是数据库优化
数据库优化涉及到一个备份迁移的过程,感觉相对来说复杂点,所以尝试了一下优化grafana前端资源
本篇文章主要涉及的是 优化grafana前端资源
实践
下面内容是基于docker的方式进行演示
缓存哪部分内容
grafana静态文件的目录是在/usr/share/grafana/public
我们需要将这部分内容放到缓存中或者CDN或者OSS中
由于CDN和OSS都需要花钱,我们暂时就用nginx来做一个类似缓存的功能
注意事项:
这里我建议直接在正在运行的grafana容器中把这个public包下载下来(想办法下载,比如压缩后下载,docker cp也行),因为grafana运行了很长时间,里面或多或少会新增一些js文件,而这些文件,是在官方纯净版public是没有的
官方纯净版:Download Grafana | Grafana Labs 选择对应的版本,下载window版本,解压后里面有public文件
nginx操作
部署一个nginx,将public静态文件夹放到nginx下面
default.conf如下:
server {listen 80;listen [::]:80;server_name xx.xx.xx;location /grafana-oss/9.5.7/public/ {alias /tmp/public/;# 跨域配置add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';autoindex on;autoindex_exact_size on;autoindex_localtime on;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}
内容解释
location 必须是/grafana-oss/你的grafana版本/public/,因为grafana后台请求时,这些是它源码里面携带的地址,你自己改不了
alias /tmp/public/ 这个路径是 下载下来的public 放在 nginx容器里面的某个位置(我这里是/tmp/public/),可以自定义,当然你也可以是用root,两者的区别:nginx 中location中root和alias的区别
配置完成后,执行下面命令,进行热加载(如果你选择重启容器,下面命令可以不执行)
nginx -t # nginx校验
nginx -s reload # nginx热加载,不用启动容器
接下来验证一下:
访问地址:域名/grafana-oss/9.5.7/public
修改grafana配置文件
配置文件的位置一般在:/etc/grafana/grafana.ini
在[server]下增加以下内容 cdn_url = https://xxx 这个是刚刚nginx的地址(https://ip:port即可)
[analytics]
check_for_updates = true
[grafana_net]
url = https://xxx
[log]
mode = console
[paths]
data = /var/lib/grafana/
logs = /var/log/grafana
plugins = /var/lib/grafana/plugins
provisioning = /etc/grafana/provisioning
[server]
domain = xxxxx
root_url = https://xxxx
cdn_url = https://xxx
[auth.gitlab]
enabled = true
allow_sign_up = true
...
[database]
type=sqlite3
cache_mode = shared
注意,这里你的grafana地址是https的话,建议你nginx也是https,因为https跳转http的话会有点问题
配置完成之后,重启grafana容器即可
验证
此时打开grafana,如果发现地址是修改后的nginx地址,即修改成功
如果是404的话,有下面几个原因:
- public没有相对应的文件;
- nginx location有问题,或者alias有问题;
- 跨域问题
拓展
修复sqlite3数据库
在替换完成之后,我在保存图表的过程报错,error saving dashboard failed to save dashboard
后台日志为:
logger=context userId=0 orgId=0 uname= t=2024-09-20T02:58:49.667754459Z level=info msg="Request Completed" method=GET path=/api/live/ws status=401 remote_addr=103.90.188.115 time_ms=11 duration=11.749188ms size=27 referer= handler=/api/live/ws
logger=context userId=1 orgId=1 uname=admin t=2024-09-20T02:58:49.893549608Z level=error msg="Failed to save dashboard" error="saving dashboard failed: database disk image is malformed" remote_addr=xxxxx traceID=
logger=context userId=1 orgId=1 uname=admin t=2024-09-20T02:58:49.893663102Z level=error msg="Request Completed" method=POST path=/api/dashboards/db/ status=500 remote_addr=xxx time_ms=101 duration=101.326151ms size=51 referer="https://grafana.ljdong.net/d/ea7794xxxxfrom=now-30m&orgId=1&to=now" handler=/api/dashboards/db
注意看,他有一个database disk image is malformed,这个代表是sqlite3文件数据库损坏了,所以保存不了
解决方案:
- 修复sqlite数据库
- 切换mysql或者其他数据库(更稳定)
- 权限问题
修复sqlite数据库的方案:
https://www.sqlite.org/download.html 网站上下载 sqlite-tools 工具
解压上面的压缩包,并在命令行模式下进入该目录运行 sqlite3.exe
# 打开损坏的数据库文件
.open d:/grafana.db
# 进行检测
PRAGMA integrity_check;
# 设置导出文件为 tmp.sql
.output d:/tmp.sql
# 将 grafana.db 中的内容以 sql 方式导出到 tmp.sql
.dump
# 创建 temp.db 数据库
.open d:/temp.db
# 从 tmp.sql 中导入数据
.read d:/tmp.sql
# 退出
.quit # temp即为修复好的数据库
还有一种方案是使用SQLite Expert Professional 工具提供的 repair 来修复 db 文件,这种方案我没试通,感兴趣的可以试试
k8s部署nginx脚本
方便测试
deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:annotations: {}labels:app: nginx-grafananame: nginx-grafananamespace: tools
spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: nginx-grafanastrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: nginx-grafananamespace: toolsspec:containers:- image: 'docker-cf.registry.cyou/nginx:1.22.0'imagePullPolicy: IfNotPresentname: nginxports:- containerPort: 80protocol: TCPresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /etc/nginx/conf.d/name: nginx-configreadOnly: true- mountPath: /tmpname: storagednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30volumes:- configMap:defaultMode: 420name: grafana-nginxname: nginx-config- name: storagepersistentVolumeClaim:claimName: pvc-grafana---
apiVersion: v1
kind: Service
metadata:annotations: {}labels:app: nginx-grafananame: nginx-grafananamespace: tools
spec:internalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- port: 80protocol: TCPtargetPort: 80selector:app: nginx-grafanasessionAffinity: Nonetype: ClusterIP---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations: {}name: nginx-grafananamespace: tools
spec:ingressClassName: nginxrules:- host: xxxxxxxhttp:paths:- backend:service:name: nginx-grafanaport:number: 80path: /pathType: Prefixtls:- hosts:- xxxxxsecretName: xxxxx
configmap.yaml
---
apiVersion: v1
data:default.conf: |server {listen 80;listen [::]:80;server_name xxxx;location /grafana-oss/9.5.7/public/ {alias /tmp/public/;add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';autoindex on;autoindex_exact_size on;autoindex_localtime on;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}
kind: ConfigMap
metadata:name: grafana-nginxnamespace: tools
相关文章:

grafana加载缓慢解决方案
背景 目前随着数据和图表的逐渐增多,Grafana 页面加载速度明显变慢,严重影响了用户体验,几次都有骂娘的冲动.,因此我们需要对 Grafana 进行优化,以提升加载性能。 对于速度优化,我们可以从以下方面进行入…...

【湖南步联科技身份证】 身份证读取与酒店收银系统源码整合———未来之窗行业应用跨平台架构
一、html5 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><script type"text/javascript" src"http://51.onelink.ynwlzc.net/o2o/tpl/Merchant/static/js…...

多路复用和事件轮询机制
多路复用:Nio 服务端只有一个线程处理多个连接 事件轮询机制:select 底层用了 epoll。 select open 调用了 epoll 通过3个方法来实现事件轮询 1.epoll.create 创建epoll 多个集合 2.epoll.ctl 如果有事件会把事件挪到就绪事件列表。 3.epoll.wait 会监听…...

Android常用C++特性之std::abs
声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。 std::abs 是 C 标准库中的一个函数,用于计算整数、浮点数或其他数值类型的绝对值。它返回一个值,该值是参数的非负数形式,即去掉负…...

LabVIEW提高开发效率技巧----使用状态机架构
状态机架构(State Machine Architecture)是LabVIEW编程中的一种常见且高效的设计模式,特别适合用于处理具有多个操作状态的复杂系统。通过这种架构,程序能够根据不同的输入条件或事件,在多个状态之间切换,从…...

Feign:服务挂了也不会走fallback
Feign 本质上是一个 HTTP 客户端,用于简化微服务之间的 HTTP 通信。它允许开发者通过定义接口和注解来声明式地编写 HTTP 客户端,而无需手动编写 HTTP 请求和响应处理的代码。 今天在模拟微服务A feign调用微服务B的时候,把微服务B关了&#…...

网络编程操作—函数
一、socket创建套接字 #include <sys/types.h> //头文件 #include <sys/socket.h> int socket(int domain, int type, int protocol); 三个参数:domain、type、protocol 1.domain:域名,领域,定义域(中文解释&…...

博客摘录「 GD32的flash读、擦除、写操作」2024年9月2日
关于GD32的Flash读、擦除、写操作,以下是基于当前可获得信息(截至2024年9月2日)的详细解答: 一、GD32 Flash的基本特性 存储空间:GD32的Flash存储空间大小因型号而异,可支持从几KB到几MB不等的存储容量。页大小:Flash按页组织,不同型号的GD32其页大小可能不同。例如,…...

【性能优化】低配starRocks常驻内存优化
背景说明 由于服务器的实际资源小于starRocks官方的配置,导致starRocks在无任务的情况下,常驻内存偏高,可用于查询的资源变小。 官方文档 实际部署的集群一般是4C8G和8C16G,be的配置不达标 为了解决单次查询内存不足的问题&…...

科研绘图系列:R语言树结构聚类热图(cluster heatmap)
文章目录 介绍加载R包导入数据数据预处理画图修改图形导出数据系统信息介绍 热图结合树结构展示聚类结果通常用于展示数据集中的模式和关系,这种图形被称为聚类热图或层次聚类热图。在这种图中,热图部分显示了数据矩阵的颜色编码值,而树结构(通常称为树状图或聚类树)则显…...

微信小程序操作蓝牙
主要流程: 1.初始化蓝牙适配器openBluetoothAdapter,如果不成功就onBluetoothAdapterStateChange监听蓝牙适配器状态变化事件 2.startBluetoothDevicesDiscovery开始搜寻附近的蓝牙外围设备 3.onBluetoothDeviceFound监听寻找到新设备的事件,…...

Python爱心射线(完整代码)
目录 系列目录 写在前面 完整代码 下载代码 代码分析 写在后面 系列目录 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3...

努比亚 Z17 NX563J Root 教程三方REC刷写工具教程
教程:1,自用成功 正常链接列表 adb devices 检查fastboot链接列表 fastboot devices 解锁设备fastboot oem nubia_unlock NUBIA_NX563J 我用的解锁设备是:fastboot flashing unlock 1.打开开发者选项。将OEM解锁的按钮打开 2.下载附件努…...

python 02 List
Python 1-14 列表 第一课 1437. 是否所有 1 都至少相隔 k 个元素 class Solution:def kLengthApart(self, nums: List[int], k: int) -> bool:cnt k # 处理第一个 1for i, x in enumerate(nums):if x 1:if cnt < k: return Falsecnt 0 # 遇到 1 从新记数else: cnt …...

【秋招笔试】09.28科大讯飞秋招(已改编)-研发岗
🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的三题全部上线…...

[SAP ABAP] 锁对象
在SAP中使用锁对象,用于避免在数据库中插入或更改数据时出现不一致的情况 1.创建锁对象 数据准备 学校表(ZDBT_SCH_437) 使用事务码SE11创建锁对象 点击"锁对象"单选按钮,输入以E开头的锁定对象的名称,然后点击创建按钮 锁对象名…...

Docker快速部署RabbitMq教程
1、拉取RabbitMQ镜像 docker pull rabbitmq:management RabbitMQ Management 插件为 RabbitMQ 提供了一个基于 Web 的用户界面(Management UI),允许你通过浏览器来监控、管理 RabbitMQ 实例。 因为docker默认是使用的是Docker Hub的官方镜…...

解决银河麒麟V10中/data目录执行权限问题
解决银河麒麟V10中/data目录执行权限问题 1、问题描述2、解决方案步骤一:编辑fstab文件步骤二:重启系统步骤三:验证更改 3、总结 💖The Begin💖点点关注,收藏不迷路💖 在使用银河麒麟桌面操作系…...

画两个数的平方和的曲线
代码1: from mpl_toolkits import mplot3d import numpy as np import matplotlib.pyplot as plt# Creating dataset x np.outer(np.linspace(-3, 3, 32), np.ones(32)) y x.copy().T # transpose z (x **2 y **2 )# Creating figure fig plt.figure(figsize …...

问:进程/线程上下文切换场景及相关概念?
进程、线程以及上下文切换是操作系统和并发编程中不可或缺的概念。这些概念不仅理论意义重大,而且在实际应用中起着至关重要的作用。掌柜将通过具体场景,探讨它们之间的关联以及上下文切换过程。_ 一、进程与线程 进程(有时也称为任务&…...

神经网络(一):神经网络入门
文章目录 一、神经网络1.1神经元结构1.2单层神经网络:单层感知机1.3两层神经网络:多层感知机1.4多层神经网络 二、全连接神经网络2.1基本结构2.2激活函数、前向传播、反向传播、损失函数2.2.1激活函数的意义2.2.2前向传播2.2.3损失函数、反向传播2.2.4梯…...

卸载apt-get 安装的PostgreSQL版本
文章目录 卸载apt-get 安装的PostgreSQL版本查找已安装的PostgreSQL包卸载PostgreSQL:检查并删除残留文件验证卸载 卸载apt-get 安装的PostgreSQL版本 卸载通过apt-get安装的PostgreSQL 就版本,可以按照以下步骤进行。 查找已安装的PostgreSQL包 在卸…...

低代码用户中心:构建高效便捷的用户管理平台
什么是低代码用户中心? 低代码用户中心是一种利用低代码开发平台构建的用户管理系统,允许企业快速创建、部署和管理用户信息、权限及互动记录。通过可视化界面和预置组件,企业可以在短时间内实现灵活的用户管理解决方案,而无需编…...

3款免费的GPT类工具
前言 随着科技的飞速发展,人工智能(AI)的崛起与发展已经成为我们生活中不可或缺的一部分。它的出现彻底改变了我们与世界互动的方式,并为各行各业带来了前所未有的便利。 一、Kimi 网址:点我前往 国产AI模型Kimi是一…...

Mixture-of-Experts (MoE): 条件计算的诞生与崛起【上篇】
大型语言模型(LLM)的现代进步主要是缩放定律的产物[6]。 假设模型是在足够大的数据集上训练出来的,那么随着底层模型规模的增加,我们会看到性能的平滑提升。 这种扩展规律最终促使我们创建了 GPT-3 以及随后的其他(更强…...

【算法】分治:归并排序之LCR 170.交易逆序对的总数(hard)
系列专栏 双指针 模拟算法 分治思想 目录 1、题目链接 2、题目介绍 3、解法 4、代码 1、题目链接 LCR 159. 库存管理 III - 力扣(LeetCode) 2、题目介绍 在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一…...

2024.9.28 作业+思维导图
widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setFixedSize(320,448);this->setWindowFlag(Qt::FramelessWindowHint);//QPushButtonQPushButton *PushButton1 new QPushButton("登录",this);PushButto…...

树莓派外挂Camera(基操)(TODO)
(TODO) 手上有OV5647,OV2640,看这次能不能驱动吧。。。 树莓派3B CSI摄像头配置-阿里云开发者社区 你可以使用树莓派3B的CSI接口连接相机模块。首先,确保相机模块正确连接到CSI接口。然后,使用raspi-config…...

讯飞星火编排创建智能体学习(二)决策节点
目录 概述 决策节点 文生图节点 连接节点 测试结果 概述 在上一篇博文讯飞星火编排创建智能体学习(一)最简单的智能体构建-CSDN博客,我介绍了编排创作智能体,这篇来介绍一下“决策节点”。 决策节点 在编排创作智能体中&…...

YOLOv5改进:Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU
💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…...