date command

date command 输出指定时区的时间 shell 支持在 date 命令前,指定 TZ 参数,即指定时区,这样 dat e输出将会输出指定时区的时间。TZ 是 timezone 的缩写。 TZ=0 date date 打印的日期格式 默认打印12小时制的 # 默认打印 24小时制时间 vim /etc/profile.d/lctime.sh export LC_TIME=POSIX LC_TIME 选择C语言环境的时间格式类别 -d 参数支持自然语言输入,无符号默认为 + date -d "+1 day" date -d "-1 month" date [OPTION]... [+FORMAT] 日期格式化 date '+%Y-%m-%d %H:%M:%S' 纳秒,毫秒 使用 date +%s%N 可以获得一个纳秒级的unix时间戳(当前时间),然后根据需要截取一部分即可得到毫秒级的精度 # 纳秒 date +%s%N # 毫秒 $(($(date +%s%N)/1000000)) # 毫秒, 另外一种作废的不再建议使用的语法 echo $[$(date +%s%N)/1000000] 参数 %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999) # output date and time in RFC 5322 format. Example: Mon, 14 Aug 2006 02:34:56 -0600 date -R # 设置时间和日期 sudo date -s "04/12/2019 09:03:00" sudo date -s "2019-04-12 09:04:00" # 将系统日期设定成2009年11月3日的命令 date -s 11/03/2009 # 将系统时间设定成下午5点55分55秒的命令 date -s 17:55:55 http://jerrybear.blog.51cto.com/629421/393097 ...

2018-06-20 · 3 min · 552 words · -

Java诊断工具 - btrace

Java诊断工具 - btrace https://github.com/btraceio/btrace/releases 打印慢调用 创建一个java类 // MethodDuration_redis.java import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; import java.util.Date; @BTrace public class MethodDuration_redis{ private static int i=0; @OnMethod(clazz = "com.wiloon.package0.Class0",method = "method0",location=@Location(Kind.RETURN)) public static void printMethodRunTime(@ProbeClassName String probeClassName,@Duration long duration){ long d=duration / 1000000; if (d>9){ //大于9毫秒的调用 i++; println("index: "+ i +", timestamp:"+timestamp("HH:mm:ss")+", "+probeClassName + ", duration: " + d + " ms"); } } } 找到 java 进程并执行 btrace # 打印java进程 jcmd -l # 执行btrace, ctrl-c 退出 /bin/btrace <PID> MethodDuration_redis.java Btrace BTrace 是检查和解决线上的问题的杀器,BTrace 可以通过编写脚本的方式,获取程序执行过程中的一切信息,并且,注意了,不用重启服务,是的,不用重启服务。写好脚本,直接用命令执行即可,不用动原程序的代码。 ...

2018-06-02 · 2 min · 258 words · -

iptables 调试, raw表, LOG

iptables调试, raw表, LOG 启用iptables的日志 iptables -t nat -A POSTROUTING -p icmp -s 192.168.50.215 -j LOG --log-prefix 'iptable-log: ' iptables -t nat -I PREROUTING -p tcp -s 192.168.50.115 --dport 80 -j LOG --log-prefix 'iptable-log: ' # 配置日志级别 iptables -t raw -I OUTPUT -d 10.254.51.153 -j LOG --log-level 7 --log-prefix "raw out: " raw 表使用 PREROUTING 和 OUTPUT 两个链, 因此 raw 可以覆盖所有包。在raw表中支持一个特殊的目标:TRACE,使内核记录下每条匹配该包的对应iptables规则信息。使用raw表内的TRACE target即可实现对iptables规则的跟踪调试。 配置 假设需要对ipv4的ICMP包进行跟踪调试,抓取所有流经本机的ICMP包 iptables -t raw -A OUTPUT -p icmp -j TRACE iptables -t raw -A PREROUTING -p icmp -j TRACE 加载对应内核模块 ...

2018-04-09 · 3 min · 623 words · -

systemd script, systemd unit, 启动脚本

systemd script, systemd unit, 启动脚本 service unit 配置文件 template vim /etc/systemd/system/foo.service [Unit] Description=start proxy After=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/proxy.sh RemainAfterExit=true [Install] WantedBy=multi-user.target [Unit] # 服务启动时会在 journal 里打印 description0 Description=description0 After=network.target sshd-keygen.service [Service] # 脚本路径必须是绝对路径 /bin/sh 为 shell 解释器不能省 ExecStart=/bin/sh /usr/local/bin/shell-script0.sh Environment="GODEBUG='gctrace=1'" Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd" [Install] WantedBy=multi-user.target # 在哪个服务后面启动 (如依赖的服务) Requires=pulseaudio.service # 在哪个服务后面启动 (如依赖的服务) After=pulseaudio.service [Unit] 启动顺序与依赖关系 After 字段: 表示如果 network.target 或 sshd-keygen.service 需要启动, 那么 foo.service 应该在它们之后启动。 相应地,还有一个 Before 字段, 定义 foo.service 应该在哪些服务之前启动。 注意, After 和 Before 字段只涉及启动顺序,不涉及依赖关系。 ConditionPathExists, AssertPathExists: 要求给定的绝对路径文件已经存在,否则不做任何事(condition)或进入failed状态(assert),可在路径前使用!表示条件取反,即不存在时才启动服务。 ConditionPathIsDirectory, AssertPathIsDirectory: 如上,路径存在且是目录时启动。 StartLimitIntervalSec=400 StartLimitBurst=3 [Service] 区块 用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下 Type:定义启动时的进程行为。它有以下几种值。 Type=simple:默认值,执行ExecStart指定的命令,启动主进程 Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出 Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行 Type=dbus:当前服务通过D-Bus启动 Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行 Type=idle:若有其他任务执行完毕,当前服务才会运行 ExecStart:服务启动时要执行的命令 ExecStartPre:启动当前服务之前执行的命令 ExecStartPost:启动当前服务之后执行的命令 ExecReload:重启当前服务时执行的命令 ExecStop:停止当前服务时执行的命令 ExecStopPost:停止当其服务之后执行的命令 RestartSec:自动重启当前服务间隔的秒数 Restart:定义何种情况 Systemd 会自动重启当前服务,no, on-success, on-failure, on-abnormal, on-watchdog, on-abort, or always, 默认值: no TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数 Environment:指定环境变量 EnvironmentFile: 指定文件,可定义多个环境变量,按分行方式存储。 WorkingDirectory, 工作目录, 程序启动时的当前目录。如果使用到 workingdirectory,需要先创建该目录 [Install] 段落相关的指令,它们只在systemctl enable/disable操作时有效。如果期望服务开机自启动,一般只配置一个WantedBy指令,如果不期望服务开机自启动,则Install段落通常省略。主要包含以下内容: WantedBy 本服务设置开机自启动时,在被依赖目标的.wants目录下创建本服务的软链接。例如WantedBy = multi-user.target时,将在/etc/systemd/multi-user.target.wants目录下创建本服务的软链接。 RequiredBy 类似WantedBy,但是是在.requires目录下创建软链接。 Alias 指定创建软链接时链接至本服务配置文件的别名文件。例如reboot.target中配置了Alias=ctrl-alt-del.target,当执行enable时,将创建/etc/systemd/system/ctrl-alt-del.service软链接并指向reboot.target。 DefaultInstance 当是一个模板服务配置文件时(即文件名为Service_Name@.service),该指令指定该模板的默认实例。例如trojan@.service中配置了DefaultInstall=server时,systemctl enable trojan@.service时将创建名为trojan@server.service的软链接。 可以通过以下两个选项来设置服务启动的频率: ...

2018-02-23 · 5 min · 937 words · -

jest

jest https://stackoverflow.com/questions/68956636/how-to-use-esm-tests-with-jest package.json use es module { "type": "module", "devDependencies": { "jest": "^29.7.0" }, "scripts": { "test": "node --experimental-vm-modules ./node_modules/.bin/jest" } } # run all test npm run test # run one test npm run test -- infoq.test.js

2018-02-07 · 1 min · 38 words · -

docker basic, commands

docker basic, commands commands # Docker images by tag docker rmi $(docker images --filter=reference="tag_name_0" -q) # Docker查看容器完整的容器 ID 和镜像 ID docker ps -a --no-trunc docker exec nexus3 cat /nexus-data/admin.password docker ps --filter"name=test-nginx" docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}" docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.Status}}\t{{.Names}}" docker ps --format "table {{.ID}}\t{{.IMAGE}}\t{{.CREATED}}\t{{.STATUS}}\t{{.NAMES}}" docker inspect xxx docker container update --restart=no <containername> # 修改 docker 容器为开机启动 docker container update --restart=always container_0 # 查看 volume 目录 docker info | grep "Docker Root Dir" 批量删除镜像 docker rmi $(docker images | grep "name0" | awk '{print $3}') docker rmi -f $(docker images | grep "name0" | awk '{print $3}') docker restart foo # 列出所有的容器 ID docker ps -aq # 停止所有的容器 docker stop $(docker ps -aq) # 删除所有的容器 docker image ls docker rm $(docker ps -aq) # 删除所有的镜像 docker rmi $(docker images -q) # 复制文件 docker cp mycontainer:/opt/file.txt /opt/local/ docker cp /opt/local/file.txt mycontainer:/opt/ docker port docker port :列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。 ...

2018-01-27 · 6 min · 1129 words · -

DNS

DNS DNS 的本质是什么? Domain Name System = DNS (域名系统) 其实是一个数据库,是用于 TCP/IP 程序的分布式数据库,同时也是一种重要的网络协议。DNS储存了网络中的 IP 地址与对应主机的信息,邮件路由信息和其他网络应用方面的信息,用户通过询问解决库 (解决库发送询问并对DNS回应进行说明) 在 DNS 上查询信息。 DNS的作用是什么? DNS是网络分层里的应用层协议,事实上他是为其他应用层协议工作的,简单说就是把域名,或者说主机名转化为IP地址 (同时也提供反向域名查询的功能) ,类似字典,比如访问 www.baidu.com, 实际访问的是它的IP地址,因为机器识别的是拥有固定格式和含义的IP地址,而域名可以千奇百怪,甚至是中文,不利于识别。还有比如公司内部的域验证,通过分配给员工的域账号登录内网就必须通过DNS来找到域名权限服务器,来认证身份,故有些书上说: DNS是因特网世界里不可缺少的东西。 比如,使用host命令进行DNS查询 host命令用来做DNS查询。如果命令参数是域名,命令会输出关联的IP;如果命令参数是IP,命令则输出关联的域名。 http://www.cnblogs.com/kubixuesheng/p/6260195.html dnsmasq http://blog.wiloon.com/?p=8698&embed=true#?secret=4F3Jvk9nTk dns ttl https://jaminzhang.github.io/dns/DNS-TTL-Understanding-and-Config/ 我们有配置域名时,不同情况下,不同业务下,需要增大或减小 DNS TTL 值。这是为什么呢? 这需要我们重新理解下 DNS TTL 值的含义。 什么是域名的 TTL 值 TTL(Time-To-Live), 就是一条域名解析记录在 DNS 服务器中的存留时间。 当各地的 DNS 服务器接受到解析请求时, 就会向域名指定的 NS 服务器发出解析请求从而获得解析记录; 在获得这个记录之后, 记录会在 DNS 服务器中保存一段时间,这段时间内如果再接到这个域名的解析请求, DNS 服务器将不再向 NS 服务器发出请求, 而是直接返回刚才获得的记录; 而这个记录在 DNS 服务器上保留的时间,就是 TTL 值。 DNS记录中的 ttl 决定了信息的更新频率,如果 ttl 设置为0,每个请求都会发起DNS查询,显然这会造成性能问题,但是DNS的更新、改变延迟会相对非常低 ...

2017-12-17 · 3 min · 501 words · -

journal, journalctl, syslog

journal, journalctl, syslog # -u 指定 unit journalctl -u file-server 清理磁盘空间 # Check current disk usage of journal files sudo journalctl --disk-usage # Delete journal logs older than 5 days: sudo journalctl --vacuum-time=5days # Delete log files until the disk space taken falls below 200M: sudo journalctl --vacuum-size=200M # Delete old logs and limit file number to 10: sudo journalctl --vacuum-files=10 Arch Linux 启用 systemd 后, 很多服务都被替换掉了, 当然 syslog 也不例外, 被 Systemd Journal 所替代。 ...

2017-11-24 · 2 min · 255 words · -

golang list

golang list package main import ( "container/list" "fmt" ) func main() { l := list.New() //创建一个新的list for i := 0; i < 5; i++ { l.PushBack(i) } printList(l) //输出list的值,01234 fmt.Println("") fmt.Println(l.Front().Value) //输出首部元素的值,0 fmt.Println(l.Back().Value) //输出尾部元素的值,4 l.InsertAfter(6, l.Front()) //首部元素之后插入一个值为6的元素 printList(l) //输出list的值,061234 fmt.Println("") l.MoveBefore(l.Front().Next(), l.Front()) //首部两个元素位置互换 printList(l) //输出list的值,601234 fmt.Println("") l.MoveToFront(l.Back()) //将尾部元素移动到首部 printList(l) //输出list的值,460123 fmt.Println("") l2 := list.New() l2.PushBackList(l) //将l中元素放在l2的末尾 printList(l2) //输出l2的值,460123 fmt.Println("") l.Init() //清空l fmt.Print(l.Len()) //0 printList(l) //输出list的值,无内容 } func printList(l *list.List) { for e := l.Front(); e != nil; e = e.Next() { fmt.Print(e.Value) } } list是一个双向链表。该结构具有链表的所有功能。 ...

2017-10-06 · 2 min · 225 words · -

contract, 合同

contract, 合同 合同的基本结构和主要条款 《合同法》第十二条、《民法典》第四百七十条规定了“合同应当具备如下内容: 当事人的姓名或者名称和住所; 标的; 数量; 质量; 价款或者报酬; 履行期限、地点和方式; 违约责任; 解决争议的方法。 一般而言,合同只要具备了法律规定的八个内容就是一个内容完备、层次分明的合同,但现实的交易错综复杂,要根据具体的交易安排合同内容。 对一般的小、微经营者而言,可以参照《民法典》合同编中第二分编《典型合同》的规定来确定自己的合同性质和名称。 承揽合同与委托合同 https://www.lawyer5148.com/lhy8297007/vip_doc/1348159.html 民法典 http://www.npc.gov.cn/npc/c30834/202006/75ba6483b8344591abd07917e1d25cc8.shtml https://github.com/baicaihenxiao/GitBook-Notes/blob/master/project/bao-jia-+-he-tong-cheng-xu-yuan-jie-si-huo-wan-zheng-gong-lve-+-zeng-kai-yuan-guan-li-xi-tong.md

2017-09-10 · 1 min · 19 words · -

清空文件

清空文件 在处理服务器磁盘占用时, 比如有比较大的日志文件, 服务还在运行, 所以文件是不能删的, 又因为文件太大了不适合用文本编辑器打开, 比如 vi 之类, 想清空文件就要用以下方法了. BTW: 删除一个正在使用的文件是另外一个问题… wiloon.com/deleteonwrite truncate truncate -s 0 foo.log truncate 可被用来将一个文件缩小或者扩展到某个给定的大小。 你可以利用它和 -s 参数来特别指定文件的大小。要清空文件的内容, 则在下面的命令中将文件的大小设定为 0 本命令缩减或扩充指定文件的大小为指定值。 参数所指定的文件如果不存在, 那么该命令会创建这个文件。 如果一个文件的大小比参数指定的大, 那么超出的部分就会被丢弃。 如果一个文件比参数指定的小, 那么文件会被扩充, 并且被扩充的部分 (空洞) 在被读取的时候是字节0。 truncate 函数使用前不需要使用 open 函数打开文件 命令格式 truncate 选项 文件列表 命令详解: 对于长选项来说必须的参数, 对于短选项来说也是必须的。 -c, --no-create 不创建任何文件 -o, --io-blocks 把参数指定的大小视为 I/O 块,而不是视为字节 -r, --reference=FILE 使用文件 FILE 的大小作为参考大小 -s, --size=SIZE 使用 SIZE 指定文件的大小 --help display this help and exit 显示这个帮助信息 --version 输出版本信息,然后退出 SIZE 参数可以是 (或者是一个整数后面跟着任意的) 下面的选项: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y. SIZE 之前也可以加上下面的特性: '+' 增加 SIZE, '-' 减少 SIZE, '<'最大为 SIZE, '>'最小为 SIZE, '/'以SIZE为除数,向下取整, '%'以SIZE为除数,向上取整。 注意: -r 和 -s 选项是互斥的。 示例 truncate -c --size 2000m x.dbf # 源文件 test.db 和目标文件 test.db.bak ll -th /root/test.db -rw-r--r--. 1 root root 12G May 24 01:26 /root/test.db [root@my1-222 ~]# ll -th /root/test.db.bak -rw-r--r--. 1 root root 0 May 24 17:51 /root/test.db.bak [root@my1-222 ~]# # 利用truncate瞬间制造大小相同的文件 [root@my1-222 ~]# truncate -r test.db test.db.bak [root@my1-222 ~]# ll -th /root/test.db.bak -rw-r--r--. 1 root root 12G May 24 17:56 /root/test.db.bak [root@my1-222 ~]# [root@my1-222 ~]# truncate --size 10G test.db.bak [root@my1-222 ~]# ll -th /root/test.db.bak -rw-r--r--. 1 root root 10G May 24 18:01 /root/test.db.bak 文件清空之后的 inode 问题 在文件的写入操作比较繁忙的时候会观察到 清空 文件 之后 用 stat 命令查看 inode信息时, 能看到 文件 长度为0 ,但是过几秒再查看时,文件 长度又变成了清空前的长度,但是 df 命令能看到磁盘空间的确被释放了 ...

2017-09-01 · 3 min · 431 words · -

flask

flask pip install Flask flask run flask run --host=0.0.0.0 pip install flask-restful https://dormousehole.readthedocs.io/en/latest/ https://flask.palletsprojects.com/en/2.3.x/ https://flask-restful.readthedocs.io/en/latest/quickstart.html

2017-08-14 · 1 min · 15 words · -

gnome

gnome Gnome shell system monitor extension https://aur.archlinux.org/packages/gnome-shell-extension-system-monitor-git/ https://github.com/paradoxxxzero/gnome-shell-system-monitor-applet install gnome shell extension https://www.baeldung.com/linux/gnome-shell-extension sudo apt update sudo apt install gnome-shell-extensions After that, we’ll launch the Activities menu, search for Extensions, and open it: chrome install extension: Shell Integration extension refresh page: https://extensions.gnome.org/extension/261/kimpanel/ click on/off button to install gnome shell extenstion

2017-08-12 · 1 min · 50 words · -

ansible playbook

ansible playbook ansible playbook 是一个特定格式的 yaml 文件, 不要直接把搜到的 ansible 文档里的 例子直接粘贴到里面, ansible playbook 至少要包含 hosts tasks, ansible 文档里找到的的 task 要粘贴到 tasks 部分 如果出现奇怪的异常, 比如: ‘ansible.builtin.shell’ is not a valid attribute for a Play, 检查 一下 playbook 文件 是不是标准格式 . ansible playbook sample - name: deploy sample hosts: all vars: ansible_ssh_private_key_file: ~/.ssh/id_ed25519 tasks: - name: Pull an image community.docker.docker_image_pull: name: 192.168.50.111:5000/foo-mock:v0.0.1 platform: amd64 ansible_ssh_private_key_file: config ssh private key path ansible-galaxy collection ansible-galaxy collection list ansible-galaxy collection install community.docker # 安装之后才能用 docker - name: Pull an image community.docker.docker_image_pull: name: pacur/centos-7 # Select platform for pulling. If not specified, will pull whatever docker prefers. platform: amd64 end play ...

2017-08-09 · 2 min · 384 words · -

less command

less command make Vim behave like “tail -f”? less +F https://unix.stackexchange.com/questions/82058/how-do-i-make-vim-behave-like-tail-f http://www.cnblogs.com/peida/archive/2012/11/05/2754477.html less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 pageup pagedown 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。 1.命令格式: less [参数] 文件 2.命令功能: less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。 3.命令参数: -b <缓冲区大小> 设置缓冲区的大小 -e 当文件显示结束后,自动离开 -f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件 -g 只标志最后搜索的关键词 -i 忽略搜索时的大小写 -m 显示类似more命令的百分比 -N 显示每行的行号 -o <文件名> 将less 输出的内容在指定文件中保存起来 -Q 不使用警告音 -s 显示连续空行为一行 -S 行过长时间将超出部分舍弃 -x <数字> 将"tab"键显示为规定的数字空格 /字符串: 向下搜索"字符串"的功能 ...

2017-07-28 · 2 min · 328 words · -

yum

yum yum command 按版本安装 yum list|grep filebeat # 回显 filebeat.x86_64 7.2.0-1 @elastic filebeat.i686 7.2.1-1 elastic filebeat.x86_64 7.2.1-1 elastic # 安装 指定版本7.2.0-1 yum install filebeat-7.2.0-1 #search yum search iostat #search yum list java* # HTTP Error 404 - Not Found yum clean all rpm --rebuilddb yum update #check package installed yum list installed xxx # 列出所有已安装的软件包 yum list installed #升级所有包同时也升级软件和系统内核 yum -y update #只升级所有包,不升级软件和系统内核 yum -y upgrade #check installed package rpm -qa|grep jdk #安装 yum install httpd yum -y install httpd ## yum 安装 本地 rpm 包, local install sudo yum localinstall influxdb-1.2.4.x86_64.rpm #yum mirror /etc/yum.repos.d #Yum更新中排除特定的包 yum update --exclude=kernel* --exclude=php* https://www.howtoing.com/exclude-packages-from-yum-update 卸载 # 默认会卸载依赖包 yum remove httpd yum -y remove httpd # 不卸载依赖 rpm -e --nodeps foo Delta RPMs disabled because /usr/bin/applydeltarpm not installed # 查看哪个包提供 applydeltarpm yum provides '*/applydeltarpm' # 安装 deltarpm yum install deltarpm -y 清除metadata run yum --enablerepo=updates clean metadata yum 安装报错“rpmdb: BDB0113” error: rpmdb: BDB0113 Thread/process ****/************* failed: BDB1507 Thread died in Berkeley DB library error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery error: cannot open Packages index using db5 - (-30973) error: cannot open Packages database in /var/lib/rpm rm -f /var/lib/rpm/__db* rpm --rebuilddb https://my.oschina.net/andyfeng/blog/601291 ...

2017-07-21 · 2 min · 258 words · -

MVCC, Multiversion Concurrency Control, 多版本并发控制

MVCC, Multiversion Concurrency Control, 多版本并发控制 http://donghui.blog.51cto.com/2709336/692586 多版本并发控制技术已经被广泛运用于各大数据库系统中,如 Oracle, MS SQL Server 2005+, Postgresql, Firebird, Maria 等等, 开源数据库 MySQL 中流行的 INNODB 引擎也采用了类似的并发控制技术.本文就将结合实例来解析不同事务隔离等级下 INNODB 的 MVCC 实现原理. 1.1 MVCC 简介 MVCC (Multiversion Concurrency Control), 即多版本并发控制技术, 它使得大部分支持行锁的事务引擎, 不再单纯的使用行锁来进行数据库的并发控制, 取而代之的是, 把数据库的行锁与行的多个版本结合起来, 只需要很小的开销, 就可以实现非锁定读, 从而大大提高数据库系统的并发性能. 1.2 实现原理 MVCC 可以提供基于某个时间点的快照, 使得对于事务看来, 总是可以提供与事务开始时刻相一致的数据, 而不管这个事务执行的时间有多长. 所以在不同的事务看来, 同一时刻看到的相同行的数据可能是不一样的, 即一个行可能有多个版本. 是否听起来不可思议呢? 原来, 为了实现 mvcc, innodb 对每一行都加上了两个隐含的列, 其中一列存储行被更新的"时间", 另外一列存储行被删除的"时间". 但是 innodb 存储的并不是绝对的时间, 而是与时间对应的数据库系统的版本号, 每当一个事务开始的时候, innodb 都会给这个事务分配一个递增的版本号, 所以版本号也可以被认为是事务号. 对于每一个"查询"语句, innodb 都会把这个查询语句的版本号同这个查询语句遇到的行的版本号进行对比, 然后结合不同的事务隔离等级, 来决定是否返回该行. ...

2017-05-09 · 5 min · 859 words · -

tee command

tee command tail -f foo.log |grep bar | tee bar.log 命令说明: 双向重定向, 从标准输入读取数据, 输出到屏幕上, 同时保存成文件。 格式: tee [-a] file 参数说明: -a: 以累加的方式, 将数据加入到 file 中。 例如: ls -al /home | tee ~/myfile | more,将ls命令的数据存一份到myfile中,同时屏幕也有输出数据。 我使用过的Linux命令之 tee - 重定向输出到多个文件 本文链接: http://codingstandards.iteye.com/blog/833695 (转载请注明链接) 用途说明 在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >a.txt,这时我们就不能看到输出了,如果我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee命令了。tee命令读取标准输入,把这些内容同时输出到标准输出和 (多个) 文件中 (read from standard input and write to standard output and files. Copy standard input to each FILE, and also to standard output. If a FILE is -, copy again to standard output.) 。在info tee中说道: tee命令可以重定向标准输出到多个文件 (`tee’: Redirect output to multiple files. The `tee’ command copies standard input to standard output and also to any files given as arguments. This is useful when you want not only to send some data down a pipe, but also to save a copy.) 。要注意的是: 在使用管道线时,前一个命令的标准错误输出不会被tee读取。 ...

2017-02-28 · 3 min · 451 words · -

ulimit, Linux 下设置最大文件打开数 nofile, nr_open

ulimit, Linux 下设置最大文件打开数 nofile, nr_open ulimit file-max nr_open soft limit hard limit shell 级限制 用户级限制 systemd 的 ulimit 配置 ulimit 是用于获取或者修改 shell 和 shell 创建的进程的 资源限制的一个 linux 内置命令, 是系统调用 setrlimit 的封装. ulimit 控制的是 shell 级的限制 格式 ulimit [-SHabcdefiklmnpqrstuvxPT] [limit] ulimit 参数 -a: 显示当前所有的 limit 信息。 -n: 显示可以打开最大文件描述符的数量。ulimit -n 128: 设置最大可以使用 128 个文件描述符。 -s: 线程栈大小,以 Kbytes 为单位. ulimit – s 512;限制线程栈的大小为 512 Kbytes. 操作系统栈大小 (ulimit -s) : 这个配置只影响进程的初始线程;后续用pthread_create创建的线程都可以指定栈大小。 -H: use the hard resource limit ...

2017-02-20 · 7 min · 1308 words · -

MTR/traceroute, 路由跟踪

MTR/traceroute, 路由跟踪 使用 MTR 诊断网络问题 MTR 是一款强大的网络诊断工具, 网络管理员使用 MTR 可以诊断和隔离网络问题,并且为上游 ISP 提供有用的网络状态报告。 MTR 是传统 traceroute 命令的进化版, 并且可以提供强大的数据样本, 因为他集合了 traceroute 和 ping 这两个命令的精华。本文带您深入了解 MTR, 从数据如何生成, 到如果正确理解报告样本并得出相应的结论。 关于网络诊断技术的基本理论请参考 network diagnostics. 如果您怀疑您的 Linux 系统有其他问题,请参考 system diagnostics 。最后,我们假定您已经掌握了 getting started guide (入门指南) 。 网络诊断相关的背景知识 网络诊断工具 例如 ping traceroute mtr 都使用的 “ICMP” 包来测试 Internet 两点之间的网络连接状况。当用户使用 ping 命令 ping 网络上的主机后, ICMP 包将会发送到目的主机,然后在目的主机返回响应。这样,就可以得知本机到目的主机 ICMP 包传输所使用的往返时间。 相对于其他命令仅仅收集传输路径或响应时间,MTR 工具会收集更多的信息,比如 连接状态,连接可用性,以及传输路径中主机的响应性。由于这些额外的信息,我们建议您尽可能完整的展现 Internet 两个主机之间的网络连接信息。接下来我们讲述如何安装 MTR 软件,以及如何看懂这款软件的输出结果。 安装 MTR # debian/ubuntu apt-get update apt-get upgrade apt-get install mtr-tiny # CentOS/Fedora yum update yum install mtr # Arch Linux pacman -Sy pacman -S mtr 使用 mtr 39.156.69.79 mtr -report google.com 如果您的本机使用的 Mac OS X 系统,可以使用 Homebre 或 MacPorts 来安装 MTR。使用 Homebrew 安装 MTR: ...

2017-02-17 · 8 min · 1659 words · -