1.elasticsearch wildcard 慢查询原因分析(深入到源码!!!)
2.Linux系统的打分打分OOM Killer处理机制
3.微信å¨çº¿èè¯ç³»ç»èªå·±è½åå
4.xcvbn是什么意思?
elasticsearch wildcard 慢查询原因分析(深入到源码!!!)
本文深入剖析 Elasticsearch 中 wildcards 查询导致的性能问题及其解决之道,结合源码解析,系统系统揭示其背后的源码源码机制。阅读本文后,打分打分您将深入了解 Elasticsearch 的系统系统查询过程、查询性能瓶颈以及如何利用 Elasticsearch profile API 进行性能分析。源码源码php跳转源码下载
首先,打分打分理解 Elasticsearch 的系统系统查询流程分为两个阶段:使用 Elasticsearch 对卢瑟库(Lucece)进行查询,以及卢瑟库本身进行查询。源码源码卢瑟库只能单机存储,打分打分因此,系统系统查询过程主要关注如何高效地在卢瑟库中查找文档。源码源码
在卢瑟库中,打分打分查询过程涉及以下关键步骤:重写(rewrite)查询类型、系统系统创建权重对象、源码源码ATL编程源码构建 bulk scorer 对象以及进行打分。重写阶段将复杂查询转换为更底层的查询类型,如 MultiTermQueryConstantScoreWrapper。权重对象用于计算文档的权重和构建得分对象,以确定文档的排序。打分阶段对匹配的文档进行批量化打分,然后通过收集器对象汇总结果。
理解卢瑟库查询过程的关键在于了解其查询机制,尤其是如何筛选匹配文档。卢瑟库的查询过程包括创建 bulk scorer 对象,以及在 scorer 对象中遍历匹配的文档。PhraseQuery 和 WildcardQuery 类型的查询分别在不同的阶段进行文档筛选。WildcardQuery 的主要耗时发生在构建 scorer 阶段,由于其需要遍历字段中的cdb添加源码所有 term 并与有限状态机进行匹配,此过程较为耗时且对 CPU 资源消耗较大。
在性能分析方面,Elasticsearch 提供了 profile API,允许在查询时收集分析结果。通过装饰器模式,profile API 在关键方法前后添加了埋点,以统计耗时时间。分析 profile 返回的结果,可以揭示查询在不同阶段的性能瓶颈,例如在构建 scorer 阶段的耗时。了解这些信息对于优化查询性能和资源利用至关重要。
综上所述,本文旨在深入探究 Elasticsearch wildcards 查询的性能问题,揭示其工作原理以及如何通过分析性能数据进行优化。10110110的源码通过本文的讲解,您将能够更好地理解 Elasticsearch 的查询过程、识别性能瓶颈,并采取有效措施提升系统性能。
Linux系统的OOM Killer处理机制
最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有位客户抱怨 VPS 经常死机,登陆到终端看了一下,都是常见的 Out of memory 问题。这通常是因为某时刻应用程序大量请求内存导致系统内存不足造成的,这通常会触发 Linux 内核里的 Out of Memory (OOM) killer,OOM killer 会杀掉某个进程以腾出内存留给系统用,不致于让系统立刻崩溃。如果检查相关的日志文件(/var/log/messages)就会看到下面类似的 Out of memory: Kill process 信息:
...
Out of memory: Kill process (mysqld) score 9 or sacrifice child
Killed process , UID , (mysqld) total-vm:kB, anon-rss:kB, file-rss:kB
m: mit memory)的办法来间接利用这部分 “空闲” 的内存,提高整体内存的820频率源码使用效率。一般来说这样做没有问题,但当大多数应用程序都消耗完自己的内存的时候麻烦就来了,因为这些应用程序的内存需求加起来超出了物理内存(包括 swap)的容量,内核(OOM killer)必须杀掉一些进程才能腾出空间保障系统正常运行。用银行的例子来讲可能更容易懂一些,部分人取钱的时候银行不怕,银行有足够的存款应付,当全国人民(或者绝大多数)都取钱而且每个人都想把自己钱取完的时候银行的麻烦就来了,银行实际上是没有这么多钱给大家取的。
内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码 linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory() 被触发,然后调用 select_bad_process() 选择一个 “bad” 进程杀掉,如何判断和选择一个 “bad” 进程呢,总不能随机选吧?挑选的过程由 oom_badness() 决定,挑选的算法和想法都很简单很朴实:最 bad 的那个进程就是那个最占用内存的进程。
/
*** oom_badness - heuristic function to determine which candidate task to kill
* @p: task struct of which task we should calculate
* @totalpages: total present RAM allowed for page allocation
*
* The heuristic for determining which task to kill is made to be as simple and
* predictable as possible. The goal is to return the highest value for the
* task consuming the most memory to avoid subsequent oom failures.
*/
unsigned long oom_badness(struct task_struct *p, struct mem_cgroup *memcg,
const nodemask_t *nodemask, unsigned long totalpages)
{
long points;
long adj;
if (oom_unkillable_task(p, memcg, nodemask))
return 0;
p = find_lock_task_mm(p);
if (!p)
return 0;
adj = (long)p-signal-oom_score_adj;
if (adj == OOM_SCORE_ADJ_MIN) {
task_unlock(p);
return 0;
}
/
** The baseline for the badness score is the proportion of RAM that each
* task's rss, pagetable and swap space use.
*/
points = get_mm_rss(p-mm) + p-mm-nr_ptes +
get_mm_counter(p-mm, MM_SWAPENTS);
task_unlock(p);
/
** Root processes get 3% bonus, just like the __vm_enough_memory()
* implementation used by LSMs.
*/
if (has_capability_noaudit(p, CAP_SYS_ADMIN))
adj -= ;
/* Normalize to oom_score_adj units */
adj *= totalpages / ;
points += adj;
/
** Never return 0 for an eligible task regardless of the root bonus and
* oom_score_adj (oom_score_adj can't be OOM_SCORE_ADJ_MIN here).
*/
return points 0 ? points : 1;
}
上面代码里的注释写的很明白,理解了这个算法我们就理解了为啥 MySQL 躺着也能中枪了,因为它的体积总是最大(一般来说它在系统上占用内存最多),所以如果 Out of Memeory (OOM) 的话总是不幸第一个被 kill 掉。解决这个问题最简单的办法就是增加内存,或者想办法优化 MySQL 使其占用更少的内存,除了优化 MySQL 外还可以优化系统(优化 Debian 5,优化 CentOS 5.x),让系统尽可能使用少的内存以便应用程序(如 MySQL) 能使用更多的内存,还有一个临时的办法就是调整内核参数,让 MySQL 进程不容易被 OOM killer 发现。
我们可以通过一些内核参数来调整 OOM killer 的行为,避免系统在那里不停的杀进程。比如我们可以在触发 OOM 后立刻触发 kernel panic,kernel panic 秒后自动重启系统。
# sysctl -w vm.panic_on_oom=1
vm.panic_on_oom = 1
# sysctl -w kernel.panic=
kernel.panic =
# echo "vm.panic_on_oom=1" /etc/sysctl.conf
# echo "kernel.panic=" /etc/sysctl.conf
从上面的 oom_kill.c 代码里可以看到 oom_badness() 给每个进程打分,根据 points 的高低来决定杀哪个进程,这个 points 可以根据 adj 调节,root 权限的进程通常被认为很重要,不应该被轻易杀掉,所以打分的时候可以得到 3% 的优惠(adj -= ; 分数越低越不容易被杀掉)。我们可以在用户空间通过操作每个进程的 oom_adj 内核参数来决定哪些进程不这么容易被 OOM killer 选中杀掉。比如,如果不想 MySQL 进程被轻易杀掉的话可以找到 MySQL 运行的进程号后,调整 oom_score_adj 为 -(注意 points 越小越不容易被杀):
# ps aux | grep mysqld
mysql 1.6 2.1 ? Ssl : 0: /usr/sbin/mysqld
# cat /proc//oom_score_adj
0
# echo - /proc//oom_score_adj
当然,如果需要的话可以完全关闭 OOM killer(不推荐用在生产环境):
# sysctl -w vm.overcommit_memory=2
# echo "vm.overcommit_memory=2" /etc/sysctl.conf
我们知道了在用户空间可以通过操作每个进程的 oom_adj 内核参数来调整进程的分数,这个分数也可以通过 oom_score 这个内核参数看到,比如查看进程号为的 omm_score,这个分数被上面提到的 omm_score_adj 参数调整后(-),就变成了3:
# cat /proc//oom_score
# echo - /proc//oom_score_adj
# cat /proc//oom_score
3
下面这个 bash 脚本可用来打印当前系统上 oom_score 分数最高(最容易被 OOM Killer 杀掉)的进程:
# vi oomscore.sh
#!/bin/bash
for proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do
printf "%2d %5d %sn"
"$(cat $proc/oom_score)"
"$(basename $proc)"
"$(cat $proc/cmdline | tr '' ' ' | head -c )"
done 2/dev/null | sort -nr | head -n
# chmod +x oomscore.sh
# ./oomscore.sh
/usr/sbin/mysqld
4 -bash
4 -bash
1 sshd: root@pts/6
1 sshd: vpsee [priv]
1 -bash
1 sudo -i
1 sshd: root@pts/3
1 sshd: vpsee [priv]
1 /usr/sbin/sshd -D
微信å¨çº¿èè¯ç³»ç»èªå·±è½åå
å½ç¶è½èªå·±åï¼èä¸æä½é常ç®åï¼å¨çº¿èè¯ç³»ç»å¹³å°ç¸å¯¹äºå¾®ä¿¡æ¥è¯´æ¯ä¸ä¸ªç¬ç«ç软件ï¼äºè æ¬æ²¡æä»ä¹å ³èãä½æ¯å¨å®æå¨çº¿èè¯ç³»ç»çè¯å·åï¼è½å¤èªå¨çæèè¯äºç»´ç 以åç½é¡µé¾æ¥ï¼å°äºç»´ç æé¾æ¥å¨å¾®ä¿¡ä¸è¿è¡è½¬åï¼èçå°±å¯ä»¥ç´æ¥éè¿å¾®ä¿¡æ«ä¸æ«åè½æç´æ¥è®¿é®è¯¥é¾æ¥æ¥å®æå¨çº¿èè¯ãè¿æ ·ä½¿å¾å¾®ä¿¡ä½ä¸ºä¸ä¸ªçº½å¸¦ï¼å°èçä¸å¨çº¿èè¯ç³»ç»å ³èå¨ä¸èµ·ã
使ç¨ä»»æä¸ä¸ªå¨çº¿èè¯ç³»ç»å¹³å°å³å¯è¾¾æè¿ä¸ªç®æ ï¼ä¸ºäºæ¹ä¾¿èµ·è§ï¼è¿éæ们以轻éäºå¨çº¿èè¯ç³»ç»ä¸ºä¾ï¼ä»ç»ä¸ä¸ææºå¾®ä¿¡å¨çº¿èè¯ç³»ç»æä¹å¶ä½ã
1ã注å并ç»å½å°è½»éäºå¨çº¿èè¯ç³»ç»åå°ï¼ä½¿ç¨ç®¡çåå°çå项èè¯ç®¡çåè½æ¥å建å¨çº¿èè¯è¯å·ã
2ã使ç¨âæçé¢åºâåè½æ¥å建é¢åºï¼å°èè¯æéè¦ä½¿ç¨çé¢ç®ä¿åå¨é¢åºä¸ï¼çå¾ åç»ä½¿ç¨ã
3ã使ç¨âæçè¯å·âè¿è¡å¨çº¿èè¯è¯å·å建æä½ãå¦æéè¦åå»ºä» é对äºå é¨èè¯çéå ¬å¼è¯å·ï¼é£ä¹éè¦è¿è¡æ¥éª¤4çå 容æ¥å建æåï¼å¦åå¯ä»¥è·³è¿æ¥éª¤4ã
4ãå¨ç³»ç»ç®¡çèåä¸æ¾å°âæå管çâï¼éè¿å¨çº¿æ·»å æè å¯¼å ¥çæ¹å¼æ¥å®æèè¯æåçä¿¡æ¯å½å ¥ãä¹åï¼æ¯ä¸ªæåé½æç¬ç«çè´¦å·å¯ç ç¨æ¥ç»å½èè¯ç³»ç»æ¥å®æèè¯ãä¹å¯ä»¥ä¸è¿è¡æåä¿¡æ¯æ·»å ï¼èæ¯å¨å¦å设置管çä¸å¼å¯å¾®ä¿¡ç»å½ç´æ¥æ³¨ååè½ï¼è®©ç³»ç»æåå¦åç微信信æ¯æ¥å®æèªå©æ³¨åã
5ãä»æ¥éª¤2ä¸å建çé¢åºééæ©å ·ä½çé¢ç®æ·»å å°è¯å·ä¸ï¼ç¶åè¿è¡åå¼è®¾å®ä»¥åé¢ç®çæåºæä½ã
6ãéè¿âèè¯è®¾ç½®âæ¥å®æå¨çº¿èè¯çç¯å¢é ç½®ï¼å¯ä»¥æ ¹æ®éæ±æ¥è°æ´å¤é¡¹å 容ã
7ãå ¬å¼è¯å·éè¦é ç½®ééä¿¡æ¯ï¼è®©èçå¡«å个人信æ¯;èéå ¬å¼è¯å·åéè¦ç¡®å®èçååï¼é请éè¦èè¯çæåæ¥åå èè¯ã
8ãåå¸è¯å·åç³»ç»èªå¨çæå¤é¡¹èè¯å ¥å£ï¼ä¿åèè¯å ¥å£ï¼å¨å¾®ä¿¡ä¸è¿è¡ä¼ æã
9ãèçå¯ä»¥å¨å¾®ä¿¡ä¿¡æ¯ä¸ç´æ¥åç±è®¿é®èè¯å ¥å£åå èè¯ï¼ä¹å¯ä»¥éè¿æ«ææè¯å«äºç»´ç çæ¹å¼æ¥åå èè¯ã
ãèè¯ç»æåèççå·ä¼èªå¨ä¸ä¼ ï¼ç®¡çåä»æ§éè¿å¨çº¿èè¯ç³»ç»ç管çåå°æ¥å®æçå·çæ¹é ãåæ¶ä»¥åç»è®¡åæçå·¥ä½ã
以ä¸å°±æ¯è½»éäºå¾®ä¿¡å¨çº¿èè¯ç³»ç»çå¶ä½æ¹æ³ï¼è¿ç¨è¿æ¯å¾ç®åçãå¤ä½¿ç¨å 次çæäºä¿¡æ¯çå¯¼å ¥æä½ï¼å建è¯å·è¿ä¼æ´å¿«ä¸äºã
xcvbn是什么意思?
xcvbn是一款基于JavaScript的密码强度验证库。它可以帮助用户判断密码的强度,提高密码安全性。xcvbn的名称来源于键盘上与密码输入相关的键位,其中的“x”是代表“不明字符”、“空字符”等意思,而其余的字母则代表键盘上对应的按键。
xcvbn通过分析密码中的字符种类、出现频率、字符组合规律等因素,评估密码的复杂性和安全性。在实际应用中,用户可以通过引入xcvbn库来增强自己应用的密码安全性。在用户输入密码的过程中,xcvbn会即时地对密码进行评估,并返回一个0-4的密码强度打分,同时提供一些有用的提示信息,如“密码过于简单,建议增加数字或符号”等。
xcvbn的应用范围非常广泛,几乎涵盖了所有需要使用密码登录的场景。例如,在电子商务网站注册时、在线银行账户登录时、社交媒体平台账户登录时、企业内部系统登录时等场景中,均可应用xcvbn来提高密码的安全性和用户体验。同时,xcvbn的源代码开放,并且免费提供给开发者使用与修改,因此可以被广泛地应用于自主研发的软件与项目之中。