性能工具之 MySQL OLTP Sysbench BenchMark 测试示例

文章目录

  • 一、前言
  • 二、测试环境
    • 1、服务器配置
    • 2、测试拓扑
  • 三、测试工具安装
  • 四、测试步骤
    • 1、导入数据
    • 2、压测数据
    • 3、清理数据
  • 五、结果解析
  • 六、最后

一、前言

做为一名性能工程师掌握对 MySQL 的性能测试是非常必要的,本文基于 Sysbench 对MySQL OLTP(联机事务处理) 的 BenchMark 测试案例详细介绍具体方法。

二、测试环境

1、服务器配置

数据库服务器:

  • 操作系统:CentOS 7.6 64位
  • CPU:8核
  • 内存:16GB
  • 磁盘:500GB,最大吞吐量150 MB/s
  • 数据库版本:MySQL Community Server 8.0.37
  • 网络:局域网

测试服务器:

  • 操作系统:CentOS 7.6 64位
  • CPU:8核
  • 内存:16GB
  • 磁盘:500GB,最大吞吐量150 MB/s
  • 测试软件:sysbench-1.0.12
  • 网络:局域网

2、测试拓扑

在这里插入图片描述
📢注意:

  • 尽量不要在 MySQL 本服务器上进行测试,一方面可能无法体现网络(哪怕是局域网)的影响,另一方面,sysbench 的运行(并发数较高时)会影响挤压 MySQL 服务器性能。
  • 在开始 MySQL 测试之前,应针对数据库服务器做好 BenchMark 测试。

三、测试工具安装

Sysbench是一款基于LuaJIT的,模块化多线程基准测试工具,常用于数据库基准测试。通过内置的数据库测试模型,采用多线程并发操作来评估数据库的性能。了解Sysbench更多详情,请访问:https://github.com/akopytov/sysbench。

本次测试使用的Sysbench版本为1.0.12,具体的安装命令如下:

# wget -c https://github.com/akopytov/sysbench/archive/1.0.12.zip
# yum install autoconf libtool mysql mysql-devel vim unzip
# unzip 1.0.12.zip
# cd sysbench-1.0.12
# ./autogen.sh
# ./configure
# make
# make install
#sysbench --version

显示以下内容说明已安装成功。
在这里插入图片描述

四、测试步骤

请根据实际信息,替换数据库、连接IP与用户密码。

1、导入数据

(1)使用 MySQL 命令或第三方工具登录数据库,并创建测试数据库 “loadtest” 。

mysql -u root -P 3306 -h -p -e "create database loadtest"

(2)使用 sysbench 命令导入测试背景数据到 “loadtest” 数据库。

sysbench
--test=/usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua
--db-driver=mysql --mysql-db=loadtest --mysql-user=root
--mysql-password= --mysql-port=3306 --mysql-host= --oltp-tables-count=64 --oltp-table-size=10000000 --num-threads=20 prepare

脚本参数及其含义:

  • –test:指定要运行的测试脚本,这里选择的是一个OLTP(在线事务处理)负载测试脚本。oltp.lua是一个预定义的脚本,用于模拟常见的数据库操作。
  • –db-driver:指定数据库驱动程序,这里选择的是 MySQL。
  • –mysql-db:指定要测试的 MySQL 数据库名称,这里是loadtest数据库。
  • –mysql-user:指定用于连接 MySQL 数据库的用户名,这里是 root 用户。
  • mysql-password:指定用于连接 MySQL 数据库的密码,这里为空,意味着没有设置密码(不推荐在生产环境中使用空密码)。
  • –mysql-port:指定 MySQL 服务器监听的端口,这里是默认的 3306 端口。
  • –mysql-host:指定 MySQL 服务器的主机地址,这里为空,表示连接本地数据库。
  • –oltp-tables-count:指定用于测试的表的数量,这里是 64 个表。
  • –oltp-table-size:指定每个表中的行数,这里是 10,000,000 行。表示每个表有一千万条记录。
  • –num-threads:指定测试时使用的线程数,这里是 20 个线程。表示并发 20 个线程进行测试。
  • prepare:测试提前准备数据

本文是生成 64 张表,每张表有1千万数据,合计导入6亿4千万条数据。

显示下面信息说明已经成功完成测试数据生成:

WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
WARNING: --num-threads is deprecated, use --threads instead
sysbench 1.0.12 (using bundled LuaJIT 2.1.0-beta2)......
Inserting 10000000 records into 'sbtest63'
Creating secondary indexes on 'sbtest63'...
Creating table 'sbtest64'...
Inserting 10000000 records into 'sbtest64'
Creating secondary indexes on 'sbtest64'...
[root@ecs-825d-1113052 ~]#

生产的表结构如下:

CREATE TABLE sbtest (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
k INTEGER UNSIGNED DEFAULT '0' NOT NULL,
c CHAR(120) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB

生产数据样例如下:
在这里插入图片描述

这里用到 oltp.lua 这个关键脚本,我们单独拿出分析下,源码如下:

[root@ecs-825d-1113052 ~]# cat /usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua
-- 匹配test路径并检查
pathtest = string.match(test, "(.*/)")
if pathtest thendofile(pathtest .. "common.lua")
elserequire("common")
end-- 线程初始化函数
function thread_init()-- 设置变量set_vars()-- 检查数据库驱动和表引擎类型if (((db_driver == "mysql") or (db_driver == "attachsql")) and mysql_table_engine == "myisam") thenlocal ilocal tables = {}-- 为每个表构建锁定语句for i=1, oltp_tables_count dotables[i] = string.format("sbtest%i WRITE", i)end-- 设置锁定和解锁查询begin_query = "LOCK TABLES " .. table.concat(tables, " ,")commit_query = "UNLOCK TABLES"else-- 默认使用事务的开始和提交语句begin_query = "BEGIN"commit_query = "COMMIT"end
end-- 获取范围查询的条件字符串
function get_range_str()local start = sb_rand(1, oltp_table_size)return string.format(" WHERE id BETWEEN %u AND %u",start, start + oltp_range_size - 1)
end-- 定义事件函数
function event()local rslocal ilocal table_namelocal c_vallocal pad_vallocal query-- 随机选择一个表table_name = "sbtest".. sb_rand_uniform(1, oltp_tables_count)-- 如果没有跳过事务,则开始事务if not oltp_skip_trx thendb_query(begin_query)end-- 如果不是仅写操作if not oltp_write_only then-- 执行点查询for i=1, oltp_point_selects dors = db_query("SELECT c FROM ".. table_name .." WHERE id=" .. sb_rand(1, oltp_table_size))end-- 如果需要执行范围查询if oltp_range_selects then-- 简单范围查询for i=1, oltp_simple_ranges dors = db_query("SELECT c FROM ".. table_name .. get_range_str())end-- 范围求和查询for i=1, oltp_sum_ranges dors = db_query("SELECT SUM(K) FROM ".. table_name .. get_range_str())end-- 范围排序查询for i=1, oltp_order_ranges dors = db_query("SELECT c FROM ".. table_name .. get_range_str() .. " ORDER BY c")end-- 范围去重查询for i=1, oltp_distinct_ranges dors = db_query("SELECT DISTINCT c FROM ".. table_name .. get_range_str() .. " ORDER BY c")endendend-- 如果不是只读操作if not oltp_read_only then-- 执行索引更新for i=1, oltp_index_updates dors = db_query("UPDATE " .. table_name .. " SET k=k+1 WHERE id=" .. sb_rand(1, oltp_table_size))end-- 执行非索引更新for i=1, oltp_non_index_updates doc_val = sb_rand_str("###########-###########-###########-###########-###########-###########-###########-###########-###########-###########")query = "UPDATE " .. table_name .. " SET c='" .. c_val .. "' WHERE id=" .. sb_rand(1, oltp_table_size)rs = db_query(query)if rs thenprint(query)endend-- 执行删除和插入操作for i=1, oltp_delete_inserts doi = sb_rand(1, oltp_table_size)rs = db_query("DELETE FROM " .. table_name .. " WHERE id=" .. i)c_val = sb_rand_str("###########-###########-###########-###########-###########-###########-###########-###########-###########-###########")pad_val = sb_rand_str("###########-###########-###########-###########-###########")rs = db_query("INSERT INTO " .. table_name ..  " (id, k, c, pad) VALUES " .. string.format("(%d, %d, '%s', '%s')",i, sb_rand(1, oltp_table_size) , c_val, pad_val))endend-- 如果没有跳过事务,则提交事务if not oltp_skip_trx thendb_query(commit_query)end
end

这段 oltp.lua 代码的主要步骤如下:

  • 路径匹配与加载配置:
    • 检查并获取脚本的路径。
    • 如果路径存在,加载 common.lua 文件;否则使用 require 函数加载模块。
  • 线程初始化 (thread_init):
    • 初始化变量。
    • 根据数据库驱动和表引擎类型,决定是否使用锁表操作。
    • 如果数据库驱动是 mysql 或 attachsql 且表引擎为 myisam,则构建锁定和解锁查询语句。
    • 否则,使用默认的事务控制语句(BEGIN 和 COMMIT)。
  • 获取范围查询字符串 (get_range_str):
    • 随机生成一个起始ID。
    • 返回一个用于范围查询的条件字符串,指定查询范围为从起始ID到起始ID加上范围大小减去1。
  • 事件处理 (event):
    • 定义事件函数,该函数是 Sysbench 测试的核心部分
    • 事件函数包括以下操作:
      • 随机选择一个表。
      • 如果没有跳过事务,则开始事务。
      • 根据配置执行不同类型的查询和更新操作,包括点查询、范围查询、索引更新、非索引更新、删除和插入操作。
      • 范围查询包括简单范围查询、求和范围查询、排序范围查询和去重范围查询。
      • 如果没有跳过事务,则提交事务。

这段代码是典型的OLTP(联机事务处理)负载测试脚本,通过模拟多种数据库操作(查询、更新、删除、插入),来评估数据库在高并发访问场景下的性能表现。

2、压测数据

sysbench
--test=/usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua
--db-driver=mysql --mysql-db=loadtest --mysql-user=root
--mysql-password= --mysql-port=3306 --mysql-host=--oltp-tables-count=64
--oltp-table-size=10000000 --max-time=3600 --max-requests=0
--num-threads=200 --report-interval=3 --forced-shutdown=1 run

脚本参数及其含义:

  • –test:指定要运行的测试脚本,这里选择的是一个OLTP(在线事务处理)负载测试脚本。oltp.lua是一个预定义的脚本,用于模拟常见的数据库操作。
  • –db-driver:指定数据库驱动程序,这里选择的是 MySQL。
  • –mysql-db:指定要测试的 MySQL 数据库名称,这里是 loadtest 数据库。
  • –mysql-user:指定用于连接 MySQL 数据库的用户名,这里是 root 用户。
  • mysql-password:指定用于连接 MySQL 数据库的密码,这里为空,意味着没有设置密码(不推荐在生产环境中使用空密码)。
  • –mysql-port:指定 MySQL 服务器监听的端口,这里是默认的 3306 端口。
  • –mysql-host:指定 MySQL 服务器的主机地址,这里为空,表示连接本地数据库。
  • –oltp-tables-count:指定用于测试的表的数量,这里是 64 个表。
  • –oltp-table-size:指定每个表中的行数,这里是 10,000,000 行。表示每个表有一千万条记录。
  • –max-time:指定测试的最大持续时间为3600秒(1小时)。
  • –max-requests:指定要执行的最大请求数。值为0表示请求数不受限制,直到达到最大时间。
  • –num-threads:指定测试时使用的线程数,这里是 200 个线程。表示并发 200 个线程进行测试。
  • –report-interval:指定报告中间结果的时间间隔(每3秒报告一次)。
  • –forced-shutdown:指定如果达到最大时间,Sysbench应该强制关闭测试(1表示启用)。
  • run:开始运行测试的命令。

简要说明就是并发200线程,压测1小时,每3秒打印一次结果等。

3、清理数据

测试完成后,可以运行以下脚本清理测试数据:

sysbench
--test=/usr/local/share/sysbench/tests/include/oltp_legacy/oltp.lua
--db-driver=mysql --mysql-db=loadtest --mysql-user=root
--mysql-password= --mysql-port=3306 --mysql-host= --oltp-tables-count=64 --oltp-table-size=10000000--max-time=3600 --max-requests=0 --num-threads=200 cleanup

脚本参数及其含义:

  • –test:指定要运行的测试脚本,这里选择的是一个OLTP(在线事务处理)负载测试脚本。oltp.lua是一个预定义的脚本,用于模拟常见的数据库操作。
  • –db-driver:指定数据库驱动程序,这里选择的是 MySQL。
  • –mysql-db:指定要测试的 MySQL 数据库名称,这里是 loadtest 数据库。
  • –mysql-user:指定用于连接 MySQL 数据库的用户名,这里是 root 用户。
  • mysql-password:指定用于连接 MySQL 数据库的密码,这里为空,意味着没有设置密码(不推荐在生产环境中使用空密码)。
  • –mysql-port:指定 MySQL 服务器监听的端口,这里是默认的 3306 端口。
  • –mysql-host:指定 MySQL 服务器的主机地址,这里为空,表示连接本地数据库。
  • –oltp-tables-count:指定用于测试的表的数量,这里是 64 个表。
  • –oltp-table-size:指定每个表中的行数,这里是 10,000,000 行。表示每个表有一千万条记录。
  • –max-time:指定测试的最大持续时间为3600秒(1小时)。
  • –max-requests:指定要执行的最大请求数。值为0表示请求数不受限制,直到达到最大时间。
  • –num-threads:指定测试时使用的线程数,这里是 200 个线程。表示并发 200 个线程进行测试。
  • cleanup:测试完成后对数据库进行清理。

五、结果解析

以下为压测过程中打印的结果:

[ 3522s ] thds: 200 tps: 153.98 qps: 3119.87 (r/w/o: 2155.68/656.24/307.95) lat (ms,95%): 1235.62 err/s: 0.00 reconn/s: 0.00
[ 3525s ] thds: 200 tps: 157.36 qps: 2992.89 (r/w/o: 1997.37/680.79/314.72) lat (ms,95%): 4358.09 err/s: 0.00 reconn/s: 0.00
[ 3528s ] thds: 200 tps: 85.33 qps: 1852.86 (r/w/o: 1400.23/281.98/170.65) lat (ms,95%): 1258.08 err/s: 0.00 reconn/s: 0.00

测试结束后,查看输出文件,如下所示:

FATAL: The --max-time limit has expired, forcing shutdown...
SQL statistics:queries performed:read:                            5358024write:                           1530377other:                           765297total:                           7653698transactions:                        382581 (106.24 per sec.)queries:                             7653698 (2125.42 per sec.)ignored errors:                      0      (0.00 per sec.)reconnects:                          0      (0.00 per sec.)Number of unfinished transactions on forced shutdown: 200General statistics:total time:                          3601.0196stotal number of events:              382581Latency (ms):min:                                  4.72avg:                               1881.83max:                              10972.9295th percentile:                   4128.91sum:                            719951371.94Threads fairness:events (avg/stddev):           1913.9050/24.88execution time (avg/stddev):   3599.7569/1.81

是不是有点晕,那我们稍微翻译下,如下所示:

FATAL: The --max-time limit has expired, forcing shutdown...
#SQL统计部分表明了总查询量以及每秒执行的查询和事务数量。这些数据有助于了解数据库的处理能力和性能表现。
SQL statistics(SQL统计信息):queries performed(查询执行情况):read(读查询):                          5358024write(写查询):                         1530377other(其它查询):                        765297total(总查询):                         7653698transactionss(事务):                        382581 (106.24 per sec.) (每秒106.24次)queries(查询):                             7653698 (2125.42 per sec.) (每秒2125.42次)ignored errors(忽略的错误):                      0      (0.00 per sec.) (每秒0次)reconnect(重连)s:                          0      (0.00 per sec.) (每秒0次)# 强制关闭时未完成的事务数量为200,表明在测试过程中有200个事务未能完成,这可能与测试环境或配置有关。
Number of unfinished transactions on forced shutdown: 200General statistics(一般统计信息):total time(总时间):                          3601.0196stotal number of events(事件总数):              382581#延迟数据展示了不同百分位的延迟情况,这些数据对分析数据库响应时间和性能瓶颈很有用。
Latency(延迟) (ms):min(最小延迟):                                  4.72avg(平均延迟):                               1881.83max(最大延迟):                              10972.9295th percentile(95%分位延迟):                4128.91sum(延迟总和):                          719951371.94#线程公平性数据表明,每个线程处理的事件数的平均值和标准差,以及每个线程的执行时间的平均值和标准差。
Threads fairness(线程公平性):events (avg/stddev)(事件(平均值/标准差)):           1913.9050/24.88execution time (avg/stddev)(执行时间(平均值/标准差)):   3599.7569/1.81

这些数据展示了MySQL在高并发负载下的性能情况,主要关注点包括:

  • 查询和事务的执行率:每秒查询和事务数量表明了数据库的吞吐量。
  • 延迟:延迟数据(平均、最大和95%分位)显示了数据库的响应时间和性能瓶颈。
  • 未完成事务:强制关闭时未完成的事务数提示了潜在的事务处理问题。
  • 线程公平性:线程间的负载均衡情况,标准差较低表示负载分配较为均衡。

主要关注的性能指标有:

  • TPS :Transaction Per Second,数据库每秒执行的事务数,每个事务中包含18条SQL语句。
  • QPS :Query Per Second,数据库每秒执行的SQL数,包含insert、select、update、delete等。
  • 延迟:Latency,数据库执行的事务耗时。

Sysbench默认提交的事务中包含18条SQL语句,具体执行语句和条数如下:

主键SELECT语句,10条:
SELECT c FROM ​{rand_table_name} where id={rand_id};范围SELECT语句,4条:
SELECT c FROM ​{rand_table_name} WHERE id BETWEEN {rand_id_start} AND ${rand_id_end};
SELECT SUM(K) FROM ​{rand_table_name} WHERE id BETWEEN {rand_id_start} AND ${rand_id_end};
SELECT c FROM ​{rand_table_name} WHERE id BETWEEN {rand_id_start} AND ${rand_id_end} ORDER BY c;
SELECT DISTINCT c FROM ​{rand_table_name} WHERE id BETWEEN {rand_id_start} AND ${rand_id_end} ORDER BY c;UPDATE语句,2条:
UPDATE ​{rand_table_name} SET k=k+1 WHERE id={rand_id}
UPDATE ​{rand_table_name} SET c={rand_str} WHERE id=${rand_id}DELETE语句,1条:
DELETE FROM ​{rand_table_name} WHERE id={rand_id}INSERT语句,1条:
INSERT INTO ​{rand_table_name} (id, k, c, pad) VALUES ({rand_id},​{rand_k},{rand_str_c},${rand_str_pad})

这些结果可以用于性能调优和瓶颈分析,从而提升 MySQL 数据库在实际应用中的表现。

从Sysbench测试结果来看,这台MySQL服务器在高并发负载下的性能表现有以下几个关键点:

  • 事务处理能力:
    • 每秒事务数(TPS)为106.24次。
    • 总事务数为 382581。
  • 查询处理能力:
    • 每秒查询数(QPS)为 2125.42次。
    • 总查询数为 7653698。
  • 延迟:
    • 平均延迟为 1881.83 毫秒,较高,说明在负载压力下,响应时间比较长
    • 最大延迟为 10972.92 毫秒,非常高,表明在高负载下可能存在严重的性能瓶颈
    • 95% 分位延迟为 4128.91 毫秒,表示大多数请求的响应时间在 4 秒以上,体验较差
  • 未完成事务:
    • 强制关闭时未完成的事务数为 200,表明在高负载下有一部分事务未能及时处理完成。
  • 线程公平性:
    • 每个线程处理的事件数的标准差为 24.88,表明线程间的负载分配较为均衡。
    • 每个线程的执行时间的标准差为 1.81,表明线程执行时间也较为一致。

这里我们可以对比下某云的测试结果:
在这里插入图片描述

数据服务器资源监控数据:
在这里插入图片描述
我们可以看到CPU峰值到75%左右,磁盘峰值写入速率达50MB/s,峰值读取速率达 100MB/s。

六、最后

我们可以看到从测试结果的结果来看,MySQL数据库的性能表现并不好,那么我们接下来应对MySQL数据库进行性能调优并再次验证,希望本文能对你的工作带来一点点帮助,如果有用别忘了点个赞,多谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/34865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现在的Java面试都这么扯淡了吗?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」, 点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!!开发兼过半年面试官 刚开始…

使用js实现input框的模糊搜索

使用简单的js代码就可以实现模糊搜索功能,使用indexOf属性。 json假数据:使用数组包对象的方法,在json中设置了三列数据,分别是:名称,性别和交易额。 [{"name": "虚拟星辰","de…

【杂记-浅谈OSPF协议之STUB、NSSA区域】

OSPF协议之STUB、NSSA区域】 一、STUB区域1、STUB区域概述2、STUB区域的特点3、STUB区域的优缺点 二、NSSA区域1、NSSA区域概述2、NSSA区域的特点3、NSSA区域的配置和使用 一、STUB区域 1、STUB区域概述 STUB区域是OSPF协议中的一个特殊区域类型,主要用于网络设计…

学习java第一百一十天

请解释Spring中的事务管理? 事务管理是确保数据完整性和一致性的重要机制。在Spring框架中,事务管理可以通过声明式事务管理或编程式事务管理来实现。声明式事务管理允许我们将事务管理逻辑与业务逻辑分离,让Spring容器自动处理事务的开启、提…

Selenium与PyAutoGUI的联动:一种创新的Web自动化测试方案

在当今的软件开发周期中,自动化测试是确保软件质量和效率的关键步骤。Selenium是广泛使用的Web应用程序自动化测试工具之一,它支持多种编程语言并且能够模拟用户对浏览器的操作。然而,有些测试场景可能超出了Selenium的处理范围,例…

网络安全等级保护测评

网络安全等级保护 《GB17859 计算机信息系统安全保护等级划分准则》 规定计算机信息系统安全保护等级共分五级 《中华人民共和国网络安全法》 “国家实行网络安全等级保护制度。 等级测评 测评机构依据国家网络安全等级保护制度规定,按照有关 管理规范和…

JVM虚拟机的组成

一、为什么要学习 JVM ? 1. “ ⾯试造⽕箭,⼯作拧螺丝” , JVM 属于⾯试官特别喜欢提问的知识点; 2. 未来在⼯作场景中,也许你会遇到以下场景: 线上系统突然宕机,系统⽆法访问,甚⾄直…

2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024,8月2日-4)

2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)将于2024年8月2-4日在中国厦门召开。ICVISP 2024将围绕“虚拟现实、图像和信号处理”的最新研究领域, 为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提…

STM32+HAL+FreeRTOS,已经修改了系统时钟为定时器,为什么还卡死在HAL_Delay()

问题 使用CubeMX创建了STM32的工程,启用了FreeRTOS,使用的是HAL库,运行后发现卡死在HAL_Delay(),修改了Timebase Source后正常了,后来加入了USB,又卡死了,参考这篇文章解决,后来我又…

迁移方案详解|使用YMP从异构数据库迁移到YashanDB

数据迁移简介 01典型场景与需求 在国产化浪潮下,数据库系统的国产化替代成为了一个日益重要的议题,有助于企业降低对外依赖,提升信息安全和自主性。 以Oracle、MySQL为代表的传统关系型数据库管理系统,在企业应用中占据了重要的…

通用VS垂直,个人观点分析。

摘要:随着人工智能技术的飞速发展,大模型的应用场景越来越广泛。在这个背景下,通用大模型和垂直大模型之间的竞争日趋激烈。本文将围绕这两个方向,探讨它们在第一个赛点中的优劣,并给出个人观点。  一、通用大模型 …

SpringMvcの拦截器全局异常处理

一、拦截器 我们在网上发贴子的时候如果没有登录,点击发送按钮会提示未进行登录,跳转到登录页面。这样的功能是如何实现的。 1、 拦截器的作用 Spring MVC 的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理…

服务器卡的情况下,一般会出现什么表现状况?

1、服务器严重丢包,正常的服务器丢包率为0%,若丢包率高于1%则会出现卡的情况。 2、部分用户卡,部分用户不卡,可能由于硬件防火墙造成,部分链路堵塞。 3、另外,上述情况也可能是互联网节点故障造成。

Elasticsearch:has_child 和 has_parent 查询——父子关系查询详解

在 Elasticsearch 中,父子关系查询是一种特殊的查询类型,它允许我们在具有父子关系的文档之间进行关联查询。这种关系在树形结构或者层次化数据模型中尤为常见。Elasticsearch 提供了 has_child 和 has_parent 两种查询类型,用于在这种关系中…

掌握 Postman 监控功能:自动化测试与性能监控的秘诀

掌握 Postman 监控功能:自动化测试与性能监控的秘诀 引言 在现代软件开发中,API 的稳定性和性能至关重要。Postman,作为最受欢迎的 API 开发工具之一,提供了强大的监控功能,帮助开发者自动化测试和监控 API 的运行状…

图书馆借阅表

DDL 用户表 (Users) 图书表 (Books) 图书类别表 (BookCategories) 图书与类别关联表 (BookCategoryRelations) 借阅记录表 (BorrowRecords) 供应商表 (Suppliers) 采购记录表 (PurchaseRecords) CREATE TABLE Users (user_id INT PRIMARY KEY AUTO_INCREMENT,username …

pytorch神经网络训练(VGG-19)

VGG-19 导包 import torchimport torch.nn as nnimport torch.optim as optimimport torchvisionfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoaderimport matplotlib.pyplot as plt 数据预处理和增强 transform transforms.Compose(…

在 Go 中如何让结构体不可比较?

最近我在使用 Go 官方出品的结构化日志包 slog 时,看到 slog.Value 源码中有一个比较好玩的小 Tips,可以限制两个结构体之间的相等性比较,本文就来跟大家分享下。 在 Go 中结构体可以比较吗? 在 Go 中结构体可以比较吗&#xff…

鸿蒙开发HarmonyOS NEXT(一)

最近总听见大家讨论鸿蒙,前端转型的好方向?先入门学习下 目前官方版本和文档持续更新中 一、开发环境 提示:要占用的空间比较多,建议安装在剩余空间多的盘 1、下载:官网最新工具 - 下载中心 - 华为开发者联盟 (huaw…

RTL8305NB从电口模式切换为光口模式

对于RTL8305NB,要从电口模式切换为光口模式,主要操作涉及到PHY page的切换和特定寄存器的配置。以下是详细的操作步骤: PHY Page切换: 首先,需要访问PHY地址8的寄存器31。这个寄存器用于Page的切换。向PHY地址8的寄存…