缓冲池由多个缓冲区组成。
而一个缓冲区由两部分组成:一部分是用来标识该缓冲器和用于管理的缓冲首部,另一部分是用于存放数据的缓冲体。这两部分有一一对应的映射关系。对缓冲池的管理是通过对每一个缓冲器的缓冲首部进行 *** 作实现的。
缓冲首部包括设备号、设备上的数据块号(块设备时)、互斥标识位以及缓冲队列连接指针和缓冲器号等。
系统把各缓冲区按其使用状况连成三种队列:
(1) 空白缓冲队列em,其队首指针为F(em),队尾指针为L(em);
(2) 装满输入数据的输入缓冲队列in,其队首指针为F(in),队尾指针为L(in);
(3) 装满输出数据的输出缓冲队列out,其队首指针为F(out),队尾指针为L(out)。
另外,在缓冲池中还具有四种工作缓冲区:
(1) 用于收容输入数据的工作缓冲区(hin);
(2) 用于提取输入数据的工作缓冲区(sin);
(3) 用于收容输出数据的工作缓冲区(hout);
(4) 用于提取输出数据的工作缓冲区(sout)。 可见,缓冲区工作在收容输入、提取输入、收容输出和提取输出四种工作方式如下:
对缓冲池的管理由如下几个 *** 作组成:
(1)从三种缓冲区队列中按一定的选取规则取出一个缓冲区的过程take_buf(type)
(2)把缓冲区按一定的选取规则插入相应的缓冲区队列的过程add_buf(type,number);
(3)供进程申请缓冲区用的过程get_buf(type,number)
(4)供进程将缓冲区放入相应缓冲区队列的过程put_buf(type,work_buf)。
其中,参数type表示缓冲队列类型,number为缓冲区号,而work_buf则表示工作缓冲区类型。 使用这几个 *** 作,缓冲池的工作过程可描述如下:
首先,输入进程调用get_uf(em,number)过程从空白缓冲区队列中取出一个缓冲号为number的空白缓冲区,将其作为收容输入缓冲区hin,当hin中装满了由输入设备输入的数据之后,系统调用过程put_buf(in,hin)将该缓冲区插入输入缓冲区队列in中。
另外,当进程需要输出数据数据时,输出进程经过缓冲管理程序调用过程get_buf(em,number)从空白缓冲区队列中取出一个空白缓冲区number作为收容输出缓冲区hout,待hout中装满输出数据之后,系统再调用过程Put_buf(out,hout)将该缓冲区插入输出缓冲区队列out.
对缓冲区的输入数据和输出数据的提取也是由过程get_buf和put_buf实现的。get_buf(out,number)从输出缓冲队列中取出装满输出数据的缓冲区number,将其作为sout。当sout中数据输出完毕时,系统调用过程put_buf(em,sout)将该缓冲区插入空白缓冲队列。而get_buf(in,number)则从输入缓冲队列中取出一个装满输入数据的缓冲区number作为输入缓冲区sin,当CPU从中提取完所需数据之后,系统调用过程put_buf(em,sin)将该缓冲区释放和插入空白缓冲队列em中。
我知道楼主的问题已经解决了,但是为了以后的人,我分享下我的(mysql+myeclipse)。我刚刚也是遇到这问题,网上说的那个方法是适用于... was XXX milliseconds ago,是有时间的,XXX如果是0,一般是有地方写错了。检查下URL是否写错了,比如把localhost:3306写成localhost:8080或localhost,数据库名是testdb写成test,jar包导入是否有错等等,认真检查下就可以了。innodb_buffer_pool_instances 参数,将 buffer pool 分成几个区,每个区用独立的锁保护,这样就减少了访问 buffer pool 时需要上锁的粒度,以提高性能。准备一个空数据库,在这里我们将 performance_schema_events_waits_history_long_size 调大,是为了让之后实验数据能采集的更多,在此不多做介绍。使用 sysbench,准备一些数据,
对数据进行预热 60s,可以看到预热期间的性能会不太稳定,预热后会比较稳定,
设置 performance_schema,这次我们将仅开启观察项(生产者)hash_table_locks,并开启 waits 相关收集端(消费者)。(相关介绍参看 实验 03)
为什么我们知道观察项应该选择 hash_table_locks?在 performance_schema.setup_instruments 表中,列出了所有观察项,但我们很难从中选出我们应观察哪个观察项。这时候,可以将所有观察项都启用,然后设计一些对比实验,比如使用几种不同的 SQL,观察这些 *** 作影响了哪些观察项,找到共性或者区。还有一种高效的方式是搜索别人的经验,或者阅读 MySQL 源码。本例中 hash_table_locks 隐藏的比较深,使用了阅读 MySQL 源码和对比试验结合的方法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)