邓老师 发布的文章
vim插件(vim-emmet)安装步骤
Vim前端开发神器--Emmet(html编辑插件)
1)去home目录下,并查看home目录下是否有.vim目录和.vimrc文件,如果没有,则新建,执行以下命令:
cd ~/.vim
touch .vimrc
2)安装pathogen.vim,执行以下命令
pathogen是安装其他包的工具
创建目录:
mkdir -p ~/.vim/autoload ~/.vim/bundle
安装pathogen:
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
curl是软件安装的一种方式
3)安装git
sudo apt-get install git
使用以下命令测试git是否安装成功
git --version
4) 使用pathogen.vim和git安装vim-emmet
5).进入.vim的bundle目录
cd ~/.vim/bundle
6).下载插件
git clone https://github.com/mattn/emmet-vim.git
7).编辑.vimrc
vim ~/.vimrc
输入以下内容:
"启动pathogen插件管理器
execute pathogen#infect()
"默认的触发键是ctrl+y+,
"更改触发键为ctrl+e
let g:user_emmet_expandabbr_key = '<C-e>'
"在每行前面显示文本行数:
set nu
"设置tab键缩进间距为两个英文字母长度
set tabstop = 2
"设置换行后缩进对齐
set autoindent
8)测试
测试
vim index.html
输入 html:5
然后用快捷建 ctrl+e
效果
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
_
</body>
</html>
嵌套操作符
使用 > 生成元素子节点
<!-- div>ul>li -->
<div>
<ul>
<li></li>
</ul>
</div>
使用 + 生成元素兄弟节点
<!-- div+p+bq -->
<div></div>
<p></p>
<blockquote></blockquote>
操作符 ^ 的作用和 > 刚好相反
用 ^ 可以在父级生成新的节点
<!-- div+div>p>span+em^bq -->
<div></div>
<div>
<p><span></span><em></em></p>
<blockquote></blockquote>
</div>
用n个 ^ ,就可以在第n父级生成新的节点
<!-- div+div>p>span+em^^^bq -->
<div></div>
<div>
<p><span></span><em></em></p>
</div>
<blockquote></blockquote>
使用 * 生成多个相同元素
<!-- ul>li*5 -->
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
圆括号 () 是Emmet的高级用法,用来实现比较复杂的DOM结构
<!-- div>(header>ul>li*2>a)+footer>p -->
<div>
<header>
<ul>
<li><a href=""></a></li>
<li><a href=""></a></li>
</ul>
</header>
<footer>
<p></p>
</footer>
</div>
还可以嵌套使用圆括号 ()
<!-- (div>dl>(dt+dd)*3)+footer>p -->
<div>
<dl>
<dt></dt>
<dd></dd>
<dt></dt>
<dd></dd>
<dt></dt>
<dd></dd>
</dl>
</div>
<footer>
<p></p>
</footer>
属性操作
Emmet给元素添加ID和CLASS的方法和CSS的语法类似
<!-- div#header+div.page+div#footer.class1.class2.class3 -->
<div id="header"></div>
<div class="page"></div>
<div id="footer" class="class1 class2 class3"></div>
使用[attr]标记来添加自定义属性
<!-- td[title="Hello world!" colspan=3] -->
<td title="Hello world!" colspan="3"></td>
使用 $ 操作符可以对重复元素进行有序编号
<!-- ul>li.item$*5 -->
<ul>
<li class="item1"></li>
<li class="item2"></li>
<li class="item3"></li>
<li class="item4"></li>
<li class="item5"></li>
</ul>
还可以用多个 $ 定义编号的格式
<!-- ul>li.item$$$*5 -->
<ul>
<li class="item001"></li>
<li class="item002"></li>
<li class="item003"></li>
<li class="item004"></li>
<li class="item005"></li>
</ul>
使用 @ 修饰符可以改变编号的格式
在 $ 后面添加 @- 可以改变编号顺序
<!-- ul>li.item$@-*5 -->
<ul>
<li class="item5"></li>
<li class="item4"></li>
<li class="item3"></li>
<li class="item2"></li>
<li class="item1"></li>
</ul>
在 $ 后面添加 @N 可以改变编号基数
<!-- ul>li.item$@3*5 -->
<ul>
<li class="item3"></li>
<li class="item4"></li>
<li class="item5"></li>
<li class="item6"></li>
<li class="item7"></li>
</ul>
还可以组合使用上面的修饰符
<!-- ul>li.item$@-3*5 -->
<ul>
<li class="item7"></li>
<li class="item6"></li>
<li class="item5"></li>
<li class="item4"></li>
<li class="item3"></li>
</ul>
文本操作
Emmet使用 Text:{} 给元素添加文本内容
a{Click me}--><a href="">Click me</a>
<!-- a{click}+b{here} -->
<a href="">click</a><b>here</b>
<!-- a>{click}+b{here} -->
<a href="">click<b>here</b></a>
<!-- p>{Click }+a{here}+{ to continue} -->
<p>Click <a href="">here</a> to continue</p>
其他例子
<!-- #page>div.logo+ul#navigation>li*5>a{Item $} -->
<div id="page">
<div class="logo"></div>
<ul id="navigation">
<li><a href="">Item 1</a></li>
<li><a href="">Item 2</a></li>
<li><a href="">Item 3</a></li>
<li><a href="">Item 4</a></li>
<li><a href="">Item 5</a></li>
</ul>
</div>
Emmet没有预设任何标签名,所以可以使用任何可用名称来生成HTML标签:div →
或 foo →其他常用快捷键:
图像尺寸
win7 win10 自带 md5 sha1 校验工具
cmd 里面的 certutil
Power Shell 里面的 Get-FileHash
用法: CertUtil [选项] -hashfile InFile [HashAlgorithm]
certutil -hashfile D:\1.txt
certutil -hashfile D:\1.txt md5
Get-FileHash D:\1.txt
Get-FileHash D:\1.txt -Algorithm md5
mysql压力(并发)测试--mysqlslap
mysqlslap -hlocalhost -uroot -p123456 -P3306 --concurrency=1100 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=1000 --debug-info
执行结果如下:
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 1.630 seconds
Minimum number of seconds to run all queries: 1.630 seconds
Maximum number of seconds to run all queries: 1.630 seconds
Number of clients running queries: 1100
Average number of queries per client: 0
User time 0.53, System time 0.92
常用参数 [options] 详细说明:
--auto-generate-sql, -a 自动生成测试表和数据,表示用mysqlslap工具自己生成的SQL脚本来测试并发压力。
--auto-generate-sql-load-type=type 测试语句的类型。代表要测试的环境是读操作还是写操作还是两者混合的。取值包括:read,key,write,update和mixed(默认)。
--auto-generate-sql-add-auto-increment 代表对生成的表自动添加auto_increment列,从5.1.18版本开始支持。
--number-char-cols=N, -x N 自动生成的测试表中包含多少个字符类型的列,默认1
--number-int-cols=N, -y N 自动生成的测试表中包含多少个数字类型的列,默认1
--number-of-queries=N 总的测试查询次数(并发客户数×每客户查询次数)
--query=name,-q 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
--create-schema 代表自定义的测试库名称,测试的schema,MySQL中schema也就是database。
--commint=N 多少条DML后提交一次。
--compress, -C 如果服务器和客户端支持都压缩,则压缩信息传递。
--concurrency=N, -c N 表示并发量,也就是模拟多少个客户端同时执行select。可指定多个值,以逗号或者--delimiter参数指定的值做为分隔符。例如:--concurrency=100,200,500。
--engine=engine_name, -e engine_name 代表要测试的引擎,可以有多个,用分隔符隔开。例如:--engines=myisam,innodb。
--iterations=N, -i N 测试执行的迭代次数,代表要在不同并发环境下,各自运行测试多少次。
--only-print 只打印测试语句而不实际执行。
--detach=N 执行N条语句后断开重连。
--debug-info, -T 打印内存和CPU的相关信息。
说明:
测试的过程需要生成测试表,插入测试数据,这个mysqlslap可以自动生成,默认生成一个mysqlslap的schema,如果已经存在则先删除。可以用--only-print来打印实际的测试过程,整个测试完成后不会在数据库中留下痕迹。
各种测试参数实例(-p后面跟的是mysql的root密码):
单线程测试。测试做了什么。
mysqlslap -a -uroot -p123456
多线程测试。使用–concurrency来模拟并发连接。
mysqlslap -a -c 100 -uroot -p123456
迭代测试。用于需要多次执行测试得到平均值。
mysqlslap -a -i 10 -uroot -p123456
mysqlslap ---auto-generate-sql-add-autoincrement -a -uroot -p123456
mysqlslap -a --auto-generate-sql-load-type=read -uroot -p123456
mysqlslap -a --auto-generate-secondary-indexes=3 -uroot -p123456
mysqlslap -a --auto-generate-sql-write-number=1000 -uroot -p123456
mysqlslap --create-schema world -q "select count(*) from City" -uroot -p123456
mysqlslap -a -e innodb -uroot -p123456
mysqlslap -a --number-of-queries=10 -uroot -p123456
测试同时不同的存储引擎的性能进行对比:
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -p123456
执行一次测试,分别50和100个并发,执行1000次总查询:
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info -uroot -p123456
50和100个并发分别得到一次测试结果(Benchmark),并发数越多,执行完所有查询的时间越长。为了准确起见,可以多迭代测试几次:
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info -uroot -p123456
MySQL使用存储过程插入千万级数据如何提升效率?
高并发下,php与redis实现的抢购、秒杀功能
InnoDB性能调优基础(进阶)
https://blog.csdn.net/zhu19774279/article/details/38645663
- 硬件
今天,大数据集(largedatasets)的内存一般都是数以百G,即使是T级别也没什么好惊讶。MySQL需要足够多的内存,以提供最佳性能,如缓存热点数据、索引、大量变化(ongoing changes)。InnoDB有更短的响应时间,并能以更合理的方式利用磁盘IO。从CPU来看,当然是核越多、速度越快越好。32/64核的CPU已经越来越普遍,最新版本的MySQL在对多核CPU的支持上也比以前的版本要好得多。再来看存储,SSD正在取代传统的机械硬盘,并获得了巨大的成功,当然这是用钱来换最好的性能。RAID 10仍然是多数情况下的首选,但要确保你的RAID控制器能够很好的支持SSD硬盘,以免成为瓶颈。当然如果你对IOPS有很高的需求,可以选择多个PCI-e Flash卡。
- 操作系统
Linux是最常见的高性能MySQL的服务器。请确保使用最新的内核和现代的文件系统,如EXT 4或XFS。两种文件系统都有各自的优缺点:如XFS删大文件时比较快,EXT4却能让SSD硬盘有更好的性能。选择权在你手上。这篇文章(www.ssdperformanceblog.com/2013/04/testing-the-micron-p320h/)(很奇怪这个网站用Firefox、chrome或IE都打不开,翻墙也打不开,实在不知道什么原因——译者注)告诉你如何让EXT4比XFS有更好的性能。当你的表特别多,而你又使用了innodb_file_per_table参数的时候,noatime和nodiratime将会给你带来一点点的性能提升。Linux的默认I/O调度程序是CFQ(Completely Fair Queuing),实际上多数情况下Noop/Deadline有更好的性能。对于MySQL专用服务器,将swappiness设为0是一个不错的选择,因为这可以降低swapping的延迟。要确保MySQL的主机不会出现内存不足的情况。swapping对MySQL是有害的,并且会阻止内存中的缓存。想了解更多有关swapping的知识,可以阅读这篇文章(www.mysqlperformanceblog.com/2008/04/06/should-you-have-your-swap-file-enabled-while-running-mysql/)。
- MySQL InnoDB 配置
从5.5开始,InnoDB是默认的引擎,所以这些参数能够比以前更好的优化性能。最重要的是以下这些:
innodb_buffer_pool_size:缓冲池对InnoDB的影响很大,一定要配置正确,因此要给这个值分配足够的内存。通常是可用内存的70%-80%。更确切地说,如果你的内存比数据集大那么一点,那么让这个值比数据库的大小大一点最好,当然你需要注意数据库大小的增长,并经常调整innodb缓冲池的大小,使二者大小保证一致。(这句话没看太懂,原文是:More precisely, if you have RAM bigger than your dataset setting itbit larger should be appropriate with that keep in account of your databasegrowth and re-adjust innodb buffer pool size accordingly.)如果你用的是PerconaServer 5.1或Percona Server 5.5,那么在代码级别对InnoDB的缓冲有优化,相关知识可以看这篇文章http://www.percona.com/doc/percona-server/5.5/scalability/innodb_split_buf_pool_mutex.html。
innodb_buffer_pool_instances:InnoDB1.1和MySQL5.5中介绍了多Innodb缓冲池。5.5中这个值默认大小是1,而5.6中是8。这个参数的取值范围是1-64。在高并发的任务中允许使用innodb_buffer_pool_instances会非常有效,因为它能够减少全局互斥锁(global mutexes)的存在。(这个参数在CentOS版的MySQL-5.5.39的配置文件中没有,不知原文作者说的5.5中的默认值哪来的——译者注)
Dump/Restore Buffer Pool:这个参数能够在重启时,提高保存、恢复缓冲池内容的速度。这个特性最早出现在Percona Server 5.5中,可以通过这两篇文章做进一步了解(http://www.percona.com/doc/percona-server/5.5/management/innodb_lru_dump_restore.html?id=percona-server:features:innodb_lru_dump_restore,http://www.mysqlperformanceblog.com/2010/01/20/xtradb-feature-save-restore-buffer-pool/)。MySQL 5.6中也加入了该特性,要在数据库启动或关闭时自动dump数据,需要将innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup设置为ON。
innodb_log_file_size:足够大的InnoDB事务日志,对于稳定的、高质量写性能至关重要。但巨大的日志文件同样意味着崩溃以后的恢复会很慢。当然,在5.5进行巨大改进以后,这一点已经不再是经常争论的重点。MySQL 5.6将默认值从5MB调整到50MB,但这个值对于很多情况依然太小。另外,在MySQL 5.6中,如果这个参数值被改变,那么MySQL将会在重启的时候自动调整大小。在MySQL 5.6中,合并后的日志文件大小从4G调整到512G。有关日志最佳大小的问题,可以阅读这篇文章(http://www.mysqlperformanceblog.com/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/)
innodb_log_buffer_size:InnoDB的写操作,将数据写入到内存中的日志缓存中,由于InnoDB在事务提交前,并不将改变的日志写入到磁盘中,因此在大事务中,可以减轻磁盘I/O的压力。通常情况下,如果不是写入大量的超大二进制数据(a lot of huge blobs),4MB-8MB已经足够了。
innodb_flush_log_at_trx_commit:这个值设为1时,将会在每次日志提交时,将日志缓冲(log buffer)中的内容刷入硬盘,以确保数据最大限度的完整性,当然这样也会对性能带来影响。如果设为2,表示每次日志提交时,仅仅将日志缓冲中的内容刷入操作系统的文件缓存。如果你对ACID不那么关注,并且对于OS崩溃前最后一两秒的事务丢失不那么在意的话,设为2将带来更好的性能。
innodb_thread_concurrency:随着InnoDB的改善,现在推荐大家使用默认值0,即由InnoDB引擎自己控制并发。如果你看到并发相关的讨论,可以调整这个参数。推荐值的简单计算方法是(CPU的数量+硬盘数量)*2(2 times the number of CPUs plus the number of disks)。这是一个动态变量,这意味着改变这个值不用重启MySQL即可生效。
innodb_flush_method:DIRECT_IO能减轻I/O的压力。直接I/O不进行缓存,如果设置为O_DIRECT可以避免缓冲池与文件系统的双缓冲,但是需要有RAID控制器以及电池备份的写缓存。(原文不是这样,但原文没看太懂Given that you have hardware RAID controller and battery-backedwrite cache.)
innodb_file_per_table:从MySQL 5.6开始,这个值默认是ON。这个是默认值是因为可以避免产生巨大的共享表空间,并且可以在drop和truncate一张表的时候,迅速释放空间。独立的表空间同样在Xtrabackup的部分备份时有优势。
除了以上这些,Percona Server 5.5和MySQL 5.6对InnoDB有很多增强。在Percona Server 5.5的XtraDB中加入了Persistentoptimizer statistics,通过innodb_use_sys_stats_table参数控制,相关知识可以阅读这篇文章(http://www.percona.com/doc/percona-server/5.5/diagnostics/innodb_stats.html?id=percona-server:features:innodb_stats&redirect=1#innodb_use_sys_stats_table),在MySQL 5.6中也引入了这个特性。在MySQL5.6中,使用两个新表mysql.innodb_index_stats和mysql.innodb_table_stats来存储persistentstats。通过这个,在查询(query)的时候,能够保证更精确和一致性。更多细节请阅读文档这里http://dev.mysql.com/doc/refman/5.6/en/innodb-performance.html#innodb-persistent-stats。同样PerconaServer 5.5里介绍了来自于线程池的特性,可以阅读这个官方文档http://www.percona.com/doc/percona-server/5.5/performance/threadpool.html。另外线程池的知识还可以还可以阅读这里http://www.mysqlperformanceblog.com/2013/03/16/simcity-outages-traffic-control-and-thread-pool-for-mysql/。
PerconaServer是免费且开源的。是在MySQL基础上修改的,上面有的特性只有Percona Server才有。
还有很多参数可以调整,但是在这篇文章我们只关注InnoDB。
- 为InnoDB优化应用程序
对于应用程序,尤其是以前使用MyISAM引擎的程序来说,需要进行以下调整。
首先,确保在更新操作(update)时使用事务,这样既可以保证一致性,也能够获得更好的性能。其次,如果你的程序有任何写操作,都应该要考虑可能发生的死锁。再次,请检查你的表结构,以确保他们能从InnoDB属性中获得性能改善,如:用主键聚集数据,所有索引都有主键(因此要保证主键短),用主键进行快速查找(试着使用join),大的未压缩的索引(使主键尽可能的简单。)(这一段话不太懂:clustering by primary key, having primary key in all indexes (sokeepprimary key short), fast lookups by primary keys (try to use it in joins),largeunpacked indexes(try to be easy on indexes).)
- 总结
本文几乎覆盖了所有和MySQL性能有关的参数,包括InnoDB的基础或进阶参数、OS的参数和硬件配置。通过这些修改,可以确保所有MySQL服务器的性能都得到优化。
docker 常用命令
1.查看docker版本
docker -v
2.查看镜像仓库中某个镜像
docker search docker镜像
镜像的核心概念
- 容器技术募集硬件资源的目的,是为了运行软件,提供服务
- 镜像是容器中运行软件的集合
Docker镜像仓库: https://hub.docker.com/
3.镜像仓库中下载某个镜像
docker pull ubuntu
4.查看当前已经下载的镜像
docker images
根据"镜像ID"将镜像保存成一个tar文件:
docker save 镜像ID -o 输出文件名.tar
将本地tar镜像载入:
docker load -i 本地tar镜像文件名.tar
载入后会没有tag名称,需要更改tag
docker tag 镜像ID tag名称
5.查看当前所有容器
docker ps -a
6.启动一个新容器
docker run --name 容器名称 -p 宿主端口:容器端口 -d 镜像 -v 宿主数据目录:容器数据目录
跟随宿主主机启动容器
--restart=always
交互式进入容器:
docker exec -it 容器名称 /bin/bash
7.启动/重启/停止一个容器
docker start/restart/stop 容器ID
8.删除一个容器
docker rm -f 容器ID
9.查看运行容器中的进程信息
docker top 容器名称
10.优化Docker镜像代理
查看docker信息
docker info
11.将容器导出为压缩文件
docker export -o 保存文件.tar 容器id或容器名称
优化docker代理
vim /etc/docker/daemon.json
在daemon.json文件中输入以下代理配置
{"registry-mirrors":["https://obou6wyb.mirror.aliyuncs.com"]}
加载代理配置
加载代理配置
systemctl daemon-reload
重启docker服务
systemctl restart docker
查看docker信息 验证配置
docker info