mysql学习记录(二十)--MysqlServer参数调整_MySQL
一、理论:
1.内存优化原则:
a.将尽量多的内存分配给mysql做缓存,但要给操作系统和其他程序预留足够的内存,否则将产生SWAP页交换,影响自身性能
b.MyISAM的数据文件读取依赖于操作系统自身的IO缓存,因此,如果有MyISAM表,就要预留更多的内存给操作系统做IO缓存
c.排序区、连接区等缓存是分配给每个数据库会话专用的,其默认值的设置要根据最大连接数合理分配。不能设置太大否则在并发连接较高时会导致物理内存耗尽
2.MyISAM内存优化:
a.key_buffer_size决定MyISAM索引块缓存区的大小,它直接影响MyISAM表的存取效率。可以在mysql参数文件中设置key_buffer_size的值,对于一般MyISAM的数据库建议至少将1/4可用内存分配给key_buffer_size
key buffer使用率计算公式如下:
1 - ( (key_blocks_unused * key_cache_block_size) / key_buffer_size )
在80%左右合适。大于80%将因索引缓存不足导致性能下降,小于80%会导致内存浪费
b.使用多个索引缓存:
1)mysql通过各session共享key buffer提高了MyISAM索引存取的性能,但它并不能消除session间key buffer间的竞争。
3.调整LRU策略:
a.通过调节key_cache_division_limit来控制多大比例的缓存用做warm子表。
在最后:
N * key_cache_age_threshold / 100次缓存命准内未被访问过,就会被降级到warm子表
b.调整read_buffer_size和read_md_buffer_size
c.如带用order by子句,可以适当增大read_rnd_buffer_size的值。但read_rnd_buffer_size的值也是按session分配的
4.InnoDB内存优化:
a.InnoDB用一块内存区做IO缓存池,该缓存池不仅用来缓存InnoDB的索引块,而且也用来缓存InnoDB的数据块。与MyISAM不同
b.在内部,InnoDB缓存池逻辑上由free list、flush list、LRU list组成。顾名思义,free list是空闲缓存块列表,flush list是需要缓新到磁盘的缓存块列表,而LRU list是InnoDB正在使用的缓存块,它是InnoDB buffer pool的核心。
InnoDB使用LRU算法与MyISAM的‘中点插入策略’LRU算法类似。
脏页的刷新
c.可以通过调整InnoDB buffer pool的大小,改变young sublist和old sublist的分配比例、控制脏缓存的刷新活动、使用多个InnoDB缓存池等方法来优化InnoDB的性能
5.innodb_buffer_pool_size的设置:
a.innodb_buffer_pool_size决定InnoDB存储引擎表数据和索引数据的最大缓存区大小。innodb buffer pool同时为数据块和索引块提供数据缓存,若innodb_buffer_pool_size值越大,缓存命中率越高,访问InnoDB表需要的磁盘I/O就越少,性能也就越高。
可以通过:
mysqladmin -S /tmp/mysql.sock ext | grep -i innodb_buffer_pool
查看buffer pool的使用情况
可用以下公式InnoDB缓存池的命中率:
( 1- innodb_buffer_pool_reads/innodb_buffer_pool_read_request) * 100
若太低则应该扩充内存、增加innodb_buffer_pool_size的值
6.调整innodb_old_blocks_time的设置:
a.innodb_old_blocks_time参数决定了缓存数据块由old sublist转移到young sublist的快慢,当一个缓存数据块被插入到midpoint(old sublist)后,至少要在old sublist停留超过innodb_old_blocks_time(ms)后,才有可能被转移到new sublist.
可以根据InnoDB Monitor的输出信息来调整innodb_old_blocks_time的值,在进行表扫描时,如果non-youngs/s很低,young/s很高,就应考虑将innodb_old_blocks_time适当调大,以防止表扫描将真正的热数据淘汰,此值可以进行动态设置
7.调整缓存池数量,减少内部对缓存池数据结构的争用:
a.InnoDB的缓存系统引入了innodb_buffer_pool_instances配置参数。对于较大的缓存池,适当增大此参数的值,可以降低并发导致的内部缓存访问冲突,改善性能。InnoDB缓存系统会将参数innodb_buffer_pool_size指定大小的缓存平分为innodb_buffer_pool_instances个buffer pool.
8.控制innodb buffer刷新,延长数据缓存时间,减缓磁盘I/O
a.innodb buffer pool的刷新快慢主要取决于两个参数
1)innodb_max_dirty_pages_pct:控制缓存池中脏页的最大比例,默认值是75%,如果脏页的数量达到或超过该值,innoDB后台线程将开台缓存刷新
2)innodb_io_capacity:在某种程度上代表磁盘中每秒可完成的I/O次数,对于转速较低的磁盘,可将innodb_io_capacity降低。对于固态磁盘和由多个磁盘组成的阵列,innodb_io_capacity的值可适当增大
3)如无法增大缓存池,应将innodb_max_dirty_pages_pct的值调小,将innodb_io_capactity的值提高,以加快脏页的刷新
9.InnoDB doublewrite:
a.在做恢复时,如果发现不一致的页,InnoDB会用系统表空间double buffer区的相应副本来恢复数据页
b.由于同步到doublewrite buffer是对连续磁盘空间的顺序写,因此开启双写对性能的影响并不太大。对需要高性能并且可以容忍丢失数据的应用,可将innodb_doublewrite=0来关闭双写以满足性能
10.调整用户服务线程排序缓存区:
a.若查看show global status看到sort_merge_passes的值很大,则可以调整参数sort_buffer_size的值来调整排序缓存区,以改善order by子句或group子句的sql性能
b.可通过调整join_buffer_size的值来改善没使用索引的查询
c.最好的策略是设置较小的全局join_buffer_size,对较复杂的操作session单独设置join_buffer_size
11.InnoDB log机制及优化:
a.innodb_flush_log_at_trx_commit的设置:
0:每秒触发一次,可满足持久化要求(效率最高,但最不安全)
1:每个事务提交时立刻将缓存中的redo日志回写到日志文件,并调用操作系统fsync刷新IO缓存(默认值,效率最低,但最安全)
2:每个事务提交时,InnoDB立刻将redo日志回写到日志文件,但并不马上调用fsync来刷新IO缓存,而是每秒只做一次磁盘IO缓存刷新操作(性能和数据安全性都在中间)
12.设置log file size,控制检查点:
a.可以通过一些方法计算innodb每小时产生的日志量并估计合适的innodb_log_file_size值
13.调整innodb_log_buffer_size:
a.可以通过增大innodb_log_buffer_size来减少日志写磁盘操作,从而提高事务处理的性能
14.调整max_connections,提高并发连接:
a.max_connections控制允许连接到mysql数据库的最大数量,默认值是151
15.调整back_log:
a.如果需要数据库在较短时间内处理大量连接请求,可适当增大back_log的值
16.调整table_open_cache:
a.在未执行flush tables命令的情况下,如果mysql状态变量opened_tables的值较大,就说明table_open_cache设置的太小,应适当增大
17.调整thread_cache_size:
a.可以通过计算cache的失败率threads_created/connections来衡量thread_cached_size的值是否合适。此值越接近1,说明线程cache命中率越低,应考虑适当增加thread_cache_size的值
18.innodb_lock_wait_timeout的设置:
a.innodb_lock_wait_timeout可以控制innodb事务等待行锁的时间,默认值是50ms.
b.对于需要快速反馈的交互式OLTP应用,可以将行锁等待超时时间调小,以避免事务长时间挂起
c.对于后台运行的批处理操作,可以将行锁等待超时时间调大,以避免发生大的回滚操作
二、实践:
mysql> use sakila; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show engine innodb status \G; *************************** 1. row *************************** Type: InnoDB Name: Status: ===================================== 151102 7:13:01 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 15 seconds ----------------- BACKGROUND THREAD ----------------- srv_master_thread loops: 113 1_second, 113 sleeps, 7 10_second, 47 background, 47 flush srv_master_thread log flush and writes: 113 ---------- SEMAPHORES ---------- OS WAIT ARRAY INFO: reservation count 18, signal count 18 Mutex spin waits 8, rounds 240, OS waits 7 RW-shared spins 11, rounds 330, OS waits 11 RW-excl spins 0, rounds 0, OS waits 0 Spin rounds per wait: 30.00 mutex, 30.00 RW-shared, 0.00 RW-excl ------------ TRANSACTIONS ------------ Trx id counter B0A Purge done for trx's n:o < 920 undo n:o < 0 History list length 103 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 0, not started MySQL thread id 28, OS thread handle 0x7f5dbdfe6700, query id 568 localhost root show engine innodb status -------- FILE I/O -------- I/O thread 0 state: waiting for i/o request (insert buffer thread) I/O thread 1 state: waiting for i/o request (log thread) I/O thread 2 state: waiting for i/o request (read thread) I/O thread 3 state: waiting for i/o request (read thread) I/O thread 4 state: waiting for i/o request (read thread) I/O thread 5 state: waiting for i/o request (read thread) I/O thread 6 state: waiting for i/o request (write thread) I/O thread 7 state: waiting for i/o request (write thread) I/O thread 8 state: waiting for i/o request (write thread) I/O thread 9 state: waiting for i/o request (write thread) Pending normal aio reads: 0 [0, 0, 0, 0] , aio writes: 0 [0, 0, 0, 0] , ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0 Pending flushes (fsync) log: 0; buffer pool: 0 586 OS file reads, 55 OS file writes, 48 OS fsyncs 0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s ------------------------------------- INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------- Ibuf: size 1, free list len 0, seg size 2, 0 merges merged operations: insert 0, delete mark 0, delete 0 discarded operations: insert 0, delete mark 0, delete 0 Hash table size 553229, node heap has 1 buffer(s) 0.00 hash searches/s, 0.00 non-hash searches/s --- LOG --- Log sequence number 13476957 Log flushed up to 13476957 Last checkpoint at 13476957 0 pending log writes, 0 pending chkp writes 32 log i/o's done, 0.00 log i/o's/second ---------------------- BUFFER POOL AND MEMORY ---------------------- Total memory allocated 274726912; in additional pool allocated 0 Dictionary memory allocated 182244 Buffer pool size 16383 Free buffers 15829 Database pages 553 Old database pages 224 Modified db pages 0 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages made young 0, not young 0 0.00 youngs/s, 0.00 non-youngs/s Pages read 553, created 0, written 27 0.00 reads/s, 0.00 creates/s, 0.00 writes/s No buffer pool page gets since the last printout Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s LRU len: 553, unzip_LRU len: 0 I/O sum[0]:cur[0], unzip sum[0]:cur[0] -------------- ROW OPERATIONS -------------- 0 queries inside InnoDB, 0 queries in queue 1 read views open inside InnoDB Main thread process no. 62305, id 140040552920832, state: waiting for server activity Number of rows inserted 5, updated 0, deleted 0, read 12 0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s ---------------------------- END OF INNODB MONITOR OUTPUT ============================ 1 row in set (0.00 sec) ERROR: No query specified mysql> set global hot_cache.key_buffer_size = 128* 1024; Query OK, 0 rows affected (0.00 sec) mysql> set global hot_cache.key_buffer_size = 0; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'key_buffer_size'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | key_buffer_size | 33554432 | +-----------------+----------+ 1 row in set (0.00 sec) mysql> set global key_buffer_size = 0; ERROR 1438 (HY000): Cannot drop default keycache mysql> show warnings; +-------+------+------------------------------+ | Level | Code | Message | +-------+------+------------------------------+ | Error | 1438 | Cannot drop default keycache | +-------+------+------------------------------+ 1 row in set (0.00 sec) mysql> cache index sales,sales2 in hot_cache; +---------------+--------------------+----------+-------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------+--------------------+----------+-------------------------------------+ | sakila.sales | assign_to_keycache | Error | Table 'sakila.sales' doesn't exist | | sakila.sales | assign_to_keycache | status | Operation failed | | sakila.sales2 | assign_to_keycache | Error | Table 'sakila.sales2' doesn't exist | | sakila.sales2 | assign_to_keycache | status | Operation failed | +---------------+--------------------+----------+-------------------------------------+ 4 rows in set (0.00 sec) mysql> set global key_cache_division_limit = 70; Query OK, 0 rows affected (0.00 sec) mysql> set global hot_cache.key_cache_division_limit = 70; Query OK, 0 rows affected (0.00 sec) mysql> show global variables like '%innodb_old_blocks_pct%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_old_blocks_pct | 37 | +-----------------------+-------+ 1 row in set (0.01 sec) mysql> show global variables like '%doublewrirte%'; Empty set (0.00 sec) mysql> show global variables like '%doublewrite%'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | innodb_doublewrite | ON | +--------------------+-------+ 1 row in set (0.01 sec) mysql> select @a1 := variable_value as a1; ERROR 1054 (42S22): Unknown column 'variable_value' in 'field list' mysql> select @a1 := variable_value as a1 -> from information_schema.global_status -> where variable_name = 'innodb_os_log_written' -> union all -> select sleep(60) -> union all -> select @a2 := variable_value as a2 -> from information_schema.global_status -> where variable_name = 'innodb_os_log_written'; +------+ | a1 | +------+ | 9216 | | 0 | | 9216 | +------+ 3 rows in set (1 min 0.02 sec) mysql> select round((@a2-@a1)/1024/1024 / @@innodb_log_files_in_group) as MB; +------+ | MB | +------+ | 0 | +------+ 1 row in set (0.01 sec)

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP5.4 버전의 새로운 기능: 호출 가능 유형 힌트 매개변수를 사용하여 호출 가능 함수 또는 메소드를 허용하는 방법 소개: PHP5.4 버전에는 매우 편리한 새 기능이 도입되었습니다. 호출 가능 유형 힌트 매개변수를 사용하여 호출 가능 함수 또는 메소드를 허용할 수 있습니다. 이 새로운 기능을 사용하면 함수와 메서드가 추가 확인 및 변환 없이 해당 호출 가능 매개변수를 직접 지정할 수 있습니다. 이 기사에서는 호출 가능 유형 힌트의 사용을 소개하고 몇 가지 코드 예제를 제공합니다.

제품 매개변수는 제품 속성의 의미를 나타냅니다. 예를 들어 의류 매개변수에는 브랜드, 소재, 모델, 크기, 스타일, 직물, 적용 그룹, 색상 등이 포함됩니다. 식품 매개변수에는 브랜드, 중량, 재료, 건강 허가 번호, 적용 그룹, 색상 등이 포함됩니다. 브랜드, 크기, 색상, 원산지, 적용 가능한 전압, 신호, 인터페이스 및 전원 등이 포함됩니다.

개발 과정에서 다음과 같은 오류 메시지가 나타날 수 있습니다: PHPWarning: in_array()expectsparameter. 이 오류 메시지는 in_array() 함수를 사용할 때 나타나는데, 이는 함수의 잘못된 매개변수 전달로 인해 발생할 수 있습니다. 이 오류 메시지에 대한 해결 방법을 살펴보겠습니다. 먼저 in_array() 함수의 역할을 명확히 해야 합니다. 즉, 배열에 값이 존재하는지 확인해야 합니다. 이 함수의 프로토타입은 다음과 같습니다: in_a

i9-12900H는 14코어 프로세서로, 사용된 아키텍처와 기술이 모두 새롭고, 전반적인 작업이 매우 뛰어나며, 특히 포괄적이며 사용자에게 뛰어난 경험을 제공할 수 있습니다. . i9-12900H 매개변수 평가 검토: 1. i9-12900H는 14코어 프로세서로, q1 아키텍처와 24576kb 프로세스 기술을 채택하고 20스레드로 업그레이드되었습니다. 2. 최대 CPU 주파수는 1.80!5.00ghz이며 주로 작업량에 따라 다릅니다. 3. 가격에 비해 가격 대비 성능이 매우 적합하며 정상적인 사용이 필요한 일부 파트너에게 매우 적합합니다. i9-12900H 매개변수 평가 및 성능 벤치마크

C++ 매개변수 유형 안전성 검사는 함수가 컴파일 시간 검사, 런타임 검사 및 정적 어설션을 통해 예상된 유형의 값만 허용하도록 보장하여 예기치 않은 동작 및 프로그램 충돌을 방지합니다. 컴파일 시간 유형 검사: 컴파일러가 유형 호환성을 검사합니다. 런타임 유형 검사: 동적_캐스트를 사용하여 유형 호환성을 확인하고 일치하는 항목이 없으면 예외를 발생시킵니다. 정적 어설션: 컴파일 타임에 유형 조건을 어설션합니다.

쌍곡선 함수는 원 대신 쌍곡선을 사용하여 정의되며 일반 삼각 함수와 동일합니다. 제공된 각도(라디안)에서 쌍곡사인 함수의 비율 매개변수를 반환합니다. 그러나 반대로 하십시오. 즉, 반대로 하십시오. 쌍곡선 사인으로부터 각도를 계산하려면 쌍곡선 역사인 연산과 같은 역쌍곡선 삼각법 연산이 필요합니다. 이 과정에서는 라디안 단위의 쌍곡선 사인 값을 사용하여 각도를 계산하기 위해 C++에서 쌍곡선 역사인(asinh) 함수를 사용하는 방법을 보여줍니다. 쌍곡선 아크사인 연산은 다음 공식 -$$\mathrm{sinh^{-1}x\:=\:In(x\:+\:\sqrt{x^2\:+\:1})}을 따릅니다. 여기서\:In\:은\:자연 로그\:(log_e\:k)

LLM(Large Language Model)은 강력한 성능을 갖고 있지만 매개변수의 수는 쉽게 수백억, 수천억에 달할 수 있고 컴퓨팅 장비와 메모리에 대한 수요도 일반 기업이 감당할 수 없을 만큼 크다. 양자화는 모델 가중치의 정확도(예: 32비트를 8비트로)를 줄여 추론 속도를 높이고 메모리 요구 사항을 줄이는 대신 일부 모델 성능을 희생하는 일반적인 압축 작업입니다. 그러나 1,000억 개 이상의 매개변수가 있는 LLM의 경우 기존 압축 방법으로는 모델의 정확성을 유지할 수 없으며 하드웨어에서 효율적으로 실행할 수도 없습니다. 최근 MIT와 NVIDIA의 연구원들은 범용 사후 훈련 양자화(GPQ)를 공동으로 제안했습니다.

C++ 함수의 참조 매개변수(기본적으로 변수 별칭, 참조를 수정하면 원래 변수가 수정됨)와 포인터 매개변수(원래 변수의 메모리 주소 저장, 포인터 역참조를 통해 변수 수정)는 변수를 전달하고 수정할 때 사용법이 다릅니다. 참조 매개변수는 생성자나 할당 연산자에 전달될 때 복사 오버헤드를 피하기 위해 원래 변수(특히 대규모 구조)를 수정하는 데 자주 사용됩니다. 포인터 매개변수는 메모리 위치를 유연하게 가리키거나, 동적 데이터 구조를 구현하거나, 선택적 매개변수를 나타내기 위해 널 포인터를 전달하는 데 사용됩니다.
