当前位置: 首页 > news >正文

PostgreSQL 数据库压力测试指南

一、为什么需要压力测试?

数据库需要进行压力测试的原因主要包括以下几个方面:

  1. 性能评估:通过压力测试,可以了解数据库在高负载情况下的性能表现,包括响应时间、吞吐量和资源利用率等。这有助于确定系统的性能瓶颈。

  2. 稳定性验证:压力测试可以帮助识别数据库在长时间高负载运行时是否会出现崩溃、死锁或其他异常情况,从而确保系统的稳定性和可靠性。

  3. 容量规划:通过模拟实际使用场景中的最大负载,压力测试可以帮助确定数据库所需的硬件和软件资源配置,以满足未来增长的需求。

  4. 优化指导:测试结果可以为数据库的优化提供依据,例如索引优化、查询优化、缓存策略调整等,从而提升整体性能。

  5. 故障预防:压力测试可以暴露潜在的系统缺陷和漏洞,使得开发团队能够提前采取措施进行修复和改进,避免在生产环境中出现问题。

  6. 验证扩展能力:对于分布式数据库系统,压力测试可以验证其扩展能力,确保在增加节点或分片后,系统仍能保持良好的性能和一致性。

二、PostgreSQL 压测工具介绍

1、sysbench

Sysbench 是一个广泛使用的开源多线程基准测试工具,主要用于评估系统性能。它可以用来测试 CPU、内存、磁盘 I/O 和数据库(如 MySQL)的性能。以下是关于 Sysbench 的一些关键点:

  1. CPU 性能测试:通过计算素数等操作来评估 CPU 的计算能力。
  2. 内存性能测试:测试内存的读写速度和带宽。
  3. 磁盘 I/O 性能测试:模拟不同类型的磁盘操作,如顺序读写和随机读写,以评估磁盘的 I/O 性能。
  4. 数据库性能测试:特别是针对 MySQL、PGSQL 数据库,可以进行 OLTP(在线事务处理)基准测试。

2、pgbench

pgbench 是 PostgreSQL 自带的一个基准测试工具,用于对 PostgreSQL 数据库进行压力测试和性能评估。它模拟了多用户并发执行 SQL 操作的场景,帮助数据库管理员和开发人员了解数据库在不同负载下的表现。以下是关于 pgbench 的一些关键点:

  1. 初始化数据库:创建测试所需的表和数据。
  2. 执行基准测试:模拟多个客户端并发执行事务。
  3. 生成报告:输出测试结果,包括每秒事务数(TPS)、响应时间等指标。

三、PostgreSQL 压测案例

1.1、sysbench

官方文档

https://github.com/akopytov/sysbench

https://wiki.gentoo.org/wiki/Sysbench

https://launchpad.net/sysbench

1.1.1、安装

git clone https://github.com/akopytov/sysbenchsudo apt -y install make automake libtool pkg-config libaio-dev# For PostgreSQL support
sudo apt -y install libpq-devcd sysbench/./autogen.sh
# Add --with-pgsql to build with PostgreSQL support
./configure --with-pgsql 
make -j
sudo make install

遇到报错1,sysbench: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory

sysbench: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory

解决方案,

(base) sam@sam-PC:/data/home/sam/TimeEcho/MyWorkSpace/sysbench$ find / -name libmysqlclient.so.20
/home/sam/anaconda3/lib/libmysqlclient.so.20
/home/sam/anaconda3/pkgs/mysql-5.7.24-h721c034_2/lib/libmysqlclient.so.20
/home/sam/anaconda3/envs/myenv3.8/lib/libmysqlclient.so.20-- 软连
sudo ln -s /home/sam/anaconda3/lib/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.20
-- 接着在 /etc/ld.so.cnf 中加入 /usr/lib64 这一行
sudo vim /etc/ld.so.conf
-- 刷新
sudo ldconfig 

遇到报错2,sysbench: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory

sysbench: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory

解决方案,

(base) sam@sam-PC:/data/home/sam/TimeEcho/MyWorkSpace/sysbench$ find / -name libssl.so.3
/home/sam/anaconda3/lib/libssl.so.3
/home/sam/anaconda3/pkgs/openssl-3.0.14-h5eee18b_0/lib/libssl.so.3
/home/sam/anaconda3/envs/myenv3.8/lib/libssl.so.3
/home/sam/anaconda3/envs/myenv3.10/lib/libssl.so.3-- 软连
sudo ln -s /home/sam/anaconda3/lib/libssl.so.3 /usr/lib64/libssl.so.3
-- 刷新
sudo ldconfig 

遇到报错3,sysbench: error while loading shared libraries: libcrypto.so.3: cannot open shared object file: No such file or directory

sysbench: error while loading shared libraries: libcrypto.so.3: cannot open shared object file: No such file or directory

解决方案,

(base) sam@sam-PC:/data/home/sam/TimeEcho/MyWorkSpace/sysbench$  find / -name libcrypto.so.3
/home/sam/anaconda3/lib/libcrypto.so.3
/home/sam/anaconda3/pkgs/openssl-3.0.14-h5eee18b_0/lib/libcrypto.so.3
/home/sam/anaconda3/envs/myenv3.8/lib/libcrypto.so.3
/home/sam/anaconda3/envs/myenv3.10/lib/libcrypto.so.3-- 软连
sudo ln -s /home/sam/anaconda3/lib/libcrypto.so.3 /usr/lib64/libcrypto.so.3
-- 刷新
sudo ldconfig 

验证安装成功,

1.1.2、压测脚本

(base) sam@sam-PC:/usr/local/share$ ls
ca-certificates  fonts  icons  man  sysbench  themes
(base) sam@sam-PC:/usr/local/share$ cd sysbench/
(base) sam@sam-PC:/usr/local/share/sysbench$ ls
bulk_insert.lua  oltp_delete.lua  oltp_point_select.lua  oltp_read_write.lua    oltp_update_non_index.lua  select_random_points.lua  tests
oltp_common.lua  oltp_insert.lua  oltp_read_only.lua     oltp_update_index.lua  oltp_write_only.lua        select_random_ranges.lua
(base) sam@sam-PC:/usr/local/share/sysbench$ 

脚本介绍如下:

oltp_common.lua 脚本是提供给其他脚本如oltp_read_only.lua调用的,是基本的一系列函数。
bulk_insert.lua批量写入操作
oltp_delete.lua写入和删除并行操作
oltp_insert.lua纯写入操作
oltp_point_select.lua只读操作,条件为唯一索引列
oltp_read_only.lua只读操作,包含聚合,去重等操作
oltp_read_write.lua读写混合操作,最常用的脚本。在一个事务中,默认比例是:select:update_key:update_non_key:delete:insert=14:1:1:1:1。这也是为什么,我们测试出来的TPS和QPS的比例,大概在1:18~20左右。相当于说,一个事务中,有18个读写操作。
oltp_update_index.lua更新操作,通过主键进行更新
oltp_update_non_index.lua更新操作,不通过索引列
oltp_write_only.lua纯写操作,常用脚本,包括insert update delete
select_random_points.lua随机集合只读操作,常用脚本,聚集索引列的selete in操作
select_random_ranges.lua随机范围只读操作,常用脚本,聚集索引列selete between操作

1.1.3、测试准备

-- psql -U postgres -h 主机IP 5 -p 5432 -d postgres
-- create database test_db;–- 修改max_connections参数
show max_connections ;
alter system set max_connections=10000;-- 后续重启数据库生效

1.1.4、测试案例

生成10张表,每张表10万的数据量,测试时间1分钟

--批量写入
sysbench /usr/local/share/sysbench/oltp_common.lua --db-driver=pgsql \
--pgsql-host=主机IP --pgsql-port=5432 \
--pgsql-user=postgres --pgsql-password=1234567890  --pgsql-db=test_db \
--table-size=100000 --tables=10 --threads=100 \
--events=999999999 --time=60 prepare

分别测试 20、50、100、200、500、800线程数,

sysbench /usr/local/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
--pgsql-host=主机IP --pgsql-port=5432 \
--pgsql-user=postgres --pgsql-password=1234567890 --pgsql-db=test_db \
--table-size=100000 --tables=10 --threads=20 \
--events=999999999 --time=60 --report-interval=10 \
--db-ps-mode=disable --forced-shutdown=1 run > /home/sam/TimeEcho/MyWorkSpace/tmp/sysbench_log/20.logsysbench /usr/local/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
--pgsql-host=主机IP --pgsql-port=5432 \
--pgsql-user=postgres --pgsql-db=test_db \
--table-size=100000 --tables=10 --threads=50 \
--events=999999999 --time=60 --report-interval=10 \
--db-ps-mode=disable --forced-shutdown=1 run > /home/sam/TimeEcho/MyWorkSpace/tmp/sysbench_log/50.logsysbench /usr/local/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
--pgsql-host=主机IP --pgsql-port=5432 \
--pgsql-user=postgres --pgsql-db=test_db \
--table-size=100000 --tables=10 --threads=100 \
--events=999999999 --time=60 --report-interval=10 \
--db-ps-mode=disable --forced-shutdown=1 run > /home/sam/TimeEcho/MyWorkSpace/tmp/sysbench_log/100.logsysbench /usr/local/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
--pgsql-host=主机IP --pgsql-port=5432 \
--pgsql-user=postgres --pgsql-db=test_db \
--table-size=100000 --tables=10 --threads=200 \
--events=999999999 --time=60 --report-interval=10 \
--db-ps-mode=disable --forced-shutdown=1 run > /home/sam/TimeEcho/MyWorkSpace/tmp/sysbench_log/200.logsysbench /usr/local/share/sysbench/oltp_read_write.lua --db-driver=pgsql \
--pgsql-host=主机IP --pgsql-port=5432 \
--pgsql-user=postgres --pgsql-db=test_db \
--table-size=100000 --tables=10 --threads=800 \
--events=999999999 --time=60 --report-interval=10 \
--db-ps-mode=disable --forced-shutdown=1 run > /home/sam/TimeEcho/MyWorkSpace/tmp/sysbench_log/800.log

线程数 20 测试日志如下:

(base) sam@sam-PC:~/TimeEcho/MyWorkSpace/tmp/sysbench_log$ cat 20.log 
sysbench 1.1.0-de18a03 (using bundled LuaJIT 2.1.0-beta3)Running the test with following options:
Number of threads: 20
Report intermediate results every 10 second(s)
Initializing random number generator from current timeForcing shutdown in 61 secondsInitializing worker threads...Threads started![ 10s ] thds: 20 tps: 54.09 qps: 1106.07 (r/w/o: 778.14/217.75/110.18) lat (ms,95%): 657.93 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 20 tps: 48.38 qps: 963.01 (r/w/o: 673.46/192.80/96.75) lat (ms,95%): 657.93 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 20 tps: 47.13 qps: 940.84 (r/w/o: 657.28/189.41/94.15) lat (ms,95%): 657.93 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 20 tps: 46.60 qps: 936.77 (r/w/o: 658.28/185.19/93.30) lat (ms,95%): 682.06 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 20 tps: 46.70 qps: 930.22 (r/w/o: 650.31/186.60/93.30) lat (ms,95%): 657.93 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 20 tps: 48.30 qps: 961.50 (r/w/o: 671.00/194.00/96.50) lat (ms,95%): 669.89 err/s: 0.00 reconn/s: 0.00
SQL statistics:queries performed:read:                            41048write:                           11728other:                           5864total:                           58640transactions:                        2932   (48.43 per sec.)queries:                             58640  (968.68 per sec.)ignored errors:                      0      (0.00 per sec.)reconnects:                          0      (0.00 per sec.)Throughput:events/s (eps):                      48.4340time elapsed:                        60.5360stotal number of events:              2932Latency (ms):min:                                   73.45avg:                                  412.19max:                                 1564.7495th percentile:                      669.89sum:                              1208555.33Threads fairness:events (avg/stddev):           146.6000/10.27execution time (avg/stddev):   60.4278/0.09

测试结果解析,

每10秒钟的统计数据如下
[ 10s ] thds: 20 tps: 54.09 qps: 1106.07 (r/w/o: 778.14/217.75/110.18) lat (ms,95%): 657.93 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 20 tps: 48.38 qps: 963.01 (r/w/o: 673.46/192.80/96.75) lat (ms,95%): 657.93 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 20 tps: 47.13 qps: 940.84 (r/w/o: 657.28/189.41/94.15) lat (ms,95%): 657.93 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 20 tps: 46.60 qps: 936.77 (r/w/o: 658.28/185.19/93.30) lat (ms,95%): 682.06 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 20 tps: 46.70 qps: 930.22 (r/w/o: 650.31/186.60/93.30) lat (ms,95%): 657.93 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 20 tps: 48.30 qps: 961.50 (r/w/o: 671.00/194.00/96.50) lat (ms,95%): 669.89 err/s: 0.00 reconn/s: 0.00thds: 线程数
tps: 每秒事务数
qps: 每秒查询数
r/w/o: 每秒读/写/其他查询数
lat (ms,95%): 95% 的延迟时间(毫秒)
err/s: 每秒错误数
reconn/s: 每秒重连数
SQL 统计信息
SQL statistics:queries performed:read:                            41048write:                           11728other:                           5864total:                           58640transactions:                        2932   (48.43 per sec.)queries:                             58640  (968.68 per sec.)ignored errors:                      0      (0.00 per sec.)reconnects:                          0      (0.00 per sec.)queries performed: 执行的查询数,包括读、写和其他查询。
transactions: 总事务数及每秒事务数。
queries: 总查询数及每秒查询数。
ignored errors: 忽略的错误数及每秒忽略错误数。
reconnects: 重连次数及每秒重连次数。    
吞吐量
Throughput:events/s (eps):                      48.4340time elapsed:                        60.5360stotal number of events:              2932events/s (eps): 每秒事件数。
time elapsed: 测试总耗时。
total number of events: 总事件数。    
延迟
Latency (ms):min:                                   73.45avg:                                  412.19max:                                 1564.7495th percentile:                      669.89sum:                              1208555.33min: 最小延迟时间(毫秒)。
avg: 平均延迟时间(毫秒)。
max: 最大延迟时间(毫秒)。
95th percentile: 95% 的延迟时间(毫秒)。
sum: 延迟时间总和(毫秒)。         
线程公平性
Threads fairness:events (avg/stddev):           146.6000/10.27execution time (avg/stddev):   60.4278/0.09events (avg/stddev): 每个线程的平均事件数及标准差。
execution time (avg/stddev): 每个线程的平均执行时间及标准差。    

压测综合总结,

  • 在60秒内,共执行了2932个事务,每秒约48.43个事务。

  • 查询总数为58640,每秒约968.68个查询。

  • 平均延迟时间为412.19毫秒,95%的延迟时间在669.89毫秒以内。

  • 没有出现错误或重连情况。

  • 每个线程的平均事件数为146.6,标准差为10.27,表明线程之间的负载较为均衡。

-- 监控过程状态
select datid,datname,pid,usesysid,usename,application_name,client_addr,client_port,state,query 
from pg_stat_activity;-- ps -ef|grep pmms | wc -l

1.1.5、清理数据

sysbench /usr/local/share/sysbench/oltp_common.lua --db-driver=pgsql \
--pgsql-host=主机IP --pgsql-port=5432 \
--pgsql-user=postgres --pgsql-password=0123456789  --pgsql-db=test_db \
--table-size=100000 --tables=10 --threads=1000 \
--events=999999999 --time=60 cleanup

1.2、pgbench

1.2.1、安装 pgbench

sudo apt-get install postgresql-contrib sysstat

1.2.2、初始化数据

-- psql -U postgres -h 主机IP -p 5432 -d postgres
-- create database test_db;-- pgbench -i -s 100 -U postgres test_db
-- 说明;主要用到两个参数,-i:初始化模式,-s 插入的倍数,默认是1,即插入100000条;也就是执行多少次generate_series(1,100000)。pgbench -i -s 100 -h 主机IP -p 5432 -U postgres test_db

1.2.3、压测过程

-- 模拟80个用户,64个线程多并发,每10秒显示一次进度报告,运行60秒
pgbench -n -T 60 -P 10 -c 80 -j 64 -h 主机IP -p 5432 -U postgres test_db-- 状态监控
select count(*) from pg_stat_activity where datname='test_db';
(base) sam@sam-PC:~$ pgbench -n -T 60 -P 10 -c 80 -j 64 -h 127.0.0.1 -p 5432 -U postgres test_db
progress: 10.0 s, 185.5 tps, lat 231.286 ms stddev 161.302
progress: 20.0 s, 504.3 tps, lat 159.039 ms stddev 45.080
progress: 30.0 s, 517.3 tps, lat 154.581 ms stddev 36.330
progress: 40.0 s, 478.3 tps, lat 167.215 ms stddev 42.947
progress: 50.0 s, 551.1 tps, lat 145.115 ms stddev 27.300
progress: 60.0 s, 599.8 tps, lat 133.631 ms stddev 26.195
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 100
query mode: simple
number of clients: 80
number of threads: 64
duration: 60 s
number of transactions actually processed: 28443
latency average = 156.186 ms
latency stddev = 58.525 ms
tps = 472.832911 (including connections establishing)
tps = 500.746326 (excluding connections establishing)
(base) sam@sam-PC:~$ 

日志解析

  • 在每个10秒的间隔内,报告了事务处理速度(tps)、延迟(latency)和标准差(stddev)。

  • 从第10秒到第60秒,tps逐渐增加,延迟逐渐减少,标准差也有所下降。

  • 实际处理的事务数:28443

  • 平均延迟:156.186 ms

  • 延迟标准差:58.525 ms

  • 吞吐量(包括连接建立时间):472.832911 tps

  • 吞吐量(不包括连接建立时间):500.746326 tps

1.2.4、压测结论

吞吐量TPS

吞吐量在测试过程中逐渐增加,从最初的185.5 tps增长到最后的599.8 tps。这表明系统在运行一段时间后,性能得到了提升,可能是因为缓存的热身或者资源的更有效利用。

延迟(Latency)

延迟在测试过程中逐渐减少,从最初的231.286 ms降到最后的133.631 ms。这与吞吐量的增加相一致,表明系统在处理请求时变得更加高效。

标准差(Stddev)

标准差在测试过程中显著减少,从最初的161.302降到最后的26.195。这表明系统的性能变得更加稳定,延迟的波动性减少。

平均延迟和标准差

平均延迟为156.186 ms,标准差为58.525 ms。虽然平均延迟较高,但标准差的降低表明系统在大多数情况下能够保持较为一致的性能。

相关文章:

PostgreSQL 数据库压力测试指南

一、为什么需要压力测试&#xff1f; 数据库需要进行压力测试的原因主要包括以下几个方面&#xff1a; 性能评估&#xff1a;通过压力测试&#xff0c;可以了解数据库在高负载情况下的性能表现&#xff0c;包括响应时间、吞吐量和资源利用率等。这有助于确定系统的性能瓶颈。 …...

npm : 无法加载文件 C:\nvm\v20.11.1\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅

在vscode中运行前端项目时npm run dev 报错&#xff1a;npm : 无法加载文件 C:\nvm\v20.11.1\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1…...

-bash:/usr/bin/rm: Argument list too long 解决办法

问题概述 小文件日志太多导致无法使用rm命令&#xff0c;因为命令行参数列表的长度超过了系统允许的最大值。 需要删除/tmp目录下的所有文件&#xff0c;文件数量比较多。 ls -lt /tmp | wc -l 5682452 解决方法如下&#xff1a; 使用find -exec 遍历&#xff0c;然后执行删…...

【deepseek 部署中的常见问题及解决方案--亲测有效】

deepseek 部署中的常见问题及解决方案 一、环境与安装相关问题二、配置相关问题三、运行与性能问题四、其他常见问题 一、环境与安装相关问题 Python版本不兼容 问题描述&#xff1a;在部署DeepSeek时&#xff0c;系统提示Python版本不兼容。解决方法&#xff1a;DeepSeek推荐…...

【React】react-redux+redux-toolkit实现状态管理

安装 npm install reduxjs/toolkit react-reduxRedux Toolkit 是官方推荐编写Redux的逻辑方式&#xff0c;用于简化书写方式React-redux 用来链接Redux和React组件之间的中间件 使用 定义数据 创建要管理的数据模块 store/module/counter.ts import { createSlice, Payloa…...

LabVIEW用户界面(UI)和用户体验(UX)设计

作为一名 LabVIEW 开发者&#xff0c;满足功能需求、保障使用便捷与灵活只是基础要求。在如今这个用户体验至上的时代&#xff0c;为 LabVIEW 应用程序设计直观且具有美学感的界面&#xff0c;同样是不容忽视的关键任务。一个优秀的界面设计&#xff0c;不仅能提升用户对程序的…...

期权帮 | 场外个股期权可以做吗,风险高吗?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 场外个股期权可以做吗&#xff0c;风险高吗? 场外个股期权&#xff0c;就是在正式的交易所之外进行交易的个股期权。 注&#xff1a;这里的“场外”指的是这类交易不在像沪深…...

【Viper】配置格式与支持的数据源与go案例

Viper 是一个用于 Go 应用程序的配置管理库&#xff0c;支持多种配置格式和数据源。 安装依赖 go get github.com/spf13/viper go get github.com/spf13/viper/remote go get go.etcd.io/etcd/client/v3"github.com/spf13/viper/remote"要写在etcd客户端import里 1…...

【工具变量】地级市数字基础设施水平数据(2003-2024年)

一、数据来源&#xff1a;数据涵盖了2003-2024年间地级市新型数字基础设施的发展水平测量值。数据的核心来自地方政府工作报告中提及的相关词汇&#xff0c;并通过对这些报告的分词和频次统计&#xff0c;得出每个城市在该领域的数字基础设施发展水平。 数据覆盖全国285个地级市…...

Ae:常见的光照控件和材质控件

在 After Effects中&#xff0c;几种模拟效果都有类似的光照控件和材质控件&#xff0c;比如&#xff0c;焦散、卡片动画、碎片等。 光照控件和材质控件允许用户模拟不同光源、阴影和高光效果&#xff0c;控制表面反射特性&#xff0c;从而实现真实的光照和反射模拟。适用于材质…...

POI 的 Excel 读写操作教程

POI 的 Excel 读写操作教程 一、POI 简介 Apache POI 是一款在 Java 开发中广受欢迎的开源库&#xff0c;主要用于处理各种 Microsoft Office 文件格式&#xff0c;Excel 文件便是其中之一。凭借其功能强大的 API&#xff0c;POI 不仅支持对 Excel 文件的读取、写入和修改&am…...

java处理pgsql的text[]类型数据问题

背景 公司要求使用磐维数据库&#xff0c;于是去了解了这个是基于PostgreSQL构建的&#xff0c;在使用时有场景一条图片数据中可以投放到不同的页面&#xff0c;由于简化设计就放在数组中&#xff0c;于是使用了text[]类型存储&#xff1b;表结构 #这是一个简化版表结构&…...

数据结构:Map Set(一)

目录 一、搜索树 1、概念 2、查找 3、插入 4、删除 二、搜索 1、概念及场景 2、模型 &#xff08;1&#xff09;纯key模型 &#xff08;2&#xff09;Key-Value模型 三、Map的使用 1、什么是Map&#xff1f; 2、Map的常用方法 &#xff08;1&#xff09;V put(K …...

Ansible 自动化 Linux 运维:解放你的双手,让运维变得简单

Ansible 自动化 Linux 运维:解放你的双手,让运维变得简单 在现代 IT 运维中,随着系统规模的不断扩展,如何高效地管理和维护大量的服务器成为了一项巨大挑战。传统的手动操作不仅费时费力,还容易出错。而 Ansible 作为一款开源的自动化运维工具,凭借其易用性和强大的功能…...

不需要移植和配置xinetd 等相类似执行文件,tftp-hpa服务器交叉移植使用说明

tftp-hpa-5.2.tar.gz :下载链接 https://download.csdn.net/download/lyeffort/90361414 tar -xvf tftp-hpa-5.2.tar.gz -C /root/tftpd/ # ./autogen.sh # export PATH/root/linux-arm-tools/mips-linux-gclibc/bin:$PATH # mkdir /root/tftpd/install # ./configure --h…...

利用用个人PC搭建私有大模型(低成本、易实施的私有大模型部署方案,兼顾英语 5G协议学习与实践需求)

背景 个人有2台电脑&#xff0c; 第一台&#xff1a; laptop cpu 12th Gen Intel Core™ i7-1260P 2.10 GHz&#xff0c; GPU intel iris Xe graphics&#xff0c; 第二台&#xff1a; MS-7D22&#xff0c;Intel Core™ i5-10400F CPU 2.90GHz&#xff0c; GeForce GT 730。想…...

SAP 借助 Databricks 推出Business Data Cloud

SAP与Databricks合作推出了SAP Business Data Cloud&#xff0c;这是一项突破性的解决方案&#xff0c;旨在统一和整合企业内所有SAP及第三方数据&#xff0c;为企业提供可信的数据基础&#xff0c;从而推动更具影响力的决策并促进可靠的AI应用。这一合作标志着企业数据管理的新…...

地基Spring中bean生命周期和设计模式

面试问题&#xff1a; 在Java面试中&#xff0c;当被提问到Spring中Bean的生命周期和设计模式时&#xff0c;你可以按照以下方式回答&#xff0c;以体现自己的专业知识和实际项目经验&#xff1a; Spring中Bean的生命周期 Spring中Bean的生命周期是一个复杂但有序的过程&#…...

CanMV的刷新比Openmv强

今天使用CanMV k230的板子&#xff0c;发现CanMV的刷新比Openmv强&#xff0c;速度快&#xff0c;不用再次拍照刷新&#xff0c;写一次就能在ide屏幕上同时显示。 参考一下CanMV K230拍照保存Demo - CanMV&#xff08;K210 / K230&#xff09; - 01科技 | 01Studio Takephot(…...

Xilinx kintex-7系列 FPGA支持PCIe 3.0 吗?

Xilinx kintex-7系列资源如下图 Xilinx各系列的GT资源类型和性能 PCIe Gen1/2/3的传输速率对比 K7上面使用的高速收发器GTX最高速率为12.5GT/s&#xff0c; PCIe Gen2 每个通道的传输速率为 5 GT/s。 PCIe Gen3 每个通道的传输速率为 8 GT/s。 所以理论上硬件支持PCIe3.0&#…...

蓝桥杯篇---实时时钟 DS1302

文章目录 前言特点简介1.低功耗2.时钟/日历功能3.32字节的额外RAM4.串行接口 DS1302 引脚说明1.VCC12.VCC23.GND4.CE5.I/O6.SCLK DS1302 寄存器1.秒寄存器2.分钟寄存器3.小时寄存器4.日寄存器5.月寄存器6.星期寄存器7.年寄存器8.控制寄存器 DS1302 与 IAP25F2K61S2 的连接1.CE连…...

【蓝桥杯嵌入式】8_IIC通信-eeprom读写

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 这个电路允许通过I2C总线与EEPROM(M24C02-WMN6TP)和数字电位器(MCP4017T-104ELT)进行通信。EEPROM用于存储数据&#xff0c;而数字电位器可以用…...

支持向量机原理

支持向量机&#xff08;简称SVM&#xff09;虽然诞生只有短短的二十多年&#xff0c;但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法&#xff0c;不考虑特定的训练数据集&#xff0c;尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…...

E8移动建模关联建模表单,写入无数据

场景&#xff1a;移动建模新建一个招聘页面&#xff0c;每次通过移动建模写入建模表数据&#xff0c;建模表的值都要权限重构才可看见&#xff0c;且明细无数据。 排查原因&#xff1a;移动建模提交后返回的ID值为空 正常情况下提交数据应该要返回一个ID值如下&#xff1a; 解…...

一文深入了解DeepSeek-R1:模型架构

本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型&#xff0c;以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 &#x1f4dd; 1. 输入上下文长度 DeepSeek-R1的输入上下文长…...

腿足机器人之二- 运动控制概览

腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件&#xff0c;关节不仅需要通过机械设计实现复杂的运动能力&#xff0c;还必须通过电子组件和控制系统来精确控制这些运动。…...

前端面试大全

前端面试大全 一、htmlcss1、垂直定位的实现方式 二、javascript1、深拷贝浅拷贝2、作用域3、原型原型链4、防抖节流5、设计模式 三、ES61、 四、typescript五、vue1、vue2和vue3的区别2、生命周期3、computedwatch 六、react七、uni-app八、Cesiumopenlayer九、Threejs十、ngi…...

如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?

载体主要包括纸质文件、笔记本电脑、优盘、光盘、移动硬盘、打印机、复印机、录音设备等&#xff0c;载体&#xff08;特别是涉密载体&#xff09;是各保密、机要单位保证涉密信息安全、防止涉密信息泄露的重要信息载体。载体管控系统主要采用RFID射频识别及物联网技术&#xf…...

Python 调用 DeepSeek API 案例详细教程

本案例为以 Python 为例的调用 DeepSeek API 的小白入门级详细教程 步骤 先注册并登录 DeepSeek 官网&#xff1a;https://www.deepseek.com/ 手机号验证码注册或登录即可 创建 API KEY 注意保存&#xff0c;写代码时必须提供的 打开 Pycharm 创建工程 并安装 OpenAI 库编写代…...

牛客面筋学习

准备阶段&#xff1a; 楼主其实很早就开始准备了&#xff0c;大概从年初开始&#xff0c;陆陆续续总结自己的项目&#xff0c;复盘&#xff0c;然后复习数电模电信号电路等&#xff0c;复习完后&#xff0c;便开始刷题&#xff1b;顺便说一下&#xff0c;如果需要发小论文的也…...

对指针的深入运用-通讯录的初步实现

1.通讯录的功能 手机里的通讯录&#xff0c;是能够存放联系人的信息&#xff0c;包括姓名&#xff0c;性别&#xff0c;地址&#xff0c;电话号码&#xff0c;也可以加上性别。而且手机中的通讯录肯定有增删查改的功能&#xff0c;而且在list里是按照顺序排序的&#xff0c;可以…...

VUE环境搭建

node.js安装 node npm – node Package Management 安装完成后&#xff0c;需要设置&#xff1a; npm config set prefix "D:\nodejs"注意&#xff1a;“D:\nodejs” 此处为自己安装的node.js路径。管理员身份运行 切换镜像源 npm config set registry https://r…...

DeepSeek应用——与PyCharm的配套使用

目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回&#xff0c;且在本地模型报错 记录自己学习应用DeepSeek的过程&#xff0c;使用的是自己电脑本地部署的私有化蒸馏模型...... &#xff08;举一反三&#xff0c;这个不单单是可以用…...

C# ASP.NET的未来发展趋势

.NET学习资料 .NET学习资料 .NET学习资料 在快速发展的技术浪潮中&#xff0c;C# ASP.NET不断顺应时代潮流&#xff0c;展现出一系列令人瞩目的未来发展趋势。这些趋势不仅反映了技术的进步&#xff0c;也为开发者带来了更多的机遇和挑战。 云原生应用开发 随着云计算的普及…...

leetcode 416. 分割等和子集

题目如下 数据范围 本题和leetcode 2915. 和为目标值的最长子序列的长度类似&#xff0c;这里不过多赘述。leetcode 2915. 和为目标值的最长子序列的长度 通过代码 class Solution { public:bool canPartition(vector<int>& nums) {int n nums.size();int an…...

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性&#xff1a;理解其强大功能与应用场景 前言一、依赖项属性基础概念1.1 什么是依赖项属性1.2 依赖项属性与 CLR 属性的区别1.3 依赖项属性的定义与注册 二、依赖项属性的原理深入剖析2.1 依赖项属性系统的工作机制2.2 元数据&#xff08;Metadata…...

浅聊MQ之Kafka与RabbitMQ简用

Kafka与RabbitMQ的使用举例 Kafka的使用举例 安装与启动&#xff1a; 从Apache Kafka官网下载Kafka中间件的运行脚本。解压后&#xff0c;通过命令行启动Zookeeper&#xff08;Kafka的运行依赖于Zookeeper&#xff09;。启动Kafka的服务器进程。 基本功能实现&#xff1a; 生…...

2.1 JUnit 5 测试发现机制详解

JUnit 5 测试发现机制详解 JUnit 5 的测试发现机制是框架的核心功能之一&#xff0c;负责识别测试类、方法和其他可执行元素&#xff0c;并构建出可执行的测试计划。该机制通过模块化设计支持高度扩展性&#xff0c;允许开发者自定义测试发现规则。以下是其工作原理的详细解析…...

【Elasticsearch】match查询

Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值&#xff0c;并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析&#xff0c;包括其工作原理、参数配置和使用场景。 1.match查询的…...

【开发心得】CentOS7编译Redis7.4.2打包RPM完整方案

概述 由于最近客户需要解决redis版本升级问题&#xff0c;故而全网寻找安全版本&#xff0c;redis7.4.x版本求而为果&#xff0c;只能自己编译了。 截止发文时间2025-02-12 最新稳定版的redis版本号为7.4.2 Security fixes (CVE-2024-46981) Lua script commands may lead t…...

云计算——AWS Solutions Architect – Associate(saa)6.CloudWatch

Amazon CloudWatch 是一种面向开发运营工程师、开发人员、站点可靠性工程师(SRE)和 IT 经理的监控和可观测性服务。CloudWatch 为我们提供相关数据和切实见解&#xff0c;以监控应用程序、响应系统范围的性能变化、优化资源利用率&#xff0c;并在统一视图中查看运营状况。 Clo…...

面试实战题:手写一个队列和介绍Stream流怎么使用

手写一个队列 思路解析&#xff1a; 队列要有入队和出队操作&#xff0c;还要有查看队列大小&#xff0c;查看队头元素&#xff0c;查看队列是否为空&#xff0c;查看队列是否满了这些功能 package com.example.transational.MyQueue;public class MyQueue<T> {privat…...

Jmeter+Influxdb+Grafana平台监控性能测试过程

一、Jmeter自带插件监控 下载地址&#xff1a;https://jmeter-plugins.org/install/Install/ 安装&#xff1a;下载后文件为jmeter-plugins-manager-1.3.jar&#xff0c;将其放入jmeter安装目录下的lib/ext目录&#xff0c;然后重启jmeter&#xff0c;即可。 启动Jmeter&…...

【现代深度学习技术】深度学习计算 | GPU

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

基于斜坡单元的机器学习模型预测滑坡易发性,考虑条件因素的异质性

&#xff11;、引用 Chang Z, Catani F, Huang F, et al. Landslide susceptibility prediction using slope unit-based machine learning models considering the heterogeneity of conditioning factors[J]. Journal of Rock Mechanics and Geotechnical Engineering, 2023…...

Node.js调用DeepSeek Api 实现本地智能聊天的简单应用

在人工智能快速发展的今天&#xff0c;如何快速构建一个智能对话应用成为了开发者们普遍关注的话题。本文将为大家介绍一个基于Node.js的命令行聊天应用&#xff0c;它通过调用硅基流动&#xff08;SiliconFlow&#xff09;的API接口&#xff0c;实现了与DeepSeek模型的智能对话…...

实战 - 编写一个最简单的 Hello World 内核模块

实战 - 编写一个最简单的 Hello World 内核模块 在嵌入式开发中&#xff0c;编写 Linux 内核模块是设备驱动开发的重要基础。内核模块可以帮助我们在不修改内核源码的情况下扩展内核功能。本篇博客将指导你如何编写并运行一个简单的 Hello World 内核模块&#xff0c;让你快速…...

面向对象程序设计-实验七

6-1 计算捐款总量 这里需要设计一个捐款人类Donator及一个相关函数getMaxName( )&#xff0c;Donator类中包含捐款人的姓名及其捐款额 代码清单&#xff1a; #include <iostream> using namespace std; class Donator { private: string name; float money; //单位&…...

JVM组成

JVM是什么&#xff1f; JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a;Java程序的运行环境(java二进制字节码的运行环境) 好处&#xff1a; 1.一次编写&#xff0c;到处运行 Java代码是如何做到一次编写&#xff0c;到处运行&#xff1f; 计算机的最底层是计…...

java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException

Java8升级到17之后, 启动报错, :LocalValidatorFactoryBean]: Factory method defaultValidator threw exception; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException 报错原因:这个错误通常是由于缺少 javax.xml.bind 相关的依赖引起…...