Skip to content

博客

Dead_lock

并发通常是指与一个或者多个进程同时发生的过程,通常这也意味着所有这些进程在同一个时间取得进展。并发的代码很难构建,通常需要几个迭代才能,让它按照预期的方式运行。而在并发编程时,都会遇到同样的问题,计算机的科学家已经对共同的问题进行了标记。

当两个或多个操作必须按正确的方式运行, 而程序并未保证这个顺序,就会发生竞争条件。大多数情况下,会出现在数据中,其中一个并发操作尝试读取一个变量,而在某个不确定的时间, 另一个并发操作尝试写入同一个变量。

当某些东西被认为是原子性,或具有原子性时,这意味着在它运行的环境中,是不可分割或不可中断的。

死锁程序是所有并发进程彼此等待的程序,在这种情况下,如果没有外界的干预,这个程序将永远无法恢复。

1971年,Edgar Coffman在一篇论文中,列出了出现死锁的4个必要条件:

并发进程同时拥有资源的抢占权。

并发进程必须同时拥有一个资源,并等待另外一个资源。

并发进程拥有的资源只能被该进程释放。

一个并发进程P1必须等待一系列其他进程P2,这些并发进程同时也在等待进程P1,这样便满足这个条件。

Docker

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 是一个工具,可以帮助解决如安装、拆卸、升级、分发、信任和管理软件等常用问题。Docker包含一个命令行程序、一个后台守护进程和一组远程服务。

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 是一个工具,可以帮助解决如安装、拆卸、升级、分发、信任和管理软件等常用问题。Docker包含一个命令行程序、一个后台守护进程和一组远程服务。

不同于虚拟机,Docker容器不使用硬件虚拟化,运行在Docker容器中的程序接口直接和Linux内核打交道,容器中的程序和操作系统之间没有额外的中间层。

命令行工具在用户名称空间的内存中运行, 同操作系统上运行的其他程序一样。

image-20200617111314194

Docker构建的容器隔离包括以下8个方面:

  1. PID名称空间---进程表示符和能力
  2. UST名称空间---主机名和域名
  3. MNT名称空间---文件系统访问和结构
  4. NET名称空间---网路访问和结构
  5. USR名称空间---用户名和标识
  6. chroot()---控制文件系统根目录的位置
  7. cgroups---资源保护

Docker有三个特定功能,来帮助建立与环境无关的系统

  • 只读文件系统
  • 环境变量注入
  • 存储卷

只读文件系统,容器不能更改它所包含的任何文件,同时容器中的攻击者无法破坏文件。

创建容器时需使用—read-only标志,如:

Terminal window
docker run -d --read-only wordpress:4

环境变量是通过执行上下文提供给程序的键值对。可以让用户在更改程序配置时,无须修改任何文件或者更改启动程序的命令。

—env标志或者-e缩写,可用于注入任何环境变量, 如:

Terminal window
$ docker run --env MY_ENV="hello world" busybox:latest env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=90b9adbe051c
MY_ENV=hello world
HOME=/root

创建容器时,如果忘记添加参数—restart=always,那么容器并不会自动重启。容器已经创建,此时修改容器配置可以通过命令:docker container update,

Terminal window
± docker container update --help
Usage: docker container update [OPTIONS] CONTAINER [CONTAINER...]
Update configuration of one or more containers
Options:
--blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit the CPU real-time period in microseconds
--cpu-rt-runtime int Limit the CPU real-time runtime in microseconds
-c, --cpu-shares int CPU shares (relative weight)
--cpus decimal Number of CPUs
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--kernel-memory bytes Kernel memory limit
-m, --memory bytes Memory limit
--memory-reservation bytes Memory soft limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--pids-limit int Tune container pids limit (set -1 for unlimited)
--restart string Restart policy to apply when a container exits

如,修改restart配置, 可以使用:

Terminal window
docker container update --restart=always 容器ID

Mysql_kill_process

使用kill命令可以杀掉等待msyql线程。

每个与 mysqld 的连接都在一个独立的线程里运行,您可以使用 SHOW PROCESSLIST 语句查看哪些线程正在运行,并使用 KILL thread_id 语句终止一个线程。

当进行一个 KILL 时,对线程设置一个特有的终止标记。在多数情况下,线程终止可能要花一些时间,这是因为终止标记只会在在特定的间隔被检查:

· 在 SELECT, ORDER BY 和 GROUP BY 循环中,在读取一组行后检查标记。如果设置了终止标记,则该语句被放弃。

· 在 ALTER TABLE 过程中,在每组行从原来的表中被读取前,检查终止标记。如果设置了终止标记,则语句被放弃,临时表被删除。

· 在 UPDATE 或 DELETE 运行期间,在每个组读取之后以及每个已更行或已删除的行之后,检查终止标记。如果终止标记被设置,则该语句被放弃。注意,如果您正在使用事务,则变更不会被 回滚。

· GET_LOCK() 会放弃和返回 NULL。

· INSERT DELAYED 线程会快速地刷新(插入)它在存储器中的所有的行,然后终止。

· 如果线程在表锁定管理程序中(状态:锁定),则表锁定被快速地放弃。

· 如果在写入调用中,线程正在等待空闲的磁盘空间,则写入被放弃,并伴随 “disk full” 错误消息。

· 警告:对 MyISAM 表终止一个 REPAIR TABLE 或 OPTIMIZE TABLE 操作会导致出现一个被损坏的没有用的表。对这样的表的任何读取或写入都会失败,直到您再次优化或修复它(不中断)。

使用命令:

mysql> show full PROCESSLIST;

可以查看到mysql当前正在运行的中的进程。

使用命令:

mysql> kill pid;//如:kill 211598;

可以杀死指定的进程。

如果进程非常多,这就非常低效,可以先生生成命令字符,再复制执行,即可:

mysql> select group_concat(concat('kill ',id) separator '; ') as cmd
from information_schema.processlist where user='yb' and Host like '171.43.215.39%';
+----------------------------------+
| cmd |
+----------------------------------+
| kill 211598;kill 4;kill 211599 |
+----------------------------------+

然后执行:

> kill 211598;kill 4;kill 211599;
show status;

该命令会将 DB 所有的状态打印出来,如需其中特定的项可以加上 like ‘% 变量名称 %’,如:

show status like '%Connections%';

常用变量有:

Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。

Aborted_connects 尝试已经失败的 MySQL 服务器的连接的次数。

Connections 试图连接 MySQL 服务器的次数。

Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。

Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。

Delayed_writes 用 INSERT DELAYED 写入的行数。

Delayed_errors 用 INSERT DELAYED 写入的发生某些错误 (可能重复键值) 的行数。

Flush_commands 执行 FLUSH 命令的次数。

Handler_delete 请求从一张表中删除行的次数。

Handler_read_first 请求读入表中第一行的次数。

Handler_read_key 请求数字基于键读行。

Handler_read_next 请求读入基于一个键的一行的次数。

Handler_read_rnd 请求读入基于一个固定位置的一行的次数。

Handler_update 请求更新表中一行的次数。

Handler_write 请求向表中插入一行的次数。

Key_blocks_used 用于关键字缓存的块的数量。

Key_read_requests 请求从缓存读入一个键值的次数。

Key_reads 从磁盘物理读入一个键值的次数。

Key_write_requests 请求将一个关键字块写入缓存次数。

Key_writes 将一个键值块物理写入磁盘的次数。

Max_used_connections 同时使用的连接的最大数目。

Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。

Not_flushed_delayed_rows 在 INSERT DELAY 队列中等待写入的行的数量。

Open_tables 打开表的数量。

Open_files 打开文件的数量。

Open_streams 打开流的数量 (主要用于日志记载)

Opened_tables 已经打开的表的数量。

Questions 发往服务器的查询的数量。

Slow_queries 要花超过 long_query_time 时间的查询数量。

Threads_connected 当前打开的连接的数量。

Threads_running 不在睡眠的线程数量。

Uptime 服务器工作了多少秒。

Sed命令

sed 命令表示 Stream Editor(流编辑器),用来在 Linux 上执行基本的文本操作。它可以执行各种功能,如搜索、查找、修改、插入或删除文件。

此外,它也可以执行复杂的正则表达式匹配。

它可用于以下目的:

  • 查找和替换匹配给定的格式的内容。
  • 在指定行查找和替换匹配给定的格式的内容。
  • 在所有行查找和替换匹配给定的格式的内容。
  • 搜索并同时替换两种不同的模式。

注意:由于这是一篇演示文章,我们使用不带 -i 选项的 sed 命令,该选项会在 Linux 终端中删除行并打印文件内容。

但是,在实际环境中如果你想删除源文件中的行,使用带 -i 选项的 sed 命令。

下面的所有脚本都是fish shell

Terminal window
for f in *
echo $f | sed 's#a#b#g' | xargs mv -f $f
end

查看句柄数

Terminal window
$ ulimit -a
Maximum size of core files created (kB, -c) 0
Maximum size of a process’s data segment (kB, -d) unlimited
Maximum size of files created by the shell (kB, -f) unlimited
Maximum size that may be locked into memory (kB, -l) unlimited
Maximum resident set size (kB, -m) unlimited
Maximum number of open file descriptors (-n) 256
Maximum stack size (kB, -s) 8192
Maximum amount of cpu time in seconds (seconds, -t) unlimited
Maximum number of processes available to a single user (-u) 2784
Maximum amount of virtual memory available to the shell (kB, -v) unlimited
Terminal window
lsof|awk '{print $2}'|wc -l

根据打开文件句柄的数量降序排列

Section titled “根据打开文件句柄的数量降序排列”
Terminal window
lsof|awk '{print $2}'|sort|uniq -c|sort -nr|more