linux mysql io压力大_MySQL 调优基础(四) Linux 磁盘IO_MySQL

1. IO处理过程

磁盘IO经常会成为系统的一个瓶颈,特别是对于运行数据库的系统而言。数据从磁盘读取到内存,在到CPU缓存和寄存器,然后进行处理,最后写回磁盘,中间要经过很多的过程,下图是一个以write为例的 Linux 磁盘IO子系统的架构:

144523Y4C1X0-16044.jpg

可以看到IO操作分成了四个层面:

1)文件系统缓存:处理数据必须先从磁盘读到缓存,然后修改,然后刷会磁盘。缓存的刷新涉及到两个参数:vm.dirty_background_ratio、vm.dirty_ratio。还有刷新写回时,使用到 bio 结构,bio的组成是由磁盘上相邻的block组成的,所以这里进行了优化。

2)block layer:该层就涉及到 IO调度算法,IO调度算法在mysql服务器是一个很重要的调优手段。系统中所有进程申请的IO操作,全部在这里进行排队,等待调度,然后写回磁盘。调度算法有四种:

1> Anticipatory: 适用于个人PC,单磁盘系统;

2> CFQ(Complete Fair Queuing):默认的IO调度算法,完全公平的排队调度算法。每一个进程的IO请求会安排进一个专门的IO队列,然后按照进程组来公平的调度IO,也就是每一个进程组之间按照公平的方式来调度IO。显然他适合多用户的系统,但是极为不适合作为数据库系统的IO调度算法,因为显而易见,数据库系统中,数据库进程肯定是IO最多的一个进程组,然后它却只能获得和其它进程一样多的IO调度机会。所以显然这是极为不合理的。数据库系统绝对不要使用该调度算法。

3> Deadline: 按照截止期限来循环在各个IO队列中进行调度,所以它提供了一个近实时的IO系统,并且磁盘throughput也很好,也不会造成starvation.一般mysql系统建议采用该调度算法。

4> NOOP: 简单的FIFO队列进行调度,No operation的意思是,它没有进行额外的将临近的IO进行合并的操作,所以它对CPU的使用极少。该调度算法特别适合于SSD。因为SSD在对待顺序IO和随机IO没有什么区别。所以它不需要对临近的IO进行合并。避免了合并操作对CPU的使用。

所以一般而言,对于mysql的系统,如果是SSD,那么应该使用NOOP调度算法,如果是磁盘,就应该使用Deadline调度算法。

查看与修改IO调度算法:

临时修改:

[root@localhost ~]# cat /sys/block/sda/queue/scheduler

noop anticipatory deadline [cfq]

[root@localhost ~]# echo noop > /sys/block/sda/queue/scheduler

[root@localhost ~]# cat /sys/block/sda/queue/scheduler

[noop] anticipatory deadline cfq

永久修改:

# vi /boot/grub/menu.lst

更改到如下内容:

kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet

重启之后,查看调度方法:

# cat /sys/block/sda/queue/scheduler

noop anticipatory [deadline] cfq

已经是deadline了

3)磁盘驱动层:对于顺序读系统而言,很容易在磁盘接口层的带宽上成为瓶颈所在;

4)磁盘:对于随机读多的系统而言,磁盘很容易成为瓶颈所在,一般的优化就是使用RAID或者换SSD;

2. IO瓶颈检测

2.1 使用 iostat 查看磁盘IO

显示单位问题:默认iostat是以磁盘的block为单位,也可以使用 -k 来指定以 kilobytes 为单位,或者使用 -m 指定 megabytes 为单位;

统计开始时间问题:默认iostat和vmstat相似,默认第一次/行都是从开机到目前的一个数据,可以使用 -y 选项去掉第一次/行的数据;

CPU与磁盘: iostat 默认会显示cpu和磁盘的数据,如果只要cpu数据可以使用 -c 选项,如果只需要磁盘数据,可以使用 -d 选项;

时间间隔和重复次数:[interval [times]] 表示磁盘统计数据的间隔时间和次数;

-x : 该选项显示具体的扩展信息;

[root@localhost ~]# iostat

Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/09/2015 _i686_ (1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.60 0.00 7.80 0.31 0.00 91.30

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn

scd0 0.02 0.21 0.00 536 0

sda 2.00 78.60 8.43 198702 21312[root@localhost ~]# iostat -c

Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/09/2015 _i686_ (1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.48 0.00 6.51 0.25 0.00 92.76

[root@localhost ~]# iostat -d -k

Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/09/2015 _i686_ (1 CPU)

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

scd0 0.02 0.08 0.00 268 0

sda 1.69 31.17 4.15 99363 13224

[root@localhost ~]# iostat -d -m

Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/09/2015 _i686_ (1 CPU)

Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn

scd0 0.02 0.00 0.00 0 0

sda 1.69 0.03 0.00 97 12

[root@localhost ~]# iostat -d -m -x

Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/09/2015 _i686_ (1 CPU)

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

scd0 0.02 0.00 0.02 0.00 0.00 0.00 10.94 0.00 4.96 4.88 0.01

sda 1.22 0.48 1.13 0.56 0.03 0.00 41.66 0.01 6.83 5.27 0.89

[root@localhost ~]# iostat -d -m -x 2 3

Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/09/2015 _i686_ (1 CPU)

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

scd0 0.02 0.00 0.01 0.00 0.00 0.00 10.94 0.00 4.96 4.88 0.01

sda 1.19 0.48 1.10 0.55 0.03 0.00 41.52 0.01 6.81 5.25 0.87

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda 0.00 0.00 0.00 0.51 0.00 0.00 8.00 0.00 3.00 3.00 0.15

[root@localhost ~]# iostat -y -d -m -x 2 3

Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/09/2015 _i686_ (1 CPU)

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

字段含义:

Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn 分别表示:每秒读取block的个数,每秒写block的个数,总共读了多少个block,总共写了多少个block

tps: Indicate the number of transfers per second that were issued to the device. A transfer is an I/O request to the device. Multiple logical requests can be combined into a single I/O request to the device. A transfer is of indeterminate size.(就是对磁盘每秒请求多少次IO操作)

rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

rrqm/s wrqm/s 表示的磁盘读和写时每秒发生多少次相邻磁盘的merge操作;rrqm: read request merge; wrqm:write request merge

r/s w/s 表示每秒读的次数,写的次数;

rMB/s wMB/s 表示每秒读多少MB,写多少MB

avgrq-sz:The average size (in sectors) of the requests that were issued to the device. 平均一个IO请求涉及到多少个sector

avgqu-sz:The average queue length of the requests that were issued to the device. IO队列的平均长度,该数值很重要。

await:The average time (in milliseconds) for I/O requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them.平均每一个IO花费了多少毫秒(包括在IO队列中的排队时间和读写操作花费的时间)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。

svctm:弃用

%util :Percentage of CPU time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100%. 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备 的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因 为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

CPU的 %iowait io等待很高;

磁盘的 avgqu-sz数值很大;await数值很高;%util数值很高;都可能预示着磁盘存在瓶颈或者磁盘出现问题或者故障。

2.2 使用 iostat 查看磁盘每个分区的IO

上面查看的都是整个磁盘的IO情况,下面的命令可以查看具体某个磁盘的所有分区的IO情况:

[root@localhost ~]# iostat -x -d -m -p sda 2 3

Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/09/2015 _i686_ (1 CPU)

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

sda 0.82 0.43 0.76 0.52 0.02 0.00 38.49 0.01 6.27 4.82 0.62

sda1 0.80 0.42 0.53 0.51 0.02 0.00 45.09 0.01 6.92 5.50 0.57

sda2 0.01 0.02 0.12 0.01 0.00 0.00 9.70 0.00 2.95 2.79 0.04

sda3 0.01 0.00 0.07 0.00 0.00 0.00 8.67 0.00 3.72 3.65 0.03

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util

sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

sda3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

[root@localhost ~]# iostat -d -m -p sda 2 3

Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/09/2015 _i686_ (1 CPU)

Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn

sda 1.25 0.02 0.00 97 18

sda1 1.02 0.02 0.00 92 17

sda2 0.13 0.00 0.00 2 0

sda3 0.07 0.00 0.00 1 0

Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn

sda 0.00 0.00 0.00 0 0

sda1 0.00 0.00 0.00 0 0

sda2 0.00 0.00 0.00 0 0

sda3 0.00 0.00 0.00 0 0

Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn

sda 0.00 0.00 0.00 0 0

sda1 0.00 0.00 0.00 0 0

sda2 0.00 0.00 0.00 0 0

sda3 0.00 0.00 0.00 0 0

2.3 使用 vmstat 查看磁盘IO

[root@localhost ~]# vmstat 2 4

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

0 0 0 454900 21808 76776 0 0 20 4 97 81 0 5 95 0 0

0 0 0 454892 21808 76772 0 0 0 8 83 106 0 3 97 0 0

1 0 0 454760 21816 76772 0 0 0 44 101 153 1 5 94 0 0

0 0 0 454760 21816 76784 0 0 0 0 57 68 0 1 99 0 0

bi: Blocks received from a block device (blocks/s). 每秒读取多少个block到内存

bo: Blocks sent to a block device (blocks/s). 每秒内存写出多少个block到磁盘

2.4 使用 sar -b 查看磁盘IO

[root@localhost ~]# sar -b 2 4

Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/09/2015 _i686_ (1 CPU)

03:53:21 PM tps rtps wtps bread/s bwrtn/s

03:53:23 PM 0.00 0.00 0.00 0.00 0.00

03:53:25 PM 0.00 0.00 0.00 0.00 0.00

03:53:27 PM 0.00 0.00 0.00 0.00 0.00

03:53:29 PM 0.00 0.00 0.00 0.00 0.00

Average: 0.00 0.00 0.00 0.00 0.00

tps: 上面有介绍;rtps: 表示读的tps;wtps: 表示写的tps;

bread/s: 每秒读多少个block;bwrtn/s: 每秒写多少个block;

2.5 使用 iotop 找到IO最多的进程/线程

iotop类似于top命令,默认按照IO排序:

iotop :

144523Y4H1X0-2OT.jpg

iotop 是可以交互的:

Use the left and right arrows to change the sorting, r to reverse the sorting order, o to toggle the --only

option, p to toggle the --processes option, a to toggle the --accumulated option, q to quit or i to change the

priority of a thread or a process’ thread(s). Any other key will force a refresh.

1)利用左右键 可以选择排序的字段,默认按照IO>倒序,可以按照SWAPIN,DISK WRITE 等等字段排序,使用左右方向键即可;

2)利用 p键 可以在按照 进程显示 和按照 线程显示之间切换;

3)r 键可以改变排序的方向:倒序 和 顺序

查看mysqld的IO:

iotop -k -u mysql (-k 表示KB,-u mysql表示显示mysql用户的所有进程的IO):

144523Y4J5310-3YF.jpg

3. 实例分析

$iostat -d -k 1 |grep sda10

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

sda10 60.72 18.95 71.53 395637647 1493241908

sda10 299.02 4266.67 129.41 4352 132

sda10 483.84 4589.90 4117.17 4544 4076

sda10 218.00 3360.00 100.00 3360 100

sda10 546.00 8784.00 124.00 8784 124

sda10 827.00 13232.00 136.00 13232 136

上面看到,磁盘每秒传输次数平均约400;每秒磁盘读取约5MB,写入约1MB。

iostat -d -x -k 1

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util

sda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29

sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25

sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24

可以看到磁盘的平均响应时间<5ms,磁盘使用率>80。磁盘响应正常,但是已经很繁忙了。

4. 磁盘IO优化

磁盘IO在优化之前,首先要弄清楚系统的IO情况,是随机IO多,还是顺序IO多,是大文件IO多,还是小文件IO多(小文件IO一般也就是随机IO)。比如随机IO多,那么就可以通过加磁盘使用RAID技术来优化,如果是顺序IO遇到瓶颈,一般可能是磁盘驱动的带宽有瓶颈,就可以换一个更快的disk controller。搞清楚是磁盘有瓶颈,还是磁盘驱动的带宽有瓶颈。

因为磁盘IO的操作分成了4个层面,所以IO的优化也可以从这四个方面入手:

1)正对mysql系统的调优,还需要选择正确的IO调度算法,如果是SSD,选择NOOP调度算法,如果是磁盘,那么选择deadline调度算法;

2)针对mysql还显然可以通过maser-slave来读写分离进行磁盘IO优化。

3)另外增大内存,可以对更多的磁盘文件进行缓存,也能减轻IO压力。

4)还有文件系统的挂载选项 noatime, nodiratime也能减轻IO压力,另外选择正确的文件系统也能提高磁盘的tps. mysql数据库推荐使用XFS文件系统。

注:上面显示的磁盘IO的数据,很多都是0,这是因为数据来自于虚拟机中的Linux系统。

f68f2add0b68e4f9810432fce46917b7.png

相关标签:磁盘 基础

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql可以存储标点么_MySQL查询(进阶)(每个标点都是重点)

MySQL 是工作中很普遍的需要用到的,所以必须掌握,而 之前我们一直说的都是怎么存.你只会存不会取有个屁用.所以希望大家在如何查询读取数据这方面多下点功夫.这篇和上一篇都是干货,我也是第一次学.反正我就是这样理解,这样一遍一遍写,一遍一遍看的才慢慢有点感觉的.目前还整理的…

【HDU - 1263】 水果(STL)

题干&#xff1a; 夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了. Input 第一行正整数N(0<N<10)表示有N组测试数…

mysql死锁的排查方法_MySQL死锁系列-线上死锁问题排查思路

前言MySQL 死锁异常是我们经常会遇到的线上异常类别&#xff0c;一旦线上业务日间复杂&#xff0c;各种业务操作之间往往会产生锁冲突&#xff0c;有些会导致死锁异常。这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现&#xff0c;并且分析解决时还需要了解 MySQL…

ACM - 欧拉函数(内容)

欧拉函数 &#xff1a; 欧拉函数是数论中很重要的一个函数&#xff0c;欧拉函数是指&#xff1a;对于一个正整数 n &#xff0c;小于 n 且和 n 互质的正整数&#xff08;包括 1&#xff09;的个数&#xff0c;记作 φ(n) 。 完全余数集合&#xff1a; 定义小于 n 且和 n 互质的…

分布式锁和mysql事物扣库存_浅谈库存扣减和锁

先说场景:物品W现在库存剩余1个, 用户P1,P2同时购买.则只有1人能购买成功.(前提是不允许超卖)秒杀也是类似的情况, 只有1件商品,N个用户同时抢购,只有1人能抢到..这里不谈秒杀设计,不谈使用队列等使请求串行化,就谈下怎么用锁来保证数据正确.常见的实现方案有以下几种:1.代码同…

【POJ - 2631 】Roads in the North(树的直径)

题干&#xff1a; Building and maintaining roads among communities in the far North is an expensive business. With this in mind, the roads are build such that there is only one route from a village to a village that does not pass through some other village…

齐博php百度编辑器上传图片_php版百度编辑器ueditor怎样给上传图片自动添加水印?...

百度ueditor是广泛使用的所见即所得图文排版编辑插件&#xff0c;功能比较完善&#xff0c;美中不足就是不支持自动加水印。万维景盛工程师搜集到php版ueditor自动加水印的教程&#xff0c;希望对大家有帮助。1.打开ueditor目录下的php目录下的config.json 文件在上传配置项添加…

【HDU - 1285】确定比赛名次 (拓扑排序)

题干&#xff1a; 有N个比赛队&#xff08;1<N<500&#xff09;&#xff0c;编号依次为1&#xff0c;2&#xff0c;3&#xff0c;。。。。&#xff0c;N进行比赛&#xff0c;比赛结束后&#xff0c;裁判委员会要将所有参赛队伍从前往后依次排名&#xff0c;但现在裁判委…

mysql dql_Mysql中的DQL查询语句

欢迎进入Linux社区论坛&#xff0c;与200万技术人员互动交流 >>进入 Mysql中的DQL查询语句 1、查询所有列 --查询 学生 表所有记录(行) select *from 学生 --带条件的查询 select *from 学生 where 年龄19 2、查询指定的列 --查询 所有人的姓名和性别 select 姓名,性欢迎…

【POJ - 1028】 Web Navigation( 栈 or 模拟队列 )

题干&#xff1a; Standard web browsers contain features to move backward and forward among the pages recently visited. One way to implement these features is to use two stacks to keep track of the pages that can be reached by moving backward and forward. …

python循环post请求_循环post请求太多

我正在做一个scrapy spider&#xff0c;我必须发送一个post请求循环才能转到下一个页面&#xff0c;问题是它只发送一个post请求。querystring更改每个页面的元素“currentPage”&#xff0c;因此我必须为每个页面更改此键的值并发送post。但是&#xff0c;正如我之前所说&…

【POJ - 2387】 Til the Cows Come Home(单源最短路Dijkstra算法)

题干&#xff1a; Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the morning milking. Bessie needs her beauty sleep, so she wants to get back as quickly as possible. Farmer Jo…

递归Java_递归的Java实现

递归是一种应用非常广泛的算法(或者编程技巧)。递归求解问题的分解过程&#xff0c;去的过程叫“递”&#xff0c;回来的过程叫“归”。递归需要满足的三个条件&#xff1a;1. 一个问题的解可以分解为几个子问题的解&#xff1b;2. 这个问题与分解之后的子问题&#xff0c;除了…

【HDU - 2112】 HDU Today(dijkstra单源最短路 + map转换)

题干&#xff1a; HDU Today Time Limit : 15000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 11 Accepted Submission(s) : 5 Problem Description 经过锦囊相助&#xff0c;海东集团终于度过了危机&#xff0c;从此&#…

JAVA线程并发数量控制_线程同步工具(二)控制并发访问多个资源

声明&#xff1a;本文是《 Java 7 Concurrency Cookbook》的第三章&#xff0c; 作者&#xff1a; Javier Fernndez Gonzlez 译者&#xff1a;郑玉婷控制并发访问多个资源在并发访问资源的控制中&#xff0c;你学习了信号量(semaphores)的基本知识。在上个指南&#xff0c;你实…

*【51nod - 1459】迷宫游戏(记录双向权值的Dijkstra单源最短路)

题干&#xff1a; 你来到一个迷宫前。该迷宫由若干个房间组成&#xff0c;每个房间都有一个得分&#xff0c;第一次进入这个房间&#xff0c;你就可以得到这个分数。还有若干双向道路连结这些房间&#xff0c;你沿着这些道路从一个房间走到另外一个房间需要一些时间。游戏规定…

算法--背包九讲(详细讲解+代码)

背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物品 第九讲 背包问题问法的变化 附&#xff1a;USACO中的背包问题 前…

java中白盒测试用例_基于JAVA开发的中国象棋游戏的开发与研究白盒测试用例.doc...

中国象棋白盒测试用例文件状态当前版本V1.0草稿作 者梁世聪完成日期2012/6/17文档模板SSP-VER-T13-V1.0密 级变更历史版本完成日期变更记录作者批准签字V1.02012/6/17无梁世聪梁世聪目 录目录1 目的12 范围13 被测模块列表14 模块逻辑结构14.1 模块逻辑结构图14.2 模块功能定义…

【POJ - 1502】MPI Maelstrom(Dijkstra单源最短路--求一点到其余个点的最小值的最大值)

题干&#xff1a; BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distributed shared memory machine with a hierarchical communication subsystem. Valentine McKees research advisor, Jack Swigert, has asked her to ben…

java 强制清除缓存_IDEA强制清除Maven缓存的方法示例

重新导入依赖的常见方式下面图中的刷新按钮&#xff0c;在我的机器上&#xff0c;并不能每次都正确导入pom.xml中写的依赖项&#xff0c;而是导入之前pom.xml的依赖(读了缓存中的pom.xml)。当然除了这些&#xff0c;还可以下面这样&#xff1a;存在的问题上面虽然是重新导入Mav…