精华内容
下载资源
问答
  • 1. 问题描述在数据库的使用过程中可能遇到锁表的情况,导致其他进程访问同样的表时出现超时的情况。具体表现为,在MySQL中使用如下命令SHOW PROCESSLIST显示结果为其中,Status列表示语句的查询状态,若值为Locked,...

    1. 问题描述

    在数据库的使用过程中可能遇到锁表的情况,导致其他进程访问同样的表时出现超时的情况。具体表现为,在MySQL中使用如下命令

    SHOW PROCESSLIST显示结果为

    610bc131634f0546ba3520f791d9d6f0.png

    其中,Status列表示语句的查询状态,若值为Locked,则表示该查询被其他查询锁住了。Host表示发出查询语句的主机信息,如图所示,被锁住的查询在192.168.1.152主机的38292端口发出的TCP连接上。Info列中给出了被锁住的语句的信息。

    怎么根据这些信息找出被锁住的SQL语句所在进程的相关信息,从而为DEBUG提供帮助呢?

    2. 解决方法

    a. 根据TCP端口号,查看进程PID

    方法一:lsof

    lsof -Pnl +M -i4 | grep 38292

    方法二:netstat

    netstat -anp | grep 38292

    在192.168.1.152主机上执行上述语句,如下图所示,两种方法得到的38292端口对应的进程PID均为11882

    b56017767e275b0242d2639afa6ef52c.png

    b. 根据PID,查看进程信息

    在192.168.1.152主机上执行以下命令,查看进程信息

    ps aux | grep 11882如下图所示,可以查看进程启动的命令等基本信息

    8c96fd5edccafb83eaabba1f1dff4953.png

    根据以上信息,可以对MySQL查询的锁表问题进行排查,为进一步调试程序提供需要的信息。

    原文:http://blog.csdn.net/bnufq/article/details/45481709

    展开全文
  • 在数据库的使用过程中可能遇到锁表的情况,导致其他进程访问同样的表时出现超时的情况。具体表现为,在MySQL中使用如下命令 SHOW PROCESSLIST显示结果为 其中,Status列表示语句的查询状态,若值为Locked,则...

    1. 问题描述

    在数据库的使用过程中可能遇到锁表的情况,导致其他进程访问同样的表时出现超时的情况。具体表现为,在MySQL中使用如下命令

    SHOW PROCESSLIST
    显示结果为


    其中,Status列表示语句的查询状态,若值为Locked,则表示该查询被其他查询锁住了。Host表示发出查询语句的主机信息,如图所示,被锁住的查询在192.168.1.152主机的38292端口发出的TCP连接上。Info列中给出了被锁住的语句的信息。

    怎么根据这些信息找出被锁住的SQL语句所在进程的相关信息,从而为DEBUG提供帮助呢?

    2. 解决方法

    a. 根据TCP端口号,查看进程PID

    方法一:lsof
    lsof -Pnl +M -i4 | grep 38292


    方法二:netstat
    netstat -anp | grep 38292

    在192.168.1.152主机上执行上述语句,如下图所示,两种方法得到的38292端口对应的进程PID均为11882

    b. 根据PID,查看进程信息

    在192.168.1.152主机上执行以下命令,查看进程信息
    ps aux | grep 11882
    如下图所示,可以查看进程启动的命令等基本信息

    根据以上信息,可以对MySQL查询的锁表问题进行排查,为进一步调试程序提供需要的信息。
    展开全文
  • linux C 网络编程poll函数详解

    千次阅读 2019-07-06 13:38:15
    它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后...

    poll:

    poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。

    它没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点:

    1、大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。                   

    2、poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

    其中client是一个结构体

        struct pollfd client[OPEN_MAX];
        client[0].fd = listenfd;                    /* 要监听的第一个文件描述符 存入client[0]*/
        client[0].events = POLLIN;                  /* listenfd监听普通读事件 */
    
        for (i = 1; i < OPEN_MAX; i++)
            client[i].fd = -1;                      /* 用-1初始化client[]里剩下元素 0也是文件描述符,不能用 */
    
        maxi = 0;                                   /* client[]数组有效元素中最大元素下标 */
    
    for ( ; ; ) {
            nready = poll(client, maxi+1, -1);      /* 阻塞监听是否有客户端链接请求 */
    
            if (client[0].revents & POLLIN) {       /* listenfd有读事件就绪 */
    
                clilen = sizeof(cliaddr);
                connfd = Accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);/* 接收客户端请求 Accept 不会阻塞 */
                printf("received from %s at PORT %d\n",
                        inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
                        ntohs(cliaddr.sin_port));
    
                for (i = 1; i < OPEN_MAX; i++)
                    if (client[i].fd < 0) {
                        client[i].fd = connfd;      /* 找到client[]中空闲的位置,存放accept返回的connfd */
                        break;
                    }
    
                if (i == OPEN_MAX)                  /* 达到了最大客户端数 */
                    perr_exit("too many clients");
    
                client[i].events = POLLIN;          /* 设置刚刚返回的connfd,监控读事件 */
                if (i > maxi)
                    maxi = i;                       /* 更新client[]中最大元素下标 */
                if (--nready <= 0)
                    continue;                       /* 没有更多就绪事件时,继续回到poll阻塞 */
            }
    
            for (i = 1; i <= maxi; i++) {           /* 前面的if没满足,说明没有listenfd满足. 检测client[] 看是那个connfd就绪 */
                if ((sockfd = client[i].fd) < 0)
                    continue;
    
                if (client[i].revents & POLLIN) {
    
                    if ((n = Read(sockfd, buf, MAXLINE)) < 0) {
                        /* connection reset by client */
                        if (errno == ECONNRESET) {  /* 收到RST标志 */
                            printf("client[%d] aborted connection\n", i);
                            Close(sockfd);
                            client[i].fd = -1;      /* poll中不监控该文件描述符,直接置为-1即可,不用像select中那样移除 */
                        } else
                            perr_exit("read error");
    
                    } else if (n == 0) {            /* 说明客户端先关闭链接 */
                        printf("client[%d] closed connection\n", i);
                        Close(sockfd);
                        client[i].fd = -1;
                    } else {
                        for (j = 0; j < n; j++)
                            buf[j] = toupper(buf[j]);
                        Writen(sockfd, buf, n);
                    }
                    if (--nready <= 0)
                        break;
                }
            }
        }
        return 0;

     

    展开全文
  • Linux命令行与shell脚本编程大全(第2版)

    千次下载 热门讨论 2014-02-20 13:51:01
    23.3.3 查询数据 23.4 在脚本中使用数据库 23.4.1 连接到数据库 23.4.2 向服务器发送命令 23.4.3 格式化数据 23.5 小结 第24章 使用Web 24.1 Lynx程序 24.1.1 安装Lynx 24.1.2 lynx命令行 24.1.3 Lynx...
  • 它们都允许进程一直阻塞,直到一个或多个文件描述符成为就绪状态或者在调用时指定一个超时时间。poll执行的任务同select很类似,两者的主要区别在于如何指定待检查的文件描述符,通常select的应用更广泛一些。 ...

    在应用程序中可以通过select或poll系统调用来查询多个文件描述符。它们都允许进程一直阻塞,直到一个或多个文件描述符成为就绪状态或者在调用时指定一个超时时间。poll执行的任务同select很类似,两者的主要区别在于如何指定待检查的文件描述符,通常select的应用更广泛一些。

    select调用的原型为:

    #include <sys/time.h>
    #include <sys/select.h>
    int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

    其中nfds表示需要检测的最大文件描述符加1。readfs、writefds、exceptfds分别是select要查询的读写和异常处理文件描述符的集合。timeout是超时时间。

    在使用select之前我们首先需要确定其参数。

    首先要确定各个文件描述符的集合。数据类型fd_set已位掩码的形式来实现的,在使用的过程中我们不需要知道其内部细节内核为我们提供了下面的一些宏来操作文件描述符的集合:

    #include <sys/select.h>
    void FD_ZERO(fd_set *fdset); //将fdset所指向的集合清空
    void FD_SET(int fd, fd_set *fdset);//将文件描述符fd加入fdset所指向的集合中
    void FD_CLR(int fd, fd_set *fdset);//将文件描述符fd从fdset所指向的集合中移除
    void FD_ISSET(int fd, fd_set *fdset);//判断fd是否在fdset所指向的集合中

    参数timeout决定select的阻塞行为,当改参数指定为NULL时select会一直阻塞下去直到一个或多个文件描述符成为就绪状态。当timeout指向一个timeval结构是,timeout将是select阻塞等待的超时时间。timeval结构体的定义如下:

    struct timeval {
          time_t tv_sec;
          suseconds_t tv_usec;
    };
    如果结构体timeval的两个域都为0的话,select将不阻塞

    应用程序中的select最终会导致执行驱动程序中的poll函数。驱动程序中poll函数的原型是:

    unsigned int (*poll) (struct file *fp, struct poll_table *wait);

    其中参数struct poll_table *wait是一个等待队列表,由被轮询等待数据的设备驱动程序所拥有。在驱动程序中我们的poll函数主要要实现两个功能:

    1、  将驱动程序中可引起设备状态变化的等待队列头加到struct poll_table *wait中,这一步我们可以使用poll_wait()来实现。

    2、  返回一个描述设备能进行哪些操作的掩码。

    其中常用的操作标识码有:

    POLLIN:设备可以无阻塞地读取
    POLLRDNORM:数据准备就绪,可以读取(一个可读设备返回POLLIN| POLLRDNORM)。
    POLLOUT:设备可以无阻塞地写入
    POLLWRNORM:同POLLOUT意义一样(一个可写设备将返回POLLOUT| POLLWRNORM)。
    

    就写驱动程序而言,我们只需要实现上面的功能就可以了,在驱动程序中一个简单的poll函数模板如下:

    static unsigned int xxx_poll (struct file *fp, struct poll_table *wait)
    {
    	unsigned int mask = 0;
    	/*将驱动中的read_wait 等待队列加入wait队列表中*/
    	poll_wait(fp, &read_wait, wait);
    	
    	
    	/*返回可进行操作的掩码*/
    	if (readable)
    		mask |= POLLIN | POLLRDNORM; /*可读*/
    		
    	return mask;	
    }
    

    poll_wait()的定义在linux/poll.h中:

    static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
    {
    	if (p && wait_address)
    		p->qproc(filp, wait_address, p);
    }

    它只是简单地调用了poll_table中的qproc函数,在我们目前的应用中这个函数实际是__pollwait(),这个函数定义在fs/select.c文件中:

    static void __pollwait(struct file *filp, wait_queue_head_t *wait_address,
    				poll_table *p)
    {
    	struct poll_table_entry *entry = poll_get_entry(p);
    	if (!entry)
    		return;
    	get_file(filp);
    	entry->filp = filp;
    	entry->wait_address = wait_address;
    	init_waitqueue_entry(&entry->wait, current);
    	add_wait_queue(wait_address, &entry->wait);
    }
    

    通过上面的代码可以知道poll_wait的作用只是将驱动程序的等待队列,加到一个等待队列列表中,这样当条件满足的时候就可以在驱动程序中唤醒相应的等待队列来唤醒进程了。注意,poll_wait并不会引起进程休眠。

    那系统是如何将__pollwait()函数同wait->qproc联系起来的呢,要回答这个问题我们必须首先了解在应用程序中调用select是如何一步一步调用到我们驱动程序的poll函数的。

    在应用程序作用调用select最终会依次调用内核中sys_select()->core_sys_select()->do_select(),这些函数都定义在fs/select.c文件中。先来看一看do_select()的核心代码:

    int do_select(int n, fd_set_bits *fds, s64 *timeout)
    {
    	struct poll_wqueues table;
    	poll_table *wait;
    	int retval, i;
    
    	...
    	/*初始化table,在其中会将__pollwait()函数赋值给table.pt的成员qproc。*/	
    	poll_initwait(&table);
    	/*wait只是table的一个成员pt*/
    	wait = &table.pt;
    	...
    	for (;;) {
    		unsigned long *rinp, *routp, *rexp, *inp, *outp, *exp;
    		long __timeout;
    		
    		/*将当前进程状态设置为TASK_INTERRUPTIBLE */
    		set_current_state(TASK_INTERRUPTIBLE);
    
    		...
    
    		for (i = 0; i < n; ++rinp, ++routp, ++rexp) {
    			...
    
    			for (j = 0; j < __NFDBITS; ++j, ++i, bit <<= 1) {
    				...
    				if (file) {
    					f_op = file->f_op;
    					mask = DEFAULT_POLLMASK;
    					if (f_op && f_op->poll)
    						/*调用驱动程序中的poll函数*/
    						mask = (*f_op->poll)(file, retval ? NULL : wait);
    					...
    				}
    				...
    			}
    			...
    		}
    		wait = NULL;
    		/*如果可进行一项IO操作|时间到|收到信号 则跳出循环唤醒进程*/
    		if (retval || !*timeout || signal_pending(current))
    			break;
    		...
    		/*调度其他进程执行*/
    		__timeout = schedule_timeout(__timeout);
    		if (*timeout >= 0)
    			*timeout += __timeout;
    	}
    	/*将进程状态设为TASK_RUNNING */
    	__set_current_state(TASK_RUNNING);
    
    	poll_freewait(&table);
    
    	return retval;
    }
    

    在do_select()中会遍历调用select所设置的所有的文件描述符所指向文件的驱动程序的poll函数,取出可操作的动作的mask。如果没有任何可操作的I/O则会让当前进程休眠,通过下面的语句:

    __timeout = schedule_timeout(__timeout);

    如果某个文件的驱动程序将进程唤醒,则会继续循环从新执行各个文件驱动程序的poll函数,并取出可进行I/O动作的mask。当代码再次运行到这一句是会从新判断条件并跳出循环:

    		/*如果可进行一项IO操作|时间到|收到信号 则跳出循环唤醒进程*/
    		if (retval || !*timeout || signal_pending(current))
    			break;
    

    然后将进程状态设为TASK_RUNNING,do_select()返回,直至我们的系统调用select()返回。

    至此,Linux的整个轮询机制的流程就已经完了。












    展开全文
  • 它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设d备就绪或者主动超时,被唤醒...
  • kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内) del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、...
  • 检测按键的几种方法

    千次阅读 2019-12-29 18:48:14
    1、查询:耗资源,可达99% 2、中断:read一直在等待,不会返回 3、poll:指定超时时间,例:等待按键5秒,5秒无响应返回错误并往下执行程序。...但linux程序是多进程的,在设置flag的过程中被打断的话,判...
  • 性能优化的思路

    2017-02-03 12:10:00
    1. 硬件层面:机器选型  SSD硬盘, CPU核数 2. 网络方面,CDN  DNS解析,IP,网络流量监控分流,负载均衡,压缩 3. 运行环境层面:是否充分利用了... 索引,连接数,慢查询,读写分离,超时机制,版本的bugl...
  • poll是Linux中的字符设备驱动中的一个函数,poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd...
  • 使用进程 - fork函数 / multiprocessing模块 / 进程池 / 进程间通信 使用线程 - thread模块 / threading模块 / Thread类 / Lock类 / Condition类 / 线程池 Day14 - 网络编程入门和网络应用开发 计算机网络基础 -...
  • 网络异常的时候自动关闭VPN(防止VPN有效性过期),并且自动断开Wi-Fi,再次重新连接(防止IP有效期超时);重启sb、在sb 进行搭建操作界面等。 2017年10月-至今 app逆向开发(非越狱App集成、tweak) 项目描述...
  • 敖丙RPC的超时设置,一不小心搞了线上事故 敖丙找出Dubbo源码BUG,三歪夸了我一天 Dubbo基础 Dubbo的服务暴露过程 Dubbo的服务引用过程 Dubbo服务调用过程 Dubbo的SPI机制是啥? Dubbo集群容错负载均衡 Dubbo面试题 ...
  • 这一点貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安装驱动的情况,确认这一点可以右键「计算机」-「属性」,到「设备管理器」里查看相关设备上是否有黄色感叹号或问号,如果没有就说明驱动...
  • 3.4.9 执行超时和中断 4 内部实现 4.1 Bytecode 4.2 Executable generation 4.2.1 qjsc 编译器 4.2.2 二进制 JSON 4.3 运行时 4.3.1 Strings 4.3.2 Objects 4.3.3 Atoms 4.3.4 Numbers 4.3.5 垃圾回收 ...
  • 2.3.2 在Linux下运行Cassandra 31 2.3.3 启动服务器 32 2.4 使用命令行界面的客户端 33 2.5 基本命令行命令 34 2.5.1 帮助 34 2.5.2 连接服务器 35 2.5.3 描述环境 35 2.5.4 创建keyspace和列族 36 ...
  • 怎么样让大量的ETL任务准确的完成调度而不出现问题,甚至在任务调度执行中出现错误的情况下,任务能够完成自我恢复甚至执行错误告警与完整的日志查询。hera任务调度系统就是在这种背景下衍生的一款分布式调度系统。...
  • 看看7.1 编译报错bug,如果没有找到解决方案,建议谷歌查询一下问题。 03.项目部分介绍 3.1 项目包含的模块 新闻部分(天行新闻,微信精选新闻,阿里云热门新闻,干货集中营新闻等等) 干货集中营:包含福利...
  • adb1.0.26包含fastboot.exe

    2019-03-05 15:11:03
    这一点貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安装驱动的情况,确认这一点可以右键「计算机」-「属性」,到「设备管理器」里查看相关设备上是否有黄色感叹号或问号,如果没有就说明驱动...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 ...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 ...
  • Java资源包01

    2016-08-31 09:16:25
    5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 ...
  • java开源包101

    2016-07-13 10:11:08
    5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 ...
  • java开源包11

    热门讨论 2013-06-28 10:10:38
    5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 ...
  • java开源包6

    热门讨论 2013-06-28 09:48:32
    5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 ...
  • java开源包10

    热门讨论 2013-06-28 10:06:40
    5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 ...
  • java开源包8

    热门讨论 2013-06-28 09:55:26
    5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 ...
  • java开源包9

    热门讨论 2013-06-28 09:58:55
    5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 ...
  • java开源包7

    热门讨论 2013-06-28 09:52:16
    5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 ...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

linux查询超时进程

linux 订阅