几个日志输出的解释

我们通过源代码,找到下面一段,该段实现了上述日志的输出。

if ((my_now – rli->mts_last_online_stat)>=

mts_online_stat_period)

{

sql_print_information(“Multi-threadedslave statistics%s: “

“seconds elapsed = %lu; “

“events assigned = %llu; “

“worker queues filled over overrun level = %lu;”

“waited due a Worker queue full = %lu; “

“waited due the total size = %lu; “

“waited at clock conflicts = %llu “

“waited(count) when Workers occupied = %lu “

“waited when Workers occupied = %llu”,

rli->get_for_channel_str(),

static_cast<unsignedlong>

(my_now – rli->mts_last_online_stat),

rli->mts_events_assigned,

rli->mts_wq_overrun_cnt,

rli->mts_wq_overfill_cnt,

rli->wq_size_waits_cnt,

rli->mts_total_wait_overlap,

rli->mts_wq_no_underrun_cnt,

rli->mts_total_wait_worker_avail);

rli->mts_last_online_stat=my_now;

通过这一句(my_now – rli->mts_last_online_stat),  以及最后一句rli->mts_last_online_stat=my_now;   可以得知, seconds elapsed 就是上一次统计跟这一次统计的时间间隔。

而mts_online_stat_period =120秒,硬代码,因此就是几乎每隔120秒,就有上述日志的输出。 通过进一步查看原代码,初步了解上述日志信息的含义,如下:

events assigned:总共有多少个event被分配执行,计的是总数。

worker queues filled over overrun level:多线程同步中,worker 的私有队列长度超长的次数,计的是总数。

waited due a Worker queue full :因为worker的队列超长而产生等待的次数,计的是总数。

waited due the total size :超过最大size的次数,这个由参数slave_pending_jobs_size_max  指定。

waited at clock conflicts :因为逻辑时间产生冲突的等待时间,单位是纳秒。

waited (count) when Workers occupied :因为workder被占用而出现等待的次数。(总计值)。

waited when Workersoccupied :因为workder被占用而出现等待的总时间,总计值,单位是纳秒。

第三种:page_cleaner线程的输出日志

如图,信息如下:

2016-03-24T17:45:28.005117Z 0 [Note] InnoDB:page_cleaner: 1000ms intended loop took 4750ms.The settings might not beoptimal. (flushed=1519 and evicted=0, during the time.)

查找源代码,发现是上面的日志由下面一段代码输出:

if (ret_sleep == OS_SYNC_TIME_EXCEEDED) {

ulint   curr_time = ut_time_ms();

if (curr_time >next_loop_time + 3000) {

if (warn_count == 0) {

ib::info() << “page_cleaner: 1000ms”

” intended loop took “

<<1000 + curr_time

– next_loop_time

<<“ms. The settings might not”

” be optimal. (flushed=”

<<n_flushed_last

<<” and evicted=”

<<n_evicted

<<“, during the time.)”;

if (warn_interval >300) {

warn_interval= 600;

}else {

warn_interval*= 2;

}

warn_count= warn_interval;

} else {

–warn_count;

}

} else {

/* reset counter */

warn_interval= 1;

warn_count= 0;

}

next_loop_time= curr_time + 1000;

n_flushed_last= n_evicted = 0;

}

通过分析源代码, 输出上述日志的条件是curr_time> next_loop_time + 3000 ,即比原定的循环时间next_loop_time多3000毫秒,而next_loop_time的标准时间是1000毫秒,即1秒钟做一次刷新页的操作。

loop took 4750ms ,即是这次刷新循环的实际经历时间。

后面还有一个(flushed=1519 and evicted=0,during the time.)这样的日志,即对应n_flushed_last与n_evicted 变量,而这两个变量又由n_flushed_list与n_flushed_lru赋值。

./storage/innobase/buf/:3322:                 n_flushed_last +=n_flushed_list;

./storage/innobase/buf/:3321:                 n_evicted += n_flushed_lru;

而n_flushed_list与n_flushed_lru赋值函数为pc_wait_finished,如下,我们来看看该函数的注释。

pc_wait_finished(&n_flushed_lru,&n_flushed_list);

/**

Wait until all flush requests are finished.

@param n_flushed_lru    numberof pages flushed from the end of the LRU list.

@param n_flushed_list   numberof pages flushed from the end of the

flush_list.

@return         trueif all flush_list flushing batch were success. */

static

bool

pc_wait_finished(

ulint*  n_flushed_lru,

ulint*  n_flushed_list)

{

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

}

通过源代码的注释,我们获知如下信息:

n_flushed_lru   number of pages flushed from the end of the LRU list.

n_flushed_lru  这个值表示从lru 列表尾部刷新的页数,也就是日志中如evicted=0 指标的所表示的值,如果该值不为零,则存在innodb buffer不够的嫌疑。

n_flushed_list  这个是从刷新列表中刷新的页数,也就是脏页数,也就是日志中flushed=1519 的值。

原文地址:https://www.cnblogs.com/DataArt/p/10232379.html

时间: 2024-10-10 15:01:52

几个日志输出的解释的相关文章

Log4j将不同Package的日志输出到不同的文件

转自:http://www.crazyant.net/1931.html 随着项目规模的越来越大,会不断的引入新的模块,不同的模块都会打印自己的日志,最后就造成日志根本没法查看,比如我自己的项目中,就存在以下这些日志: 接收外界消息的日志.对外发送消息的日志: 后台常驻线程的处理日志: 外部接口访问的参数.返回结果等接口日志: Service访问数据库产生的SQL日志: 这其中,消息日志和后台线程的日志数据量非常庞大,如果所有日志打印在一个文件中,使用tail -f log.log文件,会发现日

HAproxy增加日志记录功能和自定义日志输出内容、格式

一.增加haproxy日志记录功能 1.1 由于数据分析的需要,我们必须打开haproxy日志,记录相关信息. 在配置前,我们先来了解一下日志的level:local0-local7 16-23保留为本地使用 emerg 0 系统不可用     alert 1 必须马上采取行动的事件     crit 2 关键的事件     err 3 错误事件     warning 4 警告事件     notice 5 普通但重要的事件     info 6 有用的信息     debug 7 调试信息

Haproxy安装配置及日志输出问题

简介:软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载.    HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器.内部协议通信服务器等),和7层(HTTP).在4层模式 下,HAproxy仅在客户端和服务器之间转发双向流量.7层模式下,HAProxy会分析协议,并且能通过允许.拒绝.交换.增加.修改或者删除请求 (r

log4j(五)——如何控制不同目的地的日志输出?

一:测试环境与log4j(一)--为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 import org.apache.log4j.*; import java.io.*; public class UseLog4j { //日志记录器 private static Logger LOGGER = LogManager.getLogger(UseLog4j.class); //程序入口--主函数 public static void main(String[]a

python日志输出

import logging logger = logging.getLogger()  #生成一个日志对象,()内为日志对象的名字,可以不带,名字不给定就是root handler=logging.FileHandler("Log_test.txt")  #生成一个handler(处理器), #formatter 下面代码指定日志的输出格式 fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s' f

日志输出--C#

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; //添加引用,并导入命名空间 using System.Management; using System.Net.NetworkInformation; using System.IO; //日志输出类 public void SWriter(string ipname) { stri

如何快速的把日志输出到磁盘上

不管是做客户端业务,还是做服务端业务,日志子系统都是非常重要的一个组件. 日志系统的输出目的地可以是disk,也可以是tty,更可以是network. 我的日志系统可以输出到tty,不同log level可以有不同的color,这样看日志非常的醒目,当然这里着重谈的是如何快速的把log内容写到磁盘上. 其实,如何快速的把log内容写到磁盘上,网上文章已经汗牛充栋,真正高质量的没多少,本篇可能也是狗尾续貂之作.不过,我的log子系统能够达到106M/s的输出速率. 详细介绍我的log系统之前,推荐

Python之向日志输出中添加上下文信息

除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如:远程客户端的IP地址和用户名.这里我们来介绍以下几种实现方式: 通过向日志记录函数传递一个extra参数引入上下文信息 使用LoggerAdapters引入上下文信息 使用Filters引入上下文信息 一.通过向日志记录函数传递一个extra参数引入上下文信息 前面我们提到过,可以通过向日志记录函数传递一个extra参数来实现向日志输出

log4j日志输出到web项目指定文件夹

感谢 eric2500 的这篇文章:http://www.cxyclub.cn/n/27860/ 摘要:尝试将log4j的文件日志输出到web工程制定目录,遇到了很多问题,最终在eric2500的指导下搞定,下面是记录. 其原理在于log4j的配置文件支持服务器的vm的环境变量,如${oss.log4j.path},在log4j加载配置文件之前,先用 System.setProperty("","")设置好日志文件路径,这一操作通过一个初始的servlet来实现.