运行:systemctl restart systemd-logind
分类: 系统
U盘安装Kali 出现cd-rom无法挂载
用U盘安装Kali Linux的过程中,出现cd-rom无法挂载的现象
下面亲测成功
出现无法挂载后,选择执行shell
第一步:df -m
此时会看到挂载信息,最下面的是/dev/*** /media 表示U盘设备挂载到了/media,导致cd-rom不能被挂载。
第二步:umount /media
第三步:exit
退出shell窗口,继续安装。此时可正常安装下去。
IO多路复用
1.epoll函数会监听注册在自己名下的所有的socket描述符
2.当有socket感兴趣的时间发生时,epoll函数才会相应,并返回有时间发生的socket集合
3.epoll的本质是阻塞IO,他的优点在于能同时处理大量socket连接
在这个epoll进程之内同时处理多个描述符
其实并不是异步的
进程与线程的一个简单解释
进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。
最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。
1.
计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。
2.
假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。
3.
进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
4.
一个车间里,可以有很多工人。他们协同完成一个任务。
5.
线程就好比车间里的工人。一个进程可以包括多个线程。
6.
车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
7.
可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
8.
一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。
9.
还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。
10.
这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。
不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。
11.
操作系统的设计,因此可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
(完)
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
wrk 压力测试
wrk负载测试时可以运行在一个或者多核CPU,wrk结合了可伸缩的事件通知系统epoll和kqueue等多线程设计思想。目前wrk可以安装在Linux系统和Mac系统,下面看下wrk在Linux下的安装和用法。
1、压力测试工具wrk安装
[root@localhost /]# yum install git #安装git [root@localhost wrk]# git clone https://github.com/wg/wrk.git #复制一份wrk源码文件 [root@localhost wrk]# cd /wrk/ #进入wrk源码文件夹 [root@localhost wrk]# mkdir /wrk #编译wrk [root@localhost wrk]# cp ./wrk /usr/local/bin/ #复制到用户bin目录下
2、压力测试工具wrk用法
[root@localhost wrk]# wrk -t8 -c400 -d30s http://127.0.0.1 Running 30s test @ http://127.0.0.1 8 threads and 400 connections Thread Stats Avg Stdev Max +/- Stdev Latency 96.88ms 75.53ms 1.93s 97.18% Req/Sec 554.79 60.39 680.00 78.48% 131271 requests in 30.05s, 97.40MB read Requests/sec: 4368.91 Transfer/sec: 3.24MB
3、压力测试工具wrk常用参数
-t 线程数
-c HTTP连接数
-d 测试执行时间
我们先来做一个简单的性能测试:
wrk -t12 -c100 -d30s http://www.baidu.com
30秒钟结束以后可以看到如下输出:
Running 30s test @ http://www.baidu.com 12 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 538.64ms 368.66ms 1.99s 77.33% Req/Sec 15.62 10.28 80.00 75.35% 5073 requests in 30.09s, 75.28MB read Socket errors: connect 0, read 5, write 0, timeout 64 Requests/sec: 168.59 Transfer/sec: 2.50MB
先解释一下输出:
12 threads and 100 connections
这个能看懂英文的都知道啥意思: 用12个线程模拟100个连接.
对应的参数 -t 和 -c 可以控制这两个参数.
一般线程数不宜过多.
核数的2到4倍足够了.
多了反而因为线程切换过多造成效率降低.
因为 wrk 不是使用每个连接一个线程的模型, 而是通过异步网络 io 提升并发量.
所以网络通信不会阻塞线程执行.
这也是 wrk 可以用很少的线程模拟大量网路连接的原因.
而现在很多性能工具并没有采用这种方式, 而是采用提高线程数来实现高并发.
所以并发量一旦设的很高, 测试机自身压力就很大.
测试效果反而下降.
下面是线程统计:
Thread Stats Avg Stdev Max +/- Stdev Latency 538.64ms 368.66ms 1.99s 77.33% Req/Sec 15.62 10.28 80.00 75.35%
Latency: 可以理解为响应时间, 有平均值, 标准偏差, 最大值, 正负一个标准差占比.
Req/Sec: 每个线程每秒钟的完成的请求数, 同样有平均值, 标准偏差, 最大值, 正负一个标准差占比.
一般我们来说我们主要关注平均值和最大值. 标准差如果太大说明样本本身离散程度比较高. 有可能系统性能波动很大.
接下来:
5073 requests in 30.09s, 75.28MB read Socket errors: connect 0, read 5, write 0, timeout 64 Requests/sec: 168.59 Transfer/sec: 2.50MB
30秒钟总共完成请求数和读取数据量.
然后是错误统计, 上面的统计可以看到, 5个读错误, 64个超时.
然后是所以线程总共平均每秒钟完成168个请求. 每秒钟读取2.5兆数据量.
可以看到, 相对于专业性能测试工具. wrk 的统计信息是非常简单的. 但是这些信息基本上足够我们判断系统是否有问题了.
wrk 默认超时时间是1秒. 这个有点短. 我一般设置为30秒. 这个看上去合理一点.
如果这样执行命令:
1. /wrk -t12 -c100 -d30s -T30s http://www.baidu.com
可以看到超时数就**降低了, Socket errors 那行没有了:
1. Running 30s test @ http://www.baidu.com
2. 12 threads and 100 connections
3. Thread Stats Avg Stdev Max +/- Stdev
4. Latency 1.16s 1.61s 14.42s 86.52%
5. Req/Sec 22.59 19.31 108.00 70.98%
6. 4534 requests in 30.10s, 67.25MB read
7. Requests/sec: 150.61
8. Transfer/sec: 2.23MB
通过 -d 可以设置测试的持续时间. 一般只要不是太短都是可以的. 看你自己的忍耐程度了.
时间越长样本越准确. 如果想测试系统的持续抗压能力, 采用 loadrunner 这样的专业测试工具会更好一点.
想看看响应时间的分布情况可以加上–latency参数:
1. wrk -t12 -c100 -d30s -T30s –latency http://www.baidu.com
1. Running 30s test @ http://www.baidu.com
2. 12 threads and 100 connections
3. Thread Stats Avg Stdev Max +/- Stdev
4. Latency 1.22s 1.88s 17.59s 89.70%
5. Req/Sec 14.47 9.92 98.00 77.06%
6. Latency Distribution
7. 50% 522.18ms
8. 75% 1.17s
9. 90% 3.22s
10. 99% 8.87s
11. 3887 requests in 30.09s, 57.82MB read
12. Socket errors: connect 0, read 2, write 0, timeout 0
13. Requests/sec: 129.19
14. Transfer/sec: 1.92MB
可以看到50%在0.5秒以内, %75在1.2s 以内. 看上去还不错.
看到这里可能有人会说了, HTTP 请求不会总是这么简单的, 通常我们会有 POST,GET 等多个 method, 会有 Header, 会有 body 等.
在我第一次知道有 wrk 这个工具的时候他确实还不太完善, 要想测试一些复杂的请求还有点难度. 现在 wrk 支持 lua 脚本. 在这个脚本里你可以修改 method, header, body, 可以对 response 做一下自定义的分析. 因为是 lua 脚本, 其实这给了你无限的可能. 但是这样一个强大的功能如果不谨慎使用, 会降低测试端的性能, 测试结果也受到影响.
一般修改method, header, body不会影响测试端性能, 但是操作 request, response 就要格外谨慎了.
我们通过一些测试场景在看看怎么使用 lua 脚本.
POST + header + body.
首先创建一个 post.lua 的文件:
1. wrk.method = "POST"
2. wrk.body = "foo=bar&baz=quux"
3. wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
就这三行就可以了, 当然 headers 可以加入任意多的内容.
然后执行:
1. wrk -t12 -c100 -d30s -T30s –script=post.lua –latency http://www.baidu.com
当然百度可能不接受这个 post 请求.
对 wrk 对象的修改全局只会执行一次.
通过 wrk 的源代码可以看到 wrk 对象的源代码有如下属性:
1. local wrk = {
2. scheme = "http",
3. host = "localhost",
4. port = nil,
5. method = "GET",
6. path = "/",
7. headers = {},
8. body = nil,
9. thread = nil,
10. }
schema, host, port, path 这些, 我们一般都是通过 wrk 命令行参数来指定.
wrk 提供的几个 lua 的 hook 函数:
setup 函数
这个函数在目标 IP 地址已经解析完, 并且所有 thread 已经生成, 但是还没有开始时被调用. 每个线程执行一次这个函数.
可以通过thread:get(name), thread:set(name, value)设置线程级别的变量.
init 函数
每次请求发送之前被调用.
可以接受 wrk 命令行的额外参数. 通过 — 指定.
delay函数
这个函数返回一个数值, 在这次请求执行完以后延迟多长时间执行下一个请求. 可以对应 thinking time 的场景.
request函数
通过这个函数可以每次请求之前修改本次请求的属性. 返回一个字符串. 这个函数要慎用, 会影响测试端性能.
response函数
每次请求返回以后被调用. 可以根据响应内容做特殊处理, 比如遇到特殊响应停止执行测试, 或输出到控制台等等.
1. function response(status, headers, body)
2. if status ~= 200 then
3. print(body)
4. wrk.thread:stop()
5. end
6. end
done函数
在所有请求执行完以后调用, 一般用于自定义统计结果.
1. done = function(summary, latency, requests)
2. io.write("——————————\n")
3. for _, p in pairs({ 50, 90, 99, 99.999 }) do
4. n = latency:percentile(p)
5. io.write(string.format("%g%%,%d\n", p, n))
6. end
7. end
下面是 wrk 源代码中给出的完整例子:
1. local counter = 1
2. local threads = {}
3.
4. function setup(thread)
5. thread:set("id", counter)
6. table.insert(threads, thread)
7. counter = counter + 1
8. end
9.
10. function init(args)
11. requests = 0
12. responses = 0
13.
14. local msg = "thread %d created"
15. print(msg:format(id))
16. end
17.
18. function request()
19. requests = requests + 1
20. return wrk.request()
21. end
22.
23. function response(status, headers, body)
24. responses = responses + 1
25. end
26.
27. function done(summary, latency, requests)
28. for index, thread in ipairs(threads) do
29. local id = thread:get("id")
30. local requests = thread:get("requests")
31. local responses = thread:get("responses")
32. local msg = "thread %d made %d requests and got %d responses"
33. print(msg:format(id, requests, responses))
34. end
35. end
https://sanwen8.cn/p/1d4kAUJ.html
更换 CentOS 7 的下载源为阿里云
1、备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/
CentOS 5
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3、生成缓存
yum makecache
http://mirrors.aliyun.com/help/centos
在centos7的python3.6里按back space 显示^H
先查看服务器上的 erase 信号的映射:
可以看出这里的 erase 信号为 ^?,而发送过去的却是 ^H,这就是敲击 Backspace 时为什么不会删除字符而会显示 ^H 的原因,如果要解决这个问题,可以使用 Ctrl-Backspace 键来发送 ^? 信号来删除字符,但是这样还是太麻烦了,需要用组合键,而最简单的方法就是把 Linux 服务器中的 erase 信号设置为 ^H:
再看一下 erase 信号的映射:
变为 ^H 了,这样就可以敲击 Backspace 来删除字符,但是这样只是临时的,系统重启过后就会失效,可以把这条命令写入家目录下的 .bash_profile 文件中实现永久修改
linux 后台执行sh
后台执行用 nohup + sh + &就可以了
ps aux | grep sh
kill pid就能停止了
Linux系统下用find命令查找最近修改过的文件
linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的。
比如按名字查找一个文件,可以用 find / -name targetfilename 。 唉,如果只知道名字,不知道地点,这样也不失为一个野蛮有效的方法。
按时间查找也有参数 -atime 访问时间 -ctime 改变状态的时间 -mtime修改的时间。但要注意,这里的时间是以24小时为单位的。查看man手册后使用,你会很迷惑: -mtime n: Files data was last modified n*24 hours ago. 字面上的理解是最后一次修改发生在n个24小时以前的文件,但实际上
find ./ -mtime 0:返回最近24小时内修改过的文件。
find ./ -mtime 1 : 返回的是前48~24小时修改过的文件。而不是48小时以内修改过的文件。
那怎么返回10天内修改过的文件?find还可以支持表达式关系运算,所以可以把最近几天的数据一天天的加起来:
find ./ -mtime 0 -o -mtime 1 -o -mtime 2 ……虽然比较土,但也算是个方法了。
还有没有更好的方法,我也想知道。
另外, -mmin参数-cmin / – amin也是类似的。
wanqi@wanqi-System-Product-Name:~/huiye_QRD_e8/7x27a-11302301$ find ./packages/apps/ -name *.java -mtime 2
./packages/apps/filebrowser2/src/com/android/filebrowser/MyFile.java
./packages/apps/filebrowser2/gen/com/android/filebrowser/Manifest.java
./packages/apps/filebrowser2/gen/com/android/filebrowser/R.java
./packages/apps/Settings/src/com/android/settings/multisimsettings/MultiSimManager2.java
./packages/apps/Settings/src/com/android/settings/multisimsettings/MultiSimUtil.java
./packages/apps/Camera/src/com/android/camera/ListPreference.java
./packages/apps/Camera/src/com/android/camera/ui/PreferenceAdapter.java
wanqi@wanqi-System-Product-Name:~/huiye_QRD_e8/7x27a-11302301$ find ./packages/apps/ -name *.java -mtime 2
./packages/apps/filebrowser2/src/com/android/filebrowser/MyFile.java
./packages/apps/filebrowser2/gen/com/android/filebrowser/Manifest.java
./packages/apps/filebrowser2/gen/com/android/filebrowser/R.java
SecureCRT最佳配色方法+直接修改默认配置方法
SecureCRT默认显示效果是黑白且刺眼的主题,看起来很不舒服。经过一番搜索,总结结果如下,直接设置默认属性,设置一次,不需再改。
效果图:
具体操作方法:
Options->Global Options进入下面设置
说明:
④选择Linux配色方案
②选择自定义颜色
④将字体的颜色变浅,将背景的颜色变深
⑤再次勾选此选项,即可完成设置