解锁性能密码:Linux 环境下 Oracle 大页配置全攻略
在 Oracle 数据库运行过程中,内存管理是影响其性能的关键因素之一。大页内存(Large Pages)作为一种优化内存使用的技术,能够显著提升 Oracle 数据库的运行效率。本文将深入介绍大页内存的相关概念,并详细阐述 Oracle 在 Linux 系统上的大页配置过程。
一、大页内存介绍
(一)概念
大页内存,是指使用比系统默认页面更大的内存页面来管理内存。在传统的内存管理模式下,操作系统使用较小的页面(例如 4KB)来管理内存,而大页内存通常提供 2MB 甚至 1GB 的页面大小。
对于大的SGA大小,HugePages可以在虚拟内存管理方面提供实质性的好处。如果没有HugePages, SGA的内存将被划分为4K页面,这些页面必须由Linux内核管理。使用HugePages,页面大小增加到2MB(如果硬件支持,可以配置为1G),从而减少了内核要管理的页面总数,从而减少了在内存中保存页面表所需的内存量。除了这些更改之外,与HugePages关联的内存不能交换出去,这迫使SGA保持内存驻留。内存的节省和页面管理的工作量使得在x86-64架构上运行的Oracle系统几乎必须使用HugePages。
(二)优势
- 减少页表项数量:由于大页内存页面尺寸更大,同样大小的内存使用大页时所需的页表项数量会大幅减少。这可以降低 CPU 在地址转换时对页表的访问次数,从而提高内存访问效率。
- 降低 TLB(Translation Lookaside Buffer,转换后援缓冲器)压力:TLB 用于缓存页表项,以加快内存地址转换速度。大页内存减少了页表项数量,进而降低了 TLB 的负载,减少 TLB 未命中的情况,提升内存访问性能。
- 提升应用程序性能:对于像 Oracle 这样的大型数据库管理系统,频繁的内存操作和数据读写对内存性能要求极高。大页内存能够提供更高效的内存访问,减少内存碎片,从而显著提升 Oracle 数据库的运行性能。
(三)在 Oracle 数据库中的作用
Oracle 数据库的 SGA(System Global Area,系统全局区)是数据库运行时最重要的内存区域,用于存储数据库实例的数据和控制信息。将 SGA 放置在大页内存中,可以充分利用大页内存的优势,使 SGA 中的数据访问更加快速和高效,减少内存争用,为数据库的稳定运行和高性能表现提供有力保障。
一个大的SGA并不意味着如果不使用HugePages就会出现问题。通常,大型SGA和大量数据库连接的组合会导致问题。要确定当前使用多少内存来支持页表,请在服务器处于正常/重载状态时运行以下命令。
# grep PageTables /proc/meminfo
PageTables: 1244880 kB
注意:自动内存管理(Automatic Memory Management, AMM)与Linux HugePages不兼容,所以除了ASM实例和小型不重要的数据库之外,在Linux上运行的真实数据库上可能不需要AMM。相反,应该使用自动共享内存管理和自动PGA管理,因为它们与HugePages兼容
二、配置大页
运行以下命令确定当前HugePage的使用情况。在Oracle Linux 8上,默认的HugePage大小是2MB。从下面的输出中可以看到,默认情况下没有定义HugePages。
$ grep Huge /proc/meminfo
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
根据SGA的大小,您可能希望将Hugepagesize的值增加到1G。
用以下内容创建一个名为“hugepages_setting.sh”的文件。
#!/bin/bash
#
# hugepages_setting.sh
#
# Linux bash script to compute values for the
# recommended HugePages/HugeTLB configuration
#
# Note: This script does calculation for all shared memory
# segments available when the script is run, no matter it
# is an Oracle RDBMS shared memory segment or not.
# Check for the kernel version
KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`
# Find out the HugePage size
HPG_SZ=`grep Hugepagesize /proc/meminfo | awk {'print $2'}`
# Start from 1 pages to be on the safe side and guarantee 1 free HugePage
NUM_PG=1
# Cumulative number of pages required to handle the running shared memory segments
for SEG_BYTES in `ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"`
doMIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`if [ $MIN_PG -gt 0 ]; thenNUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`fi
done
# Finish with results
case $KERN in'2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;'2.6' | '3.8' | '3.10' | '4.1' | '4.14' ) echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;*) echo "Unrecognized kernel version $KERN. Exiting." ;;
esac
# End
使文件可执行。
$ chmod u+x hugepages_setting.sh
确保所有Oracle服务在服务器上正常运行,然后运行脚本并记录推荐的“vm.nr_hugepages”价值。
$ ./hugepages_setting.sh
Recommended setting: vm.nr_hugepages = 305
以“root”用户身份编辑“/etc/sysctl.conf”文件,添加以下条目,并根据脚本的输出进行调整。您应该将值设置为大于或等于脚本显示的值。您只需要 1 或 2 个备用页。
vm.nr_hugepages=306
以“root”用户身份运行以下命令。
# sysctl -p
或者,编辑“/etc/grub.conf”文件,将“hugepages=306”添加到默认内核的内核行末尾,然后重新启动。
您现在可以看到 HugePages 已创建,但当前尚未使用。
$ grep Huge /proc/meminfo
AnonHugePages: 0 kB
HugePages_Total: 306
HugePages_Free: 306
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
将以下条目添加到“/etc/security/limits.conf”脚本或“/etc/security/limits.d/99-grid-oracle-limits.conf”脚本中,其中设置至少为HugePages 分配(以 KB 为单位)(HugePages * Hugepagesize)。在这种情况下,该值为 306*2048=626688。
* soft memlock 626688
* hard memlock 626688
检查是否未为数据库设置 MEMORY_TARGET 参数,而是使用 SGA_TARGET 和 PGA_AGGREGATE_TARGET 参数。
SQL> show parameter targetNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target big integer 0
memory_target big integer 0
parallel_servers_target integer 16
pga_aggregate_target big integer 200M
sga_target big integer 600M
根据需要重启服务器并重启数据库服务。
再次检查HugePages信息。
$ grep Huge /proc/meminfo
AnonHugePages: 0 kB
HugePages_Total: 306
HugePages_Free: 98
HugePages_Rsvd: 93
HugePages_Surp: 0
Hugepagesize: 2048 kB
您可以看到 HugePages 现在正在被使用。
三、强制ORACLE使用大页 (USE_LARGE_PAGES)
正确调整 HugePages 的数量非常重要,因为在 11.2.0.3 之前,如果整个 SGA 不适合可用的 HugePages,实例将在不使用任何 HugePages 的情况下启动。从11.2.0.3开始,SGA部分可以运行在HugePages中,部分不能运行,所以这个问题的影响不是很大。不正确的尺寸可能不易被发现。数据库的更高版本在启动期间在警报日志中显示“大页信息”部分。
****************** Large Pages Information *****************Total Shared Global Region in Large Pages = 602 MB (100%)Large Pages used by this instance: 301 (602 MB)
Large Pages unused system wide = 5 (10 MB) (alloc incr 4096 KB)
Large Pages configured system wide = 306 (612 MB)
Large Page size = 2048 KB
***********************************************************
如果您运行的是 Oracle 11.2.0.2 或更高版本,则可以将 USE_LARGE_PAGES 初始化参数设置为“only”,这样数据库在没有大页支持的情况下将无法启动。
ALTER SYSTEM SET use_large_pages=only SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
启动时,警报日志中的“大页面信息”反映了此参数的使用。
****************** Large Pages Information *****************
Parameter use_large_pages = ONLYTotal Shared Global Region in Large Pages = 602 MB (100%)Large Pages used by this instance: 301 (602 MB)
Large Pages unused system wide = 5 (10 MB) (alloc incr 4096 KB)
Large Pages configured system wide = 306 (612 MB)
Large Page size = 2048 KB
***********************************************************
当没有足够的 HugePages 来容纳 SGA 时尝试启动数据库现在将返回以下错误。
SQL> STARTUP
ORA-27137: unable to allocate large pages to create a shared memory segment
Linux-x86_64 Error: 12: Cannot allocate memory
SQL>
警报日志输出的“大页信息”部分描述了启动失败以及要采取的适当操作。
****************** Large Pages Information *****************
Parameter use_large_pages = ONLYLarge Pages unused system wide = 0 (0 KB) (alloc incr 4096 KB)
Large Pages configured system wide = 0 (0 KB)
Large Page size = 2048 KBERROR:Failed to allocate shared global region with large pages, unix errno = 12.Aborting Instance startup.ORA-27137: unable to allocate Large Pages to create a shared memory segmentACTION:Total Shared Global Region size is 608 MB. Increase the number ofunused large pages to atleast 304 (608 MB) to allocate 100% Shared GlobalRegion with Large Pages.
***********************************************************
四、禁止透明大页
从 RHEL6/OL6 开始,默认实现并启用透明大页。它们旨在通过允许“khugpaged”内核线程动态分配 HugePages 来改进内存管理,而不是像传统的 HugePages 那样在启动时分配。这听起来是个好主意,但不幸的是,透明大页不能很好地与 Oracle 数据库配合使用,并且与 RAC 安装中的节点重新启动以及单实例和 RAC 安装中的性能问题相关。因此,Oracle 建议在运行 Oracle 数据库的所有服务器上禁用透明大页。
五、大页性能测试
以下是一个实验过程,用于证明 Oracle 在 Linux 上开启大页内存配置后能获得明显的性能提升。这个实验设计包含了测试环境准备、测试方案设计、测试执行和结果分析等关键环节。
(一)脚本analyze-results.sh
#!/bin/bash# Oracle大页内存性能测试 - 结果分析脚本# 检查参数
if [ -z "$1" ] || [ -z "$2" ]; thenecho "用法: $0 <非大页测试结果目录> <大页测试结果目录>"exit 1
fi# 定义常量
NON_HUGEPAGES_DIR=$1
HUGEPAGES_DIR=$2
ANALYSIS_DIR="$HOME/hugepages_analysis_$(date +%Y%m%d_%H%M%S)"
RESULT_FILE="$ANALYSIS_DIR/comparison_results.txt"# 创建分析目录
mkdir -p $ANALYSIS_DIR# 记录结果函数
record_result() {echo "$1" >> $RESULT_FILEecho "$1"
}# 分析测试结果
analyze_test_results() {local test_type=$1local non_hugepages_files=$(find $NON_HUGEPAGES_DIR -name "${test_type}*.txt" | sort)local hugepages_files=$(find $HUGEPAGES_DIR -name "${test_type}*.txt" | sort)record_result "=== 测试类型: $test_type ==="record_result ""local non_hugepages_total_time=0local non_hugepages_count=0local hugepages_total_time=0local hugepages_count=0# 计算非大页测试的平均时间record_result "非大页测试结果:"for file in $non_hugepages_files; do# 提取real时间real_time=$(grep "real" "$file" | tail -1 | awk '{print $2}')# 转换为秒minutes=$(echo $real_time | cut -d'm' -f1)seconds=$(echo $real_time | cut -d'm' -f2 | cut -d's' -f1)total_seconds=$(echo "scale=2; $minutes * 60 + $seconds" | bc)record_result " 文件: $(basename $file), 执行时间: ${total_seconds}秒"non_hugepages_total_time=$(echo "scale=2; $non_hugepages_total_time + $total_seconds" | bc)((non_hugepages_count++))doneif [ $non_hugepages_count -gt 0 ]; thennon_hugepages_avg_time=$(echo "scale=2; $non_hugepages_total_time / $non_hugepages_count" | bc)record_result " 平均执行时间: ${non_hugepages_avg_time}秒"elserecord_result " 未找到非大页测试结果"non_hugepages_avg_time=0firecord_result ""# 计算大页测试的平均时间record_result "大页测试结果:"for file in $hugepages_files; do# 提取real时间real_time=$(grep "real" "$file" | tail -1 | awk '{print $2}')# 转换为秒minutes=$(echo $real_time | cut -d'm' -f1)seconds=$(echo $real_time | cut -d'm' -f2 | cut -d's' -f1)total_seconds=$(echo "scale=2; $minutes * 60 + $seconds" | bc)record_result " 文件: $(basename $file), 执行时间: ${total_seconds}秒"hugepages_total_time=$(echo "scale=2; $hugepages_total_time + $total_seconds" | bc)((hugepages_count++))doneif [ $hugepages_count -gt 0 ]; thenhugepages_avg_time=$(echo "scale=2; $hugepages_total_time / $hugepages_count" | bc)record_result " 平均执行时间: ${hugepages_avg_time}秒"elserecord_result " 未找到大页测试结果"hugepages_avg_time=0firecord_result ""# 计算性能提升百分比if [ $non_hugepages_avg_time -gt 0 ] && [ $hugepages_avg_time -gt 0 ]; thenimprovement=$(echo "scale=2; (1 - $hugepages_avg_time / $non_hugepages_avg_time) * 100" | bc)record_result "性能提升: ${improvement}%"elserecord_result "无法计算性能提升百分比"firecord_result "========================================"record_result ""
}# 主函数
record_result "Oracle大页内存性能测试对比分析"
record_result "测试日期: $(date)"
record_result "非大页测试结果目录: $NON_HUGEPAGES_DIR"
record_result "大页测试结果目录: $HUGEPAGES_DIR"
record_result "----------------------------------------"
record_result ""# 分析各项测试结果
analyze_test_results "full_table_scan"
analyze_test_results "index_scan"
analyze_test_results "dml_operations"# 生成图表数据
if [ -f "$RESULT_FILE" ]; then# 提取性能提升数据grep "性能提升" "$RESULT_FILE" > "$ANALYSIS_DIR/improvement_data.txt"# 创建简单的性能对比图表cat > "$ANALYSIS_DIR/performance_comparison_chart.csv" <<EOF
测试类型,非大页平均时间(秒),大页平均时间(秒),性能提升(%)
全表扫描,$(grep "全表扫描" "$RESULT_FILE" | awk '{print $5}'),$(grep "全表扫描" "$RESULT_FILE" | awk '{print $12}'),$(grep "全表扫描" "$RESULT_FILE" | awk '{print $15}')
索引扫描,$(grep "索引扫描" "$RESULT_FILE" | awk '{print $5}'),$(grep "索引扫描" "$RESULT_FILE" | awk '{print $12}'),$(grep "索引扫描" "$RESULT_FILE" | awk '{print $15}')
DML操作,$(grep "DML操作" "$RESULT_FILE" | awk '{print $5}'),$(grep "DML操作" "$RESULT_FILE" | awk '{print $12}'),$(grep "DML操作" "$RESULT_FILE" | awk '{print $15}')
EOFrecord_result "分析完成,结果保存在: $RESULT_FILE"record_result "图表数据保存在: $ANALYSIS_DIR/performance_comparison_chart.csv"
fi
(二)脚本run-performance-tests.sh
#!/bin/bash# Oracle大页内存性能测试 - 测试执行脚本# 检查是否为oracle用户
if [ "$(id -un)" != "oracle" ]; thenecho "请使用oracle用户执行此脚本"exit 1
fi# 定义常量
ORACLE_SID="TESTDB"
ORACLE_HOME="/u01/app/oracle/product/19.3.0/dbhome_1"
TEST_USER="testuser"
TEST_PASS="testuser"
TEST_RUNS=5
TEST_RESULTS_DIR="$HOME/hugepages_test_results"
LOG_FILE="$TEST_RESULTS_DIR/performance_test_$(date +%Y%m%d_%H%M%S).log"# 创建结果目录
mkdir -p $TEST_RESULTS_DIR# 记录日志函数
log() {echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}# 函数:执行SQL测试
run_sql_test() {local test_name=$1local sql_statement=$2local test_file="$TEST_RESULTS_DIR/${test_name}_$(date +%Y%m%d_%H%M%S).txt"log "开始测试: $test_name"for ((i=1; i<=$TEST_RUNS; i++)); dolog " 测试运行 #$i"# 执行SQL并记录时间{ time $ORACLE_HOME/bin/sqlplus -S $TEST_USER/$TEST_PASS <<EOF
SET TIMING ON
SET SERVEROUTPUT ON
$sql_statement
EXIT;
EOF; } 2>> $test_file# 睡眠2秒sleep 2donelog "完成测试: $test_name"
}# 函数:执行基准测试
run_benchmark_tests() {log "开始执行基准测试..."# 测试1: 全表扫描run_sql_test "full_table_scan" "SELECT COUNT(*) FROM test_table;"# 测试2: 索引扫描run_sql_test "index_scan" "SELECT * FROM test_table WHERE created_date > SYSDATE - 100;"# 测试3: DML操作run_sql_test "dml_operations" "
DECLAREv_cnt NUMBER;
BEGIN-- 更新操作UPDATE test_table SET data = data || '_UPDATED' WHERE MOD(id, 10) = 0;COMMIT;-- 删除操作DELETE FROM test_table WHERE id > 990000;COMMIT;-- 插入操作FOR i IN 990001..1000000 LOOPINSERT INTO test_table VALUES (i, 'NEW TEST DATA ' || TO_CHAR(i), SYSDATE);END LOOP;COMMIT;-- 回滚测试SAVEPOINT sp1;UPDATE test_table SET data = data || '_TEMP' WHERE MOD(id, 5) = 0;ROLLBACK TO sp1;-- 统计行数SELECT COUNT(*) INTO v_cnt FROM test_table;DBMS_OUTPUT.PUT_LINE('总行数: ' || v_cnt);
END;
/
"log "基准测试完成"
}# 函数:收集AWR报告
collect_awr_report() {log "收集AWR报告..."local snapshot_id_start=$($ORACLE_HOME/bin/sqlplus -S / as sysdba <<EOF
SET HEADING OFF
SET FEEDBACK OFF
SET PAGESIZE 0
SELECT MAX(snap_id) FROM dba_hist_snapshot;
EXIT;
EOF
)# 等待10分钟收集性能数据log "等待10分钟收集性能数据..."sleep 600local snapshot_id_end=$($ORACLE_HOME/bin/sqlplus -S / as sysdba <<EOF
SET HEADING OFF
SET FEEDBACK OFF
SET PAGESIZE 0
SELECT MAX(snap_id) FROM dba_hist_snapshot;
EXIT;
EOF
)local awr_file="$TEST_RESULTS_DIR/awr_report_$(date +%Y%m%d_%H%M%S).html"# 创建AWR报告$ORACLE_HOME/bin/sqlplus -S / as sysdba <<EOF
SET SERVEROUTPUT ON
SPOOL $awr_file
@?/rdbms/admin/awrrpt.sql html
$snapshot_id_start
$snapshot_id_end
7
SPOOL OFF
EXIT;
EOFlog "AWR报告已生成: $awr_file"
}# 主函数
case "$1" inrun-tests)log "=== 开始性能测试 ==="run_benchmark_testslog "=== 性能测试完成 ===";;collect-awr)log "=== 开始收集AWR报告 ==="collect_awr_reportlog "=== AWR报告收集完成 ===";;*)echo "用法: $0 [run-tests|collect-awr]"echo " run-tests - 执行基准测试"echo " collect-awr - 收集AWR性能报告"exit 1;;
esac
(三)脚本setup-test-env.sh
#!/bin/bash# Oracle大页内存性能测试 - 环境准备脚本# 检查是否为root用户
if [ "$(id -u)" -ne 0 ]; thenecho "请使用root用户执行此脚本"exit 1
fi# 定义常量
SGA_SIZE_GB=8
HUGEPAGE_SIZE_MB=2
HUGEPAGE_COUNT=$((SGA_SIZE_GB * 1024 / HUGEPAGE_SIZE_MB))
ORACLE_SID="TESTDB"
ORACLE_HOME="/u01/app/oracle/product/19.3.0/dbhome_1"# 函数:配置大页内存
configure_hugepages() {echo "配置大页内存..."# 修改sysctl.confcat >> /etc/sysctl.conf <<EOF
# 配置大页内存用于Oracle性能测试
vm.nr_hugepages = $HUGEPAGE_COUNT
vm.transparent_hugepage.enabled = never
vm.transparent_hugepage.khugepaged = never
EOF# 使配置生效sysctl -p# 配置大页挂载点if ! grep -q "hugetlbfs" /etc/fstab; thenecho "none /dev/hugepages hugetlbfs defaults 0 0" >> /etc/fstabmkdir -p /dev/hugepagesmount -afiecho "大页内存配置完成"
}# 函数:禁用大页内存
disable_hugepages() {echo "禁用大页内存..."# 修改sysctl.confsed -i '/vm.nr_hugepages/d' /etc/sysctl.confsed -i '/vm.transparent_hugepage/d' /etc/sysctl.conf# 添加禁用配置cat >> /etc/sysctl.conf <<EOF
# 禁用大页内存
vm.nr_hugepages = 0
vm.transparent_hugepage.enabled = always
vm.transparent_hugepage.khugepaged = always
EOF# 使配置生效sysctl -p# 卸载大页挂载点if grep -q "hugetlbfs" /etc/fstab; thenumount /dev/hugepages 2>/dev/nullsed -i '/hugetlbfs/d' /etc/fstabfiecho "大页内存已禁用"
}# 函数:配置Oracle使用大页
configure_oracle_hugepages() {echo "配置Oracle使用大页内存..."su - oracle -c "$ORACLE_HOME/bin/sqlplus / as sysdba <<EOF
ALTER SYSTEM SET sga_target=${SGA_SIZE_GB}G SCOPE=SPFILE;
ALTER SYSTEM SET use_large_pages=TRUE SCOPE=SPFILE;
EXIT;
EOF"echo "Oracle大页配置完成,请重启数据库使配置生效"
}# 函数:配置Oracle不使用大页
configure_oracle_no_hugepages() {echo "配置Oracle不使用大页内存..."su - oracle -c "$ORACLE_HOME/bin/sqlplus / as sysdba <<EOF
ALTER SYSTEM SET sga_target=${SGA_SIZE_GB}G SCOPE=SPFILE;
ALTER SYSTEM SET use_large_pages=FALSE SCOPE=SPFILE;
EXIT;
EOF"echo "Oracle大页配置已禁用,请重启数据库使配置生效"
}# 函数:创建测试用户和表
create_test_objects() {echo "创建测试用户和表..."su - oracle -c "$ORACLE_HOME/bin/sqlplus / as sysdba <<EOF
CREATE USER testuser IDENTIFIED BY testuser DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
GRANT CONNECT, RESOURCE, DBA TO testuser;
EXIT;
EOF"# 创建测试表su - oracle -c "$ORACLE_HOME/bin/sqlplus testuser/testuser <<EOF
CREATE TABLE test_table (id NUMBER PRIMARY KEY,data VARCHAR2(4000),created_date DATE
);-- 插入100万条测试数据
BEGINFOR i IN 1..1000000 LOOPINSERT INTO test_table VALUES (i, 'TEST DATA ' || TO_CHAR(i), SYSDATE);IF MOD(i, 10000) = 0 THENCOMMIT;END IF;END LOOP;COMMIT;
END;
/-- 创建索引
CREATE INDEX idx_test_table ON test_table(created_date);
EXIT;
EOF"echo "测试对象创建完成"
}# 主函数
case "$1" inenable-hugepages)configure_hugepagesconfigure_oracle_hugepages;;disable-hugepages)disable_hugepagesconfigure_oracle_no_hugepages;;create-test-data)create_test_objects;;*)echo "用法: $0 [enable-hugepages|disable-hugepages|create-test-data]"echo " enable-hugepages - 配置并启用大页内存"echo " disable-hugepages - 禁用大页内存"echo " create-test-data - 创建测试数据"exit 1;;
esac
(四)使用说明test-procedure.md
# Oracle大页内存性能测试实验步骤## 一、测试环境准备
### 1. 系统和数据库配置
确保测试环境满足以下条件:
- Linux操作系统(推荐Oracle Linux 7或Red Hat Enterprise Linux 7及以上版本)
- Oracle数据库(12c及以上版本)
- 足够的内存(建议至少16GB)
- 测试数据库实例
### 2. 安装测试脚本
将提供的三个脚本文件复制到测试服务器:
- setup-test-env.sh - 环境准备脚本
- run-performance-tests.sh - 测试执行脚本
- analyze-results.sh - 结果分析脚本确保脚本具有执行权限:chmod +x setup-test-env.sh run-performance-tests.sh analyze-results.sh## 二、执行测试
### 1. 禁用大页内存并进行测试
首先,以root用户执行以下命令禁用大页内存并配置Oracle不使用大页:./setup-test-env.sh disable-hugepages
重启系统使配置生效:shutdown -r now
系统重启后,以oracle用户连接数据库并启动数据库:sqlplus / as sysdba
STARTUP
创建测试数据:./setup-test-env.sh create-test-data
执行基准测试并收集结果:mkdir -p ~/non_hugepages_results
./run-performance-tests.sh run-tests > ~/non_hugepages_results/test_log_$(date +%Y%m%d).txt
./run-performance-tests.sh collect-awr > ~/non_hugepages_results/awr_log_$(date +%Y%m%d).txt
### 2. 启用大页内存并进行测试
以root用户执行以下命令启用大页内存并配置Oracle使用大页:./setup-test-env.sh enable-hugepages
重启系统使配置生效:shutdown -r now
系统重启后,以oracle用户连接数据库并启动数据库:sqlplus / as sysdba
STARTUP
执行基准测试并收集结果:mkdir -p ~/hugepages_results
./run-performance-tests.sh run-tests > ~/hugepages_results/test_log_$(date +%Y%m%d).txt
./run-performance-tests.sh collect-awr > ~/hugepages_results/awr_log_$(date +%Y%m%d).txt## 三、分析测试结果
以oracle用户执行结果分析脚本:./analyze-results.sh ~/non_hugepages_results ~/hugepages_results
分析脚本会生成详细的测试对比结果和图表数据,查看结果文件:cat ~/hugepages_analysis_*/comparison_results.txt## 四、实验结果解读
分析结果文件中的数据,重点关注以下指标:
1. 各项测试(全表扫描、索引扫描、DML操作)在启用大页和未启用大页情况下的执行时间对比
2. 性能提升百分比
3. AWR报告中的内存使用情况、CPU使用率等关键指标通常情况下,启用大页内存后,Oracle数据库的性能会有明显提升,尤其是在内存访问密集型操作中。## 五、注意事项
1. 在测试过程中,确保系统负载稳定,避免其他应用程序干扰测试结果
2. 测试前关闭所有不必要的服务和进程
3. 建议进行多次测试以确保结果的可靠性
4. 测试完成后,可以根据实际情况决定是否在生产环境中启用大页内存配置
这个实验设计通过对比启用和禁用大页内存两种情况下 Oracle 数据库的性能表现,能够直观地展示大页内存对数据库性能的影响。实验包含完整的环境准备、测试执行和结果分析流程,通过多种测试场景(全表扫描、索引扫描、DML 操作)验证大页内存的性能优势。
在执行实验时,请按照测试步骤说明依次操作,并根据实际环境调整相关参数(如 SGA 大小、测试数据量等)。测试完成后,通过分析结果文件中的性能数据和图表,你将能够清晰地看到启用大页内存后 Oracle 数据库的性能提升情况。
六、总结
通过以上步骤,我们完成了 Oracle 在 Linux 上的大页配置。合理配置大页内存能够有效提升 Oracle 数据库的性能和稳定性,但在配置过程中需要注意参数的准确设置,并根据实际环境进行适当调整。在实际应用中,还可以结合其他性能优化手段,进一步提升数据库的整体表现。
🚀 更多数据库干货,欢迎关注【安呀智数据坊】
如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐ 和留言 💬 交流,让我知道你还想了解哪些数据库知识!
📬 想系统学习更多数据库实战案例与技术指南?
-
📊 实战项目分享
-
📚 技术原理讲解
-
🧠 数据库架构思维
-
🛠 工具推荐与实用技巧
立即关注,持续更新中 👇
相关文章:
解锁性能密码:Linux 环境下 Oracle 大页配置全攻略
在 Oracle 数据库运行过程中,内存管理是影响其性能的关键因素之一。大页内存(Large Pages)作为一种优化内存使用的技术,能够显著提升 Oracle 数据库的运行效率。本文将深入介绍大页内存的相关概念,并详细阐述 Oracle 在…...
HashMap中哈希值与数组坐标的关联
目录 1、哈希值的生成与处理 2、计算桶的索引 3、哈希值总结 4、哈希冲突解决方案 4.1. 拉链法(Separate Chaining) 4.2. 开放寻址法(Open Addressing) 1、线性探测(Linear Probing) 2、二次探测&a…...
GBK与UTF-8编码问题(1)
1. 问题现象 我们在编译.py的python代码时,有时会遇到如下图这种问题。提示说“SyntaxError: (unicode error) ‘utf-8’ codec can’t decode byte 0xc4 in position 0: invalid continuation byte”,代码中有中文字符,这似乎和文件的编码方…...
大模型的实践应用41-天气预测与分析决策系统:Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法
大家好,我是微学AI,今天给大家介绍一下大模型的实践应用41-Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法研发天气预测与分析决策系统。本项目构建一个基于大模型Qwen3(32B)、LangChain框架、MCP协议、RAG技术以及传统算法的天气预测与分析决策系统。该系统通…...
单片机学习Day08--相邻流水灯
一,题目:同时点亮相邻的两个灯,并实现流水设计。 亮的是0; 最前面是LED8. #include <REGX51.H> typedef unsigned int u16; typedef unsigned char u8; #define led P2 void delay_10us(u16 t) { while(t--); } void mai…...
邮件营销应对高退信率的策略
一、邮件列表管理 1. 使用专业工具验证 借助如 Geeksend 邮箱验证等专业工具,全面清洗邮件列表,剔除无效、过期或格式错误的邮箱地址,确保邮件精准送达有效收件人,从而降低退信率。 2. 定期清理无效地址 将定期清理邮件列表纳入…...
无线定位之 三 SX1302 网关源码 thread_gps 线程详解
前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...
Kubernetes控制平面组件:Kubelet详解(一):API接口层介绍
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
Java项目层级介绍 java 层级 层次
java 层级 层次 实体层 控制器层 数据连接层 Service : 业务处理类 Repository :数据库访问类 Java项目层级介绍 https://blog.csdn.net/m0_67574906/article/details/145811846 在Java项目中,层级结构(Layered Architecture…...
【操作系统】零拷贝技术
1. DMA技术 DMA技术也就是直接内存访问技术。在进行I/O设备和内存的数据传输的时候,数据传输的工作全部交给DMA控制器,而不是CPU负责。 2. 传统的文件传输 传统的文件传输的代码如下: read(file, tmp_buf, len); write(socket, tmp_buf,…...
从零构建高性能桌面应用:GPUI Component全解析与实战指南
简介 高性能UI组件库正在重塑桌面应用开发的格局,而GPUI Component作为新兴的Rust桌面UI组件库,凭借其卓越的跨平台支持能力、GPU加速渲染和企业级功能特性,正成为构建现代化高性能桌面应用的首选。本文将从零开始,全面解析GPUI Component的核心特性、安装配置流程,并通过…...
java 中 DTO 和 VO 的核心区别
DTO 和 VO 的核心区别 特性DTO(数据传输对象)VO(视图对象)设计目的服务层与外部系统(如前端、其他服务)之间的数据传输为前端展示层定制数据,通常与 UI 强绑定数据内容可能包含业务逻辑需要的字…...
bazel迁移cmake要点及具体迁移工程示例(apollo radar)
文章目录 bazel迁移cmake要点及具体迁移工程示例迁移要点指南依赖库管理proto编译目标库及二进制文件生成项目导出runtime_data软件打包 conti_rardar完整迁移过程common_msgcommoncanbusconti_radar编译 bazel迁移cmake要点及具体迁移工程示例 迁移要点指南 迁移主要的内容包…...
跨时钟域(CDC,clock domain crossing)信号处理
参考视频: 数字IC,FPGA秋招【单bit信号的CDC跨时钟域处理手撕代码合集】_哔哩哔哩_bilibili 一、亚稳态 原因是:建立时间和保持时间没有保持住。然后在下图的红框里面,产生亚稳态。因为电路反馈机制,最后大概率会恢复…...
Java高频面试之并发编程-16
hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶 面试官:volatile 实现原理是什么? volatile 关键字的实现原理 volatile 是 Java 中用于解决多线程环境下变量可见性…...
MyBatis 一对多关联映射在Spring Boot中的XML配置
在Spring Boot中使用MyBatis实现一对多关系时,可以通过XML映射文件来配置。下面我将详细介绍几种实现方式。 基本概念 一对多关系指的是一个实体对象包含多个子对象集合的情况,例如: 一个部门有多个员工一个订单有多个订单项一个博客有多个…...
Spring Boot异步任务失效的8大原因及解决方案
Spring Boot异步任务失效的8大原因及解决方案 摘要:在使用Spring Boot的@Async实现异步任务时,你是否遇到过异步不生效的问题?本文总结了8种常见的异步失效场景,并提供对应的解决方案,帮助你彻底解决异步任务失效的难题。 一、异步失效的常见场景 1. 未启用异步支持 ❌ …...
嵌入式Linux I2C驱动开发详解
文章目录 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 2. I2C的地址寻址机制 二、Linux I2C驱动框架的分层设计 1. I2C核心 2. I2C适配器 3. I2C设备驱动 三、I2C驱动开发测试 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 SDA(数据线) 和…...
基于 Spring Boot 瑞吉外卖系统开发(十二)
基于 Spring Boot 瑞吉外卖系统开发(十二) 菜品删除 单击“批量删除”和“删除”时,会携带需要删除的菜品的id以delete请求方式向“/dish”发送请求。 URLhttp://127.0.0.1:8080/dish调用方法DELETE参数ids DishController添加删除方法 …...
基于 51 单片机的 PWM 电机调速系统实现
51 单片机通过定时器来实现 PWM(脉冲宽度调制)控制,这是一种通过调整方波信号的占空比来控制输出功率的技术。下面详细介绍如何使用 51 单片机实现 PWM 控制并应用于电机调速。 1. PWM 控制原理 PWM 信号是一个周期性的方波,通过调整高电平时间(Ton)与周期(T)的比例(…...
wordpress主题分享
发布于:Eucalyptus-Blog 一、引言 大家对WordPress免费主题都非常感兴趣,但是一般收费的WordPress主题功能才多,其实有很多开源的免费WordPress主题都很不错,对于很多新建站的小伙伴,这些主题完全足够用了。这里就分享…...
【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案
无人机天线拉远RFOF方案通过光纤替代传统射频电缆,实现无人机与地面控制站之间的高保真、低损耗信号传输,尤其适用于高频段(如毫米波)、远距离或复杂电磁环境下的无人机作业场景。 核心应用场景 军事侦察与电子战 隐蔽部署&…...
视觉-语言-动作模型:概念、进展、应用与挑战(下)
25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步,旨在将感知、自然语言理解和具体动作统一在一个计…...
git如何将本地 dev 分支与远程 dev 分支同步
要让本地 dev 分支与远程 dev 分支完全同步(丢弃本地多余的提交记录),可以按照以下步骤操作: 1. 获取远程最新状态 git fetch origin dev # 拉取远程 dev 分支的最新提交,但不会修改本地代码 IDEA中点击fetc…...
自动化测试与功能测试详解
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 什么是自动化测试? 自动化测试是指利用软件测试工具自动实现全部或部分测试,它是软件测试的一个重要组成 部分,能完成许多手工测试无…...
python3数据类型
常见python3数据类型 Number(数字)String(字符串)bool(布尔类型)List(列表)Tuple(元组)Set(集合)Dictionary(字典&#x…...
《Python星球日记》 第66天:序列建模与语言模型
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、传统语言模型1. n-gram 模型基础2. n-gram 模型的局限性 二、RNN 在语言建模…...
CRM和SCRM有什么区别
CRM(客户关系管理)与SCRM(社会化客户关系管理)的主要区别在于沟通方式、客户互动、数据来源和客户参与度。CRM更侧重企业对客户信息的管理与内部流程优化,而SCRM强调客户主动参与,通过社交媒体等平台加强互…...
破解 Qt QProcess 在 Release 模式下的“卡死”之谜
在使用 Qt 的 QProcess 以调用外部 ffmpeg/ffprobe 进行音视频处理时,常见的工作流程是: gatherParams:通过 ffprobe 同步获取媒体文件的参数(分辨率、采样率、声道数、码率等)。 reencode:逐个文件调用 f…...
重学安卓14/15自由窗口freeform企业实战bug-学员作业
背景: 在aosp14版本及以后版本上,安卓的自由窗口部分的工具栏部分都有了较大的更新 工具栏这部分已经移到了SystemUI进程的WMShell进行统一的管理。 但是近来有学员朋友在对自由窗口进行相关的拖拽操作时候,有遇到这个工具栏相关的一个bug&…...
【layout组件 与 路由镶嵌】vue3 后台管理系统
前言 很多同学在第一次搭建后台管理系统时,会遇到一个问题,layout组件该放哪里?如何使用?路由又该如何设计? 这边会讲一下我的思考过程和最后的结果,大家可以参考一下,希望大家看完能有所收获。…...
【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、1路光纤数据收发处理平台
板卡概述 PXIE301-211是一款基于PXIE总线架构的16路并行LVDS数据采集、1路光纤收发处理平台,该板卡采用Xilinx的高性能Kintex 7系列FPGA XC7K325T作为实时处理器,实现各个接口之间的互联。板载1组64位的DDR3 SDRAM用作数据缓存。板卡具有1个FMC…...
linux-进程信号的产生
Linux中的进程信号(signal)是一种用于进程间通信或向进程传递异步事件通知的机制。信号是一种软中断,用于通知进程某个事件的发生,如错误、终止请求、计时器到期等。 1. 信号的基本概念 - 信号(Signal)&am…...
基于 Nexus 在 Dockerfile 配置 yum, conda, pip 仓库的方法和参考
在 Nexus 配置代理仓库的方法,可参考 pypi 的配置博客:https://hellogitlab.com/CI/docker/create_your_nexus_2 更多代理格式,参考官方文档,如 pypi:https://help.sonatype.com/en/pypi-repositories.html 配置 yum…...
精品可编辑PPT | 全面风险管理信息系统项目建设风控一体化标准方案
这份文档是一份全面风险管理信息系统项目建设风控一体化标准方案,涵盖了业务架构、功能方案、系统技术架构设计、项目实施及服务等多个方面的详细内容。方案旨在通过信息化手段提升企业全面风险管理工作水平,促进风险管理落地和内部控制规范化࿰…...
Redis集群安装
Redis集群安装 1.集群介绍 首先要了解,Redis的高可用机制。 2个master节点,挂掉1个,1不过半,则集群宕机,不可用,容错率为0;3个master节点,挂掉1个,2>1,…...
下载知网外文文献全文的方法
知网和一些外文数据库机构是合作关系,因知网没有订购外文文献全文,所以可以搜到外文文献但不能下载全文,基本提供的都是外文文献摘要。本文就实例演示一下获取知网外文文献全文的方法步骤。 例如下面这篇知网外文文献,该文献被收…...
解决IDEA无法运行git的问题
之前git一直没有问题,今天打开就提示我安装git,自然用git去提交新项目也会遇到问题。 我出现问题的原因是:git路径缺失 文件->设置->git 发现git的路径为空,按照实际位置填写即可...
基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档
项目地址:总项目Charliechen114514/CCIMXDesktop: This is a Qt Written Desktop with base GUI Utilities 本子项目地址:CCIMXDesktop/extern_app/pdfReader at main Charliechen114514/CCIMXDesktop 前言 这个部分说的是Mupdf_adaper下的文档的工…...
Ubuntu20.04 搭建Kubernetes 1.28版本集群
环境依赖 以下操作,无特殊说明,所有节点都需要执行 安装 ssh 服务安装 openssh-server复制代码 sudo apt-get install openssh-server修改配置文件复制代码 vim /etc/ssh/sshd_config找到配置项 复制代码 LoginGraceTime 120 PermitRootLogin prohibit-password StrictModes…...
操作系统和数据库账号密码的安全管理、使用,安当SMS凭据管理系统
引言:密码管理困局下的破局之道 在数字化转型的深水区,企业正面临前所未有的密码管理挑战。某跨国制造企业因数据库密码泄露导致核心工艺参数外泄,某三甲医院因运维账号滥用引发百万级医疗数据泄露事件,这些真实案例揭示着传统密…...
Java设计模式之代理模式:从入门到精通(保姆级教程)
1. 代理模式概述 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标对象代码的情况下增加额外的功能。 1.1 专业概念解释 代理模式:为其他对象提供一种代理…...
单片机-STM32部分:13-1、蜂鸣器
飞书文档https://x509p6c8to.feishu.cn/wiki/V8rpwIlYIiEuXLkUljTcXWiKnSc 一、应用场景 大部分的电子产品、家电(风扇、空调、电水壶)都会有蜂鸣器,用于提示设备的工作状态 二、原理 蜂鸣器是一种将电信号转换为声音信号的器件࿰…...
JVM——方法内联
引入 在现代软件开发中,性能优化始终是一个关键课题。随着硬件架构的不断演进,CPU的主频提升逐渐放缓,而软件复杂度却持续增加,这使得编译器优化技术的重要性日益凸显。方法内联(Method Inlining)作为编译…...
C++类成员
一、内联函数(Inline Functions) 作用 解决频繁调用小函数时的栈内存消耗问题,通过将函数代码直接插入调用点,避免压栈/出栈开销。 定义形式 inline 返回类型 函数名(参数列表) { ... }• 隐式声明:类内直接定义的成员…...
SpringBoot校园失物招领信息平台
SpringBoot校园失物招领信息平台 文章目录 SpringBoot校园失物招领信息平台1、技术栈2、项目说明2.1、登录注册2.2、管理员端截图2.3、用户端截图 3、核心代码实现3.1、前端首页3.2、前端招领广场3.3、后端业务处理 1、技术栈 本项目采用前后端分离的架构,前端和后…...
代码随想录算法训练营第三十八天
LeetCode题目: 1143. 最长公共子序列1035. 不相交的线53. 最大子数组和392. 判断子序列2094. 找出 3 位偶数(每日一题) 其他: 今日总结 往期打卡 1143. 最长公共子序列 跳转: 1143. 最长公共子序列 学习: 代码随想录公开讲解 问题: 给定两个字符串 text1 和 text2࿰…...
Nginx stream模块是连接级别的负载均衡
在Nginx的stream模块中,upstream的权重配置实现的是连接级别的负载均衡,这和http模块不同。 当客户端发起一个新的TCP连接时,Nginx根据各upstream的权重值选择其中一个upstream建立连接,之后该连接上的所有数据传输都由这个upstre…...
贝叶斯算法
贝叶斯算法是一类基于贝叶斯定理的机器学习算法,它们在分类任务中表现出色,尤其在处理具有不确定性和 probabilistic 关系的数据时具有独特优势。本文将深入探讨贝叶斯算法的核心原理、主要类型以及实际应用案例,带你领略贝叶斯算法在概率推理…...
计算机网络:CPU与时钟的关系
在计算机中,CPU(中央处理器)与时钟的关系是核心且密不可分的。时钟信号是驱动CPU运行的“心跳”,决定了计算机执行指令的节奏和协调性。以下是两者的关键关系及作用: 1. 时钟信号:CPU的“节拍器” 时钟频率(Clock Speed) CPU的时钟频率(如3.5 GHz)表示每秒的时钟周期…...