乐于分享
好东西不私藏

RDMA与RDMA perftest源码介绍

RDMA与RDMA perftest源码介绍

最近在工作中遇到一个RDMA网络中使用perftest工具打流带宽异常问题,为定位该问题重现学习了一遍RDMA的原理和RDMA perftest的源码实现。

RDMA介绍

RDMA(Remote Direct Memory Access,远程直接内存访问)是一种绕过远端 CPU 和操作系统,实现网络适配器(RNIC)直接访问远端内存的高性能网络通信技术。

RDMA Perftest源码介绍

RDMA perftest是 Linux RDMA 社区(linux-rdma)提供的一套RDMA 微基准测试(Micro Benchmark)工具,用于评估 RDMA 网络和 RNIC(如 NVIDIA ConnectX 系列)性能。Perftest 通过调用RDMA Verbs API,直接对 RNIC 发起 RDMA 操作,测量不同通信模式下的:Latency(时延)、Bandwidth(带宽)、Message Rate(消息速率,Mpps)等。

以ib_write_bw为例解析RDMA perftest源码流程,完整实现参数解析→硬件初始化→两端握手协商→QP/MR 资源创建→RDMA 压测收发循环→性能统计输出→资源销毁全流程。ib_write_bw入口main在write_bw.c文件中。

intmain(int argc, char *argv[]){    int             ret_parser, i = 0, rc;    struct ibv_device   *ib_dev = NULL;    struct pingpong_context ctx;//保存硬件资源容器(QP\MR\CQ等)    struct pingpong_dest  *my_dest,*rem_dest;//本地/远端QP链路信息    struct perftest_parameters user_param; // 全局测试参数    struct perftest_comm    user_comm;//两端控制面通信上下文    struct bw_report_data   my_bw_rep, rem_bw_rep;    int rdma_cm_flow_destroyed = 0;    /* init default values to user's parameters */    memset(&user_param,0,sizeof(struct perftest_parameters));    memset(&user_comm,0,sizeof(struct perftest_comm));    memset(&ctx,0,sizeof(struct pingpong_context));    // 默认参数:RDMA WRITE、带宽测试、填充版本号    user_param.verb    = WRITE;    user_param.tst     = BW;    ret_parser = parser(&user_param,argv,argc);// 解析命令行参数    if((user_param.connection_type == DC || user_param.use_xrc)        && user_param.duplex) {        user_param.num_of_qps *= 2// XRC/DC双向QP数量修正    }    // 查找 RoCE/IB 网卡设备 + CPU 亲和绑定    ib_dev = ctx_find_dev(&user_param.ib_devname);    if (set_process_affinity(ib_dev->ibdev_path, &user_param)){}    // 创建libibvervs 上下文,校验参数是否被网卡支持    ctx.context = ctx_open_device(ib_dev, &user_param);    verify_params_with_device_context(ctx.context, &user_param);    check_link(ctx.context,&user_param);//校验网卡速率    // 创建TCP socket用来交换两端控制面信息    create_comm_struct(&user_comm,&user_param);    establish_connection(&user_comm); // SERVER阻塞等待客户端TCP连接    // 分配本地/远端QP链路信息数组    MAIN_ALLOC(my_dest , struct pingpong_dest , user_param.num_of_qps , free_rdma_params);    memset(my_dest, 0sizeof(struct pingpong_dest)*user_param.num_of_qps);    MAIN_ALLOC(rem_dest , struct pingpong_dest , user_param.num_of_qps , free_my_dest);    memset(rem_dest, 0sizeof(struct pingpong_dest)*user_param.num_of_qps);    //分配全局CTX资源(内存池、PD\QP\MR)    alloc_ctx(&ctx,&user_param);    // 通过 TCP socket 同步两端测试配置    negotiate_params(&ctx, &user_comm, &user_param);    //初始化链路(两条分支:RDMA_CM和传统直连QP)    if (user_param.work_rdma_cm == ON) { // 由rdma_cm管理QP建立、路由解析        // 使用 rdma_cm 库自动完成 GID 路由、QP 连接建立,适配 RoCE 多网卡场景;        rc = create_rdma_cm_connection(&ctx, &user_param, &user_comm, my_dest, rem_dest);    } else { //手动创建QP\PD\MR\CQ资源        if (ctx_init(&ctx, &user_param)) {}    }    // 数据校验模块初始化 开启--data-validation时使用    if (user_param.data_validation &&        (user_param.machine == SERVER || user_param.duplex) &&        data_validation_init(&ctx, &user_param)) {}    // 填充本地QP完整链路信息,根据mr_per_qp/共享mr分别计算偏移    if (set_up_connection(&ctx,&user_param,my_dest)) {}    // 两端QP握手交换链路信息    ctx_print_test_info(&user_param);    for (i=0; i < user_param.num_of_qps; i++) {      if(ctx_hand_shake(&user_comm,&my_dest[i],&rem_dest[i])) {}    }    if (user_param.work_rdma_cm == OFF) {        // QP状态机推进:INIT->RTR->RYS        if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {}    }    if (user_param.connection_type == DC){        if (set_up_connection(&ctx, &user_param, my_dest)){}    }    // 打印本地和对端QP信息:LID/QPN/PSN/RKey/LKey/VAddr/GID    for (i=0; i < user_param.num_of_qps; i++)        ctx_print_pingpong_data(&my_dest[i],&user_comm);    user_comm.rdma_params->side = REMOTE;    for (i=0; i < user_param.num_of_qps; i++) {        if (ctx_hand_shake(&user_comm,&my_dest[i],&rem_dest[i])) {}        ctx_print_pingpong_data(&rem_dest[i],&user_comm);    }    if (user_param.use_event) {// CQ事件通知注册,不开启则轮询poll CQ队列        if (ibv_req_notify_cq(ctx.send_cq, 0)) {}        if (ibv_req_notify_cq(ctx.recv_cq, 0)) {}    }    /* An additional handshake is required after moving qp to RTR. */    if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {}    // server 半双工write特殊分支。仅等待客户端压测,无发包    if (user_param.machine == SERVER &&         user_param.verb == WRITE && !user_param.duplex)     // 三大压测主循环分支:    // 分支一:RUN_ALL多报文长度遍历(1B~8M 的2的n次幂)    if (user_param.test_method == RUN_ALL){        for(int i=0;i<24;i++){            if(client)ctx_set_send_wqes(&ctx,&user_param);            if(server)ctx_set_recv_wqes(&ctx,&user_param);            if (user_param.duplex && user_param.verb == WRITE_IMM)                run_iter_bi(&ctx,&user_param);// 标准通用带宽压测客户端            else if((user_param.machine == CLIENT || user_param.verb != WRITE_IMM)                //run_iter_bw_dv是带数据校验的压测客户端;run_iter_bw:普通压测客户端               (user_param.data_validation ? run_iter_bw_dv : run_iter_bw)(&ctx,&user_param);            else if(user_param.machine == SERVER)                 run_iter_bw_server(&ctx,&user_param);}}     // 分支二:RUN_REGULAR 固定报文长度单次压测    elseif (user_param.test_method== RUN_REGULAR){        if(client)ctx_set_send_wqes(&ctx,&user_param);        if(server)ctx_set_recv_wqes(&ctx,&user_param);}     // 分支三: RUN_INFINITEFY 无限循环压测    elseif (user_param.test_method== RUN_INFINITELY) {        run_iter_bw_infinitely(&ctx,&user_param);}     // 校验带宽/消息速率是否达到用户设定最低阈值     if (!user_param.is_bw_limit_passed && (user_param.is_limit_bw == ON ) ) {}     // 关闭QP链路,推进QP到ERROR状态释放硬件资源     ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0]);     // 多层goto统一释放资源 }
alloc_ctx 函数为全局 pingpong_context ctx 批量动态分配所有 RDMA 运行时数组、硬件资源句柄数组、计时统计数组、收发 SGE/WQE 缓冲区,统一计算全局缓冲区总长度 ctx->buff_size,最后初始化内存抽象层 ctx->memory
intalloc_ctx(structpingpong_context*ctx,structperftest_parameters*user_param){    // 分配QP、MR句柄、缓冲区起始地址虚拟地址    ALLOC(ctx->qp, struct ibv_qp*, user_param->num_of_qps);    memset(ctx->qp, 0, user_param->num_of_qps*sizeof (structibv_qp*));    ALLOC(ctx->mr, struct ibv_mr*, user_param->num_of_qps);    ALLOC(ctx->buf, void*, user_param->num_of_qps);    // 带宽测试 && (客户端||双向模式)    if ((user_param->tst==BW||user_param->tst==LAT_BY_BW) &&     (user_param->machine==CLIENT||user_param->duplex)) {        // 本地缓冲区VA数组,远端发布VAdd数组,发送计数,完成计数        ALLOC(ctx->my_addr,uint64_t,user_param->num_of_qps);        ALLOC(ctx->rem_addr,uint64_t,user_param->num_of_qps);        ALLOC(ctx->scnt,uint64_t,user_param->num_of_qps);        ALLOC(ctx->ccnt,uint64_t,user_param->num_of_qps);    } elseif ((user_param->tst==BW||user_param->tst==LAT_BY_BW)    &&has_recv_comp(user_param->verb) &&user_param->machine==SERVER) {        // 带宽测试,服务端仅需本地缓冲区地址,无需远端地址、发送计数        ALLOC(ctx->my_addr, uint64_t, user_param->num_of_qps);        ALLOC(user_param->tcompleted, cycles_t1);    } elseif (user_param->tst==FS_RATE&&user_param->test_type==ITERATIONS) {        // 固定迭代吞吐测试        ALLOC(user_param->tcompleted, cycles_t, tarr_size);        memset(user_param->tcompleted, 0sizeof(cycles_t) * tarr_size);    }    // 发送侧 SGE/WQE、远端 QP 编号、地址句柄分配(CLIENT / 双向 / 时延测试)    if (user_param->machine==CLIENT||user_param->tst==LAT||user_param->duplex) {        ALLOC(ctx->current_send_buffer_offset, int, user_param->num_of_qps);        ALLOC(ctx->current_remote_recv_offset, int, user_param->num_of_qps);        memset(ctx->current_send_buffer_offset, 0sizeof(int) *user_param->num_of_qps);        memset(ctx->current_remote_recv_offset, 0sizeof(int) *user_param->num_of_qps);        if (user_param->data_validation) { // 开启校验,SGE区分长度            if (user_param->verb==READ) { // READ:每个校验分片独立SGE,数量=分片数×QP数                   ......            } else { //WRITE:固定3条SGE(数据、校验、尾标记)                ALLOC(ctx->sge_list, struct ibv_sge, 3);}            // 数据+原子操作两套WR            ALLOC(ctx->wr, struct ibv_send_wr, user_param->num_of_qps*2);         } else { // 无校验:SGE/WR数量=QP数×单次投递报文数post_list            ALLOC(ctx->sge_list, struct ibv_sge,user_param->num_of_qps*user_param->post_list);            ALLOC(ctx->wr, struct ibv_send_wr, user_param->num_of_qps*user_param->post_list);        }        // 远端QP编号数组        ALLOC(ctx->rem_qpn, uint32_t, user_param->num_of_qps);        // 无连接模式(UD/DC/SRD) 分配地址句柄AH        if (((user_param->verb==SEND||user_param->verb==SEND_IMM) &&user_param->connection_type==UD) ||                user_param->connection_type==DC||user_param->connection_type==SRD) {            ALLOC(ctx->ah, struct ibv_ah*, user_param->num_of_qps);        }    }     // 接收侧SGE/WR/接收地址数组分配    if (has_recv_comp(user_param->verb) && (user_param->tst==LAT||user_param->machine==SERVER||user_param->duplex)) {        ALLOC(ctx->recv_sge_list, struct ibv_sge,             user_param->num_of_qps*user_param->recv_post_list);        ALLOC(ctx->rwr, struct ibv_recv_wr,             user_param->num_of_qps*user_param->recv_post_list);        ALLOC(ctx->rx_buffer_addr, uint64_t, user_param->num_of_qps);    }    // 全局缓冲区尺寸计算    ctx->size=user_param->size;    num_of_qps_factor= (user_param->mr_per_qp) ?1:user_param->num_of_qps;    // 计算公式拆解:    // 1. BUFF_SIZE:报文长度向上对齐cycle_buffer单块尺寸    // 2. INC:再向上对齐CPU cache_line_size,消除伪共享    // 3. ×2:一块缓冲区拆分为本地发送区、远端接收区(偏移 (num_qps+i)*S 的来源)    // 4. ×num_of_qps_factor:共享MR=总QP数,独立MR=1    // 5. ×flows:单QP多流并发倍数    ctx->buff_size=INC(BUFF_SIZE(ctx->size, ctx->cycle_buffer),                 ctx->cache_line_size) *2*num_of_qps_factor*user_param->flows;    // 单QP发送缓冲区总长度    ctx->send_qp_buff_size=ctx->buff_size/num_of_qps_factor/2;    // 单流分片长度    ctx->flow_buff_size=ctx->send_qp_buff_size/user_param->flows;    user_param->buff_size=ctx->buff_size; //同步给全局参数    if (user_param->connection_type==UD)// 无连接模式额外加缓存行防止越界        ctx->buff_size+=ctx->cache_line_size;    if (user_param->data_validation) { //数据校验模式重算缓冲区布局        ctx->payload_size=ctx->size;        structvalidation_buffer_layoutlayout;    //开启数据校验后,内存不再简单均分,会划分独立校验分片、尾标记区域,覆盖之前的    //buff_size,对应set_up_connection 中 WRITE 模式不规则 VAddr 偏移分支。        if (compute_validation_layout(            ctx->payload_size,            user_param->validation_chunk_size,            user_param->num_of_qps,            user_param->validation_chunks_per_qp,            (user_param->verb==READ),            &layout) !=0) {}        ctx->tail_markers_offset=layout.markers_offset;        ctx->recv_slots_offset=layout.recv_slots_offset;        ctx->atomic_returns_offset=layout.atomic_returns_offset;        ctx->buff_size=layout.total_size;    }    // 初始化内存抽 ctx->memory    ctx->memory=user_param->memory_create(user_param);    returnSUCCESS;}
ctx_init 函数完整创建整套 IB/RoCE 硬件内核资源。资源强依赖顺序 PD 必须先于 MR/QP;MR 必须先于 QP(QP 访问依赖 MR RKey);CQ 必须先于 QP(QP 绑定 CQ); 销毁严格逆序,否则触发内核 ib_core 崩溃、资源永久泄漏。
intctx_init(structpingpong_context*ctx, structperftest_parameters*user_param){    /* 创建CQ完成事件通道. 开启事件等待模式,时间唤醒进程代替CPU轮询*/    if (user_param->use_event) {        ctx->send_channel=ibv_create_comp_channel(ctx->context);        ctx->recv_channel=ibv_create_comp_channel(ctx->context);    }    /*分配PD保护域  PD:RDMA基础隔离单元,所有MR/QP绑定统一PD才能相互访问*/    ctx->pd=ibv_alloc_pd(ctx->context);    // 初始化内存抽相层 ,调用maca_memory_allocate_buffer    if (ctx->memory->init(ctx->memory)) {}    // 批量创建MR内存(核心调用create_mr)    if (create_mr(ctx, user_param)) {}    // 创建CQ发送/接收完成队列    if (create_cqs(ctx, user_param)) {}    //创建SRQ共享接收队列(DC/LAT/双向测试)    if (user_param->use_srq&&user_param->connection_type==DC&&            (user_param->tst==LAT||            user_param->machine==SERVER||            user_param->duplex==ON))    {        structibv_srq_init_attr_exattr;            memset(&attr, 0sizeof(attr));        attr.comp_maskIBV_SRQ_INIT_ATTR_TYPE | IBV_SRQ_INIT_ATTR_PD;        attr.attr.max_wr=user_param->rx_depth;        attr.attr.max_sge=1;        attr.pd=ctx->pad;        attr.srq_typeIBV_SRQT_BASIC;        ctx->srq=ibv_create_srq_ex(ctx->context, &attr);        if (!ctx->srq)  {            fprintf(stderr, "Couldn't create SRQ\n");            gotoxrc_srq;        }    }    // 批量创建QP队列    for (i=0; i<user_param->num_of_qps; i++) {        if (create_qp_main(ctx, user_param, i)) {}        qp_index++;    }    returnSUCCESS;}
set_up_connection批量填充本地每条 QP 的完整远端通信描述体 pingpong_dest my_dest[],生成两端握手必须的全套链路元数据:LID、GID、QPN、随机 PSN、MR 远端密钥 RKey、对外发布的远端虚拟地址 VAddr、SRQ 共享接收队列号 SRQN。 填充完成后,通过 TCP 控制面与对端交换 my_dest/rem_dest。
intset_up_connection(structpingpong_context*ctx,        structperftest_parameters*user_param,        structpingpong_dest*my_dest){    // DC/XRC架构收发QP分离,双向/时延测试时物理QP分为发送、接收各一半    if ((user_param->connection_type==DC||user_param->use_xrc) && (user_param->duplex||user_param->tst==LAT)) {        num_of_qps/=2;        num_of_qps_per_port=num_of_qps/2;    }    if (user_param->gid_index!=-1) {        // 读取端口状态、MTU、速率        if (ibv_query_port(ctx->context, user_param->ib_port, &attr))    }    // 双卡 RoCE 场景,缓存第二块网卡 GID 到temp_gid2,循环分配 QP 时绑定对应网卡标识。    if (user_param->dualport==ON) { //双端口第二张网卡IB_PORT2 GID获取        if (user_param->gid_index2!=-1) {            if (ibv_query_port(ctx->context, user_param->ib_port2, &attr))                return0;        }    }    // 循环填充每个QP的QPN\PSN\RKEY三大硬件标识    for (i=0; i<user_param->num_of_qps; i++) {        my_dest[i].qpn   =ctx->qp[i]->qp_num;        my_dest[i].psn   =lrand48() &0xffffff;        my_dest[i].rkey=user_param->use_null_mr?ctx->null_mr->lkey:ctx->mr[i]->rkey;        */        if (user_param->mr_per_qp) // 对外发布远端vaddr            my_dest[i].vaddr= (uintptr_t)ctx->buf[i] +BUFF_SIZE(ctx->size,ctx->cycle_buffer);        elseif (user_param->data_validation==ON) {            if (user_param->verb==READ) {                 /* ib_read_bw: 所有QP统一度内存起始基地址 */                my_dest[i].vaddr= (uintptr_t)ctx->buf[0];            } else {                /* ib_WRITE+bw: 每条QP分配独立校验分片,偏移不规则 */                my_dest[i].vaddr= (uintptr_t)ctx->buf[0] +ctx->recv_slots_offset+ i * (user_param->validation_chunks_per_qp*user_param->validation_chunk_size*ctx->payload_size);            }            /* 校验结束标记地址,同步数据校验完成状态 */            my_dest[i].tail_markers_vaddr= (uintptr_t)ctx->buf[0] +ctx->tail_markers_offset;        } else // 共享MR、无数据校验            my_dest[i].vaddr= (uintptr_t)ctx->buf[0] + (user_param->num_of_qps+ i)*BUFF_SIZE(ctx->size,ctx->cycle_buffer);    }    return0;}
完成上述初始化工作之后开始准备传输数据。ctx_set_send_wqes函数的作用是构造Send WQE(Work Queue Element)。他会根据测试输出的参数是需要开启校验生成不同类型的WQE:
voidctx_set_send_wqes(struct pingpong_context *ctx,        struct perftest_parameters *user_param,        struct pingpong_dest *rem_dest){    if (user_param->data_validation && rem_dest !=NULL) {        if (user_param->verb == READ)            ctx_set_send_wqes_data_val_read(ctx, user_param, rem_dest);        else            ctx_set_send_wqes_data_val_write(ctx, user_param, rem_dest);    } else {        ctx_set_send_reg_wqes(ctx,user_param,rem_dest);    }}
ctx_set_send_reg_wqes() 是 perftest 最核心的发送初始化函数。它根据测试参数(READ/WRITE/SEND/ATOMIC、BW/LAT、post_list等),预先构造好所有 ibv_sge 和 ibv_send_wr,供 ibv_post_send() 直接提交到 RNIC。ctx_set_send_wqes_data_val_read/ctx_set_send_wqes_data_val_write带数据校验场景专用初始化函数。三个函数区别如下:
  • ctx_set_send_reg_wqes:通用带宽 / 延迟压测,无数据校验
  • ctx_set_send_wqes_data_val_read:校验读流程(READ 拉远端数据)
  • ctx_set_send_wqes_data_val_write:校验写流程(WRITE 推送数据到远端)
ctx_set_send_wqes_data_val_read和带数据校验场景专用初始化(仅 READ + 原子 FETCH_ADD) 专门用于接收数据完整性校验流程,固定只生成两类 WR: RDMA READ WR:拉取远端业务数据到本地校验缓冲区 ATOMIC_FETCH_AND_ADD WR:原子递增远端标记尾指针,同步数据完成状态 不支持通用压测流水线,逻辑极简,只为数据校验流程服务。
完成前面一系列准备工作后开始循环测试带宽,主要循环函数有4个:
  • run_iter_bw
    单向发送客户端(标准吞吐,无校验、无接收处理)
  • run_iter_bw_dv
    单向发送客户端(带数据完整性校验 DV)
  • run_iter_bw_server
    纯接收服务端(只收、补发 Recv、回 credit 流控,不发业务包)
  • run_iter_bi
    Bidirectional 双向一体化收发(单线程同时发包 + 收包,支持 Client/Server)
函数
核心角色
适用测试场景
配套 WR 初始化函数
run_iter_bw
单向发送客户端,只发不收
单向带宽 / 延迟基准压测,不校验数据
ctx_set_send_reg_wqes(通用标准 WR)
run_iter_bw_dv
单向发送客户端,只发不收
单向带宽 + 数据完整性校验,防丢包乱序
ctx_set_send_wqes_data_val_write / data_val_read
run_iter_bw_server
纯接收服务端,只收不发业务包
单向测试服务端,被动接收、流控回包
无专用发送 WR 初始化,仅预分配 Recv WR
run_iter_bi
双向一体化(收发同线程)
Duplex 双向带宽、UD/UC 无连接双向、单线程低开销双向测试
ctx_set_send_reg_wqes
在run_iter_bw中会调用post_send_method方法统一封装 ibv_post_send 调用入口,自动切换两套发包实现:1、新批量高性能 post_send 接口(硬件优化 API,new_post_send_work_request_func_pointer)2、原生标准 ibv_post_send 接口(传统 libibverbs 通用接口)。
staticinlineintpost_send_method(struct pingpong_context *ctx, intindex,    struct perftest_parameters *user_param){    #ifdef HAVE_IBV_WR_API    if (!user_param->use_old_post_send)        return (*ctx->new_post_send_work_request_func_pointer)(ctx, index, user_param);    #endif    struct ibv_send_wr  *bad_wr =NULL;    return ibv_post_send(ctx->qp[index], &ctx->wr[index*user_param->post_list], &bad_wr);}
ibv_post_send将一条或多条串联的 ibv_send_wr(发送工作请求 WR)批量下发到 QP 的发送队列,网卡硬件异步执行 RDMA 操作:SEND / WRITE / READ / ATOMIC。
整个过程就完成了一轮带宽测试,测试完成后两段会再次握手交换测试结果。
参考

https://github.com/linux-rdma/perftest

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-23 00:34:29 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/866580.html
  2. 运行时间 : 0.393344s [ 吞吐率:2.54req/s ] 内存消耗:4,907.66kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=23d488e45a725252f33e7ed94cf3e343
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000969s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001844s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.021350s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.006674s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001804s ]
  6. SELECT * FROM `set` [ RunTime:0.000565s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001985s ]
  8. SELECT * FROM `article` WHERE `id` = 866580 LIMIT 1 [ RunTime:0.053864s ]
  9. UPDATE `article` SET `lasttime` = 1784738070 WHERE `id` = 866580 [ RunTime:0.108937s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.005417s ]
  11. SELECT * FROM `article` WHERE `id` < 866580 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.003533s ]
  12. SELECT * FROM `article` WHERE `id` > 866580 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000536s ]
  13. SELECT * FROM `article` WHERE `id` < 866580 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001639s ]
  14. SELECT * FROM `article` WHERE `id` < 866580 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001041s ]
  15. SELECT * FROM `article` WHERE `id` < 866580 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001397s ]
0.395892s