bitvec与脏页

摘自:http://sqlite.1065341.n5.nabble.com/Is-performance-of-v3-5-7-improved-with-new-bitvec-td36830.html

位图是一个非常有趣的话题,在SQLite中通过位图记录下,当前脏的页面,方便事务的回滚,当然了,我们已经记录下该结构对于journal的基本使用方式,大家可能不知道,如果事务发生了回滚,就会产生journal文件,那么情况来了,SQLite是如何记录,到底记录什么信息,保存在journal文件当中,

下面我们查看一个简单的讨论:

有一句话目前翻译还是很有意思:

以前采用位图的方式来处理脏页面的技术受限与SQLite的最大控制数量GB范围(10sof GBs),而不是理论值TB,因为SQLite数据库在处理事务的过程中,强制给数据库每1Mb的数据分配256个字节。

原文如下:

(The "old" way of dealing with dirty pages with bitmapslimited SQLite to an approximate maximal capacity of 10s of GBs, as opposed totherical TBs, because it imposed to malloc 256 bytes for every 1Mb of database duringeach transaction)

现在采用bitvec结构体的方式来处理脏页(在SQLite v3.5.7版本中引入),她允许稀疏的位图,并且突破了10s of GBs的限制。

> - The "old" way of dealing with dirty pages with bitmaps limited SQLite 
> to an approximate maximal capacity of 10s of GBs, as opposed to therical 
> TBs, because it imposed to malloc 256 bytes for every 1Mb of database 
> during each transaction. 

> - The "new" way of dealing with dirty pages with a bitvec structure 
> (introduced in SQLite v3.5.7) allows for sparse bitmaps and is then 
> supposed to push away the "10s of GBs" limit.

Just to be clear, the bitvec stuff can greatly reduce memory use for the 
  average-case, but doesn‘t change the worst-case.  If you have a 
  transaction that touches a lot of pages (especially if they‘re spread 
  out in the file) the bitvec can still grow to be quite large.

> Now the questions are: 
> 1) What are the new practical limits with SQLite v3.5.7?

Depends on your environment.  A full-blown desktop with 4GB of RAM is 
  going to have much different practical limits than an iPhone.

It also depends on what you‘re doing.  None of this really matters if 
  you‘re using the database read-only.

> 2) Does somebody have any real-life experience (or home-made tests and 
> figures) on SQLite v3.5.7 and really big tables? (say 100 000 000 lines).

Personally, I‘ve only gotten to about five or six million rows in a 
  ~6GB db.  That was pre-3.5.7 anyways.

> 3) Does the new "bitvec" algorithm really help with such a big table?

The bitvec stuff has nothing directly to do with table size, only the 
  total database size.  That said, if a single table makes up most of a 
  database, it might be easier to dirty a larger number of pages with a 
  single transaction.  I‘m less clear on that aspect, however.

> I am mainly interested in performance of INSERTs

If you mean "speed" when you use the word "performance", the bitvec 
  changes aren‘t likely to have any significant impact unless the old 
  bit-vector was getting so huge it was forcing the VM system to page 
  things out to disk.

-j

时间: 2024-10-15 21:36:18

bitvec与脏页的相关文章

redis存在大量脏页问题的追查记录

case现场 线上发现一台机器内存负载很重,top后发现一个redis进程占了大量的内存,TOP内容如下: 27190 root 20 0 18.6g 18g 600 S 0.3 59.2 926:17.83 redis-server 发现redis占了18.6G的物理内存.由于redis只是用于cache一些程序数据,觉得很不可思议,执行redis的info命令,发现实际数据占用只有112M,如下: # Memory used_memory:118140384 used_memory_huma

MySQL中InnoDB脏页刷新机制Checkpoint

我们知道InnoDB采用Write Ahead Log策略来防止宕机数据丢失,即事务提交时,先写重做日志,再修改内存数据页,这样就产生了脏页.既然有重做日志保证数据持久性,查询时也可以直接从缓冲池页中取数据,那为什么还要刷新脏页到磁盘呢?如果重做日志可以无限增大,同时缓冲池足够大,能够缓存所有数据,那么是不需要将缓冲池中的脏页刷新到磁盘.但是,通常会有以下几个问题: 服务器内存有限,缓冲池不够用,无法缓存全部数据 重做日志无限增大成本要求太高 宕机时如果重做全部日志恢复时间过长 事实上,当数据库

InnoDB脏页刷新机制Checkpoint

我们知道InnoDB采用Write Ahead Log策略来防止宕机数据丢失,即事务提交时,先写重做日志,再修改内存数据页,这样就产生了脏页.既然有重做日志保证数据持久性,查询时也可以直接从缓冲池页中取数据,那为什么还要刷新脏页到磁盘呢?如果重做日志可以无限增大,同时缓冲池足够大,能够缓存所有数据,那么是不需要将缓冲池中的脏页刷新到磁盘.但是,通常会有以下几个问题: 服务器内存有限,缓冲池不够用,无法缓存全部数据 重做日志无限增大成本要求太高 宕机时如果重做全部日志恢复时间过长 事实上,当数据库

linux中的脏页写回

为了减轻内存使用的压力,除了用户手动写回脏页以外,还有一些机制触发脏页写回. 比方说设置定时器,定期写回脏了很久的页. 具体介绍下面的写回机制,因为这种机制不像写回脏了很久的页的机制那样被动. wakeu_bdflush 复杂唤醒写回的核心函数. 能触发此函数条件,可能会是以下几点中的一点会多: 1.用户态进程调用sync强制写回 2.grow_buffers()分配一个新的缓冲区页失败时 .此时的页中缓冲区块大小与要求的不同,因此要释放掉. 3.页框回收算法调用free_more_memoy(

InnoDB Redo Flush及脏页刷新机制深入分析

概要: 我们知道InnoDB采用Write Ahead Log策略来防止宕机数据丢失,即事务提交时,先写重做日志,再修改内存数据页,这样就产生了脏页.既然有重做日志保证数据持久性,查询时也可以直接从缓冲池页中取数据,那为什么还要刷新脏页到磁盘呢?如果重做日志可以无限增大,同时缓冲池足够大,能够缓存所有数据,那么是不需要将缓冲池中的脏页刷新到磁盘.但是,通常会有以下几个问题: 服务器内存有限,缓冲池不够用,无法缓存全部数据 重做日志无限增大成本要求太高 宕机时如果重做全部日志恢复时间过长 事实上,

Mysql的刷脏页问题

平时的工作中,不知道你有没有遇到过这样的场景,一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短. 当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”.内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”. 平时执行很快的更新操作,其实就是在写内存和日志,而 MySQL 偶尔“抖”一下的那个瞬间,可能就是在刷脏页(flush). 那么,什么情况会引发数据库的 flush

脏页flush和收缩表空间

mysql脏页 由于WAL机制,InnoDB在更新语句的时候,制作了写日志这一个磁盘操作,就是redo log,在内存写完redo log后,就返回给客户端, 即更新成功. 把内存里的数据写入磁盘的过程,术语就是flush,在flush之前,实际数据和数据库中的数据是不一致的,因为在redo log基础上更新了还未写入,数据库是老的,当内存数据页跟磁盘数据页内容不一致的时候,称这个内存页为脏页,内存写入后就一致了,称为干净页, 如果mysql偶尔运行速度很慢,很可能是在刷脏页.引发数据库flus

Linux内核分析:页回收导致的cpu load瞬间飙高的问题分析与思考--------------蘑菇街技术博客

http://mogu.io/156-156 摘要 本文一是为了讨论在Linux系统出现问题时我们能够借助哪些工具去协助分析,二是讨论出现问题时大致的可能点以及思路,三是希望能给应用层开发团队介绍一些Linux内核机制从而选择更合适的使用策略. 前言 搜索团队的服务器前段时间频繁出现CPU load很高(比如load average达到80多)的情况,正所谓术业有专攻,搜索的兄弟们对Linux底层技术理解的不是很深入,所以这个问题困扰了他们一段时间. 相信我们在遇到问题时都有类似的经历,如果这个

Linux页高速缓存与回写机制分析

参考 <Linux内核设计与实现> ******************************************* 页高速缓存是linux内核实现的一种主要磁盘缓存,它主要用来减少对磁盘的IO操作,具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问.为什么要这么做呢?一,速度:二临时局部原理.有关这两个概念,相信熟悉操作系统的我们不会太陌生.页高速缓存是由RAM中的物理页组成的,缓存中的每一页都对应着磁盘中的多个块.每当内核开始执行一个页IO操作时,就先