ubuntu24.04 php7.4.33编译安装扩展openssl.so

0.ubuntu24.04 下默认安装的是 openssl3.0,php7.4.33只支持openssl1.1

1.下载OpenSSL 1.1.1w源码,编译安装,本人安装在/usr/local/ssl

2.进入到php-7.4.33/ext/openssl下,执行 phpize
如果出现Cannot find config.m4;可以把config0.m4改为config.m4
export PKG_CONFIG_PATH=/usr/local/ssl/lib/pkgconfig
export CPPFLAGS=-I/usr/local/ssl/include
export LDFLAGS=-L/usr/local/ssl/lib
export OPENSSL_CONF=/usr/local/ssl/openssl.cnf

./configure --with-openssl=/usr/local/ssl
make -j && make install

3.配置扩展证书:openssl.capath=/usr/lib/ssl/certs

点火公式 与 β函数

点火公式β函数是两个不同的数学概念,‌它们分别属于不同的数学领域。‌

点火公式(‌Wallis’ formula)‌是一个数学公式,‌用于计算某些特定积分的结果,‌特别是在计算圆周率的近似值时非常有用。‌这个公式表达了正弦和余弦函数在某些特定角度的积分值之间的关系,‌通常用于计算与圆相关的几何形状的面积或体积。‌点火公式的形式通常涉及到阶乘和π的计算,‌它在数学和物理中都有应用。‌

另一方面,‌β函数(‌Beta function)‌是数学中的一个特殊函数,‌也称为欧拉积分的一部分,‌它在复变函数、‌概率论、‌统计学等多个数学分支中有广泛应用。‌β函数可以看作是两个伽马函数的商,‌具有广泛的数学和物理应用。‌β函数与点火公式虽然都属于数学中的特殊函数,‌但它们的应用领域和计算方法有所不同。‌

总结来说,‌点火公式和β函数是两个不同的数学概念,‌分别应用于不同的数学领域和计算问题。‌点火公式主要用于计算特定角度的正弦和余弦函数的积分值,‌而β函数则是一个更广泛的数学工具,‌用于计算复变函数、‌概率分布等相关问题。‌

Song/歌

by Christina Georgina Rossetti /Translated by Xu Zhimo
When I am dead, my dearest,
Sing no sad songs for me;
Plant thou no roses at my head,
Nor shady cypress tree:
Be the green grass above me
With showers and dewdrops wet;
And if thou wilt, remember,
And if thou wilt, forget.
I shall not see the shadows,
I shall not feel the rain;
I shall not hear the nightingale
Sing on, as if in pain:
And dreaming through the twilight
That doth not rise nor set,
Haply I may remember,
And haply may forget.

译/徐志摩
当我死去的时候,亲爱的
你别为我唱悲伤的歌
我坟上不必安插蔷薇
也无需浓荫的柏树
让盖著我的青青的草
淋著雨也沾著露珠
假如你愿意请记著我
要是你甘心忘了我
我再见不到地面的青荫
觉不到雨露的甜蜜
我再听不到夜莺的歌喉
在黑夜裏倾吐悲啼
在悠久的坟墓中迷惘
阳光不升起也不消翳
我也许,也许我还记得你
我也许把你忘记

Christina Georgina Rossetti 19世纪伦敦女诗人

元夕

青玉案·元夕

(宋)辛弃疾

东风夜放花千树。更吹落、星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。

蛾儿雪柳黄金缕。笑语盈盈暗香去。众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。

元宵

(明)唐寅

有灯无月不娱人,有月无灯不算春。

春到人间人似玉,灯烧月下月如银。

满街珠翠游村女,沸地笙歌赛社神。

不展芳尊开口笑,如何消得此良辰。

图像二值化

图像二值化是将像素点的灰度值设为0或255,使图像呈现明显的黑白效果。二值化之前需要把图像进行灰度处理。

(全局阈值法)固定阈值法   
Threshold为全局阈值,但是全局阈值不好确定,先尝试使用灰度图的平均像素作为全局阈值。

import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("chatgpt.png")
# 加权求出灰度图
def weight_gray(image):
    weight_image = image[:, :, 0] * 0.11 + image[:, :, 1] * 0.59 + image[:, :, 2] * 0.3 # 三个通道加权求和
    weight_image = weight_image.astype(np.uint8)
    return weight_image
    
"""
像素平均值二值化
gray: 灰度图(ndarray)
return: 二值化图像(ndarray)
"""
def mean_threshold(gray):
    threshold = np.mean(gray)# 求平均像素值
    binary = np.where(gray >= threshold, 255, 0)
    binary = binary.astype(np.uint8)
    return binary
    
gray = weight_gray(image)
plt.figure(figsize=(10,10))
plt.subplot(121)#画子图   
plt.imshow(gray, cmap='gray')
plt.title("gray")
plt.subplot(122)#画子图   
plt.title("threshold")
plt.imshow(mean_threshold(gray), cmap='gray')

OTSU算法
OTSU是阈值分割中一种常用的算法,它可以根据图像自动生成最佳分割阈值。 OTSU的核心思想是类间方差最大化。

  1. 初始化一个阈值T0,将图像分为前景f和背景b;
  2. 图像像素点个数为图像N=height x width,前景像素个数Nf,背景像素个数Nb;
  3. 图像灰度等级L-1(0~255=256),每个灰度等级像素个数Ni,满足以下公式:
  4. 前景和背景的灰度平均值分别为:
  5. 整个图像灰度平均值:
  6. 求前景和背景之间的方差:
  7. 找到阈值T0,使得公式4最大;
  8. 怎么找?可以采用优化算法,本文中直接遍历灰度等级,查找最优阈值。
"""
统计像素点函数
image: 输入灰度图(ndarray)
reutrn: {像素:个数}(dict)
"""
def pixel_num(image):
    h, w = image.shape
    pdict = {}
    for i in range(h):
        for j in range(w):
            if image[i,j] in pdict:
                pdict[image[i,j]] += 1
            else:
                pdict[image[i,j]] = 0
    return pdict

"""
求公式4中sigma2的值
T0: 预设阈值(int)
gray: 灰度图(ndarray)
L: 灰度等级(int)
"""
def sigma2(T0, gray, L=256):
    h, w = gray.shape
    N = h * w
    pdict = pixel_num(gray)
    pf = sum([v for k,v in pdict.items() if k < T0]) / N#公式1
    pb = sum([v for k,v in pdict.items() if k >= T0]) / N#公式1
    pf = [pf if pf > 1e-6 else 1e-6][0]#控制最小值,避免除以0
    pb = [pb if pb > 1e-6 else 1e-6][0]#控制最小值,避免除以0
    mf = sum([k * pdict.get(k, 0) / N for k in range(T0)]) / pf#公式2
    mb = sum([k * pdict.get(k, 0) / N for k in range(T0, L)]) / pb#公式2
    M = pf * mf + pb * mb#公式3
    s2 = pf * (mf - M) ** 2 + pb * (mb - M) ** 2#公式4
    return s2, T0

"""
遍历查找最大sigma2
gray: 灰度图(ndarray)
L: 灰度等级(int)
"""
def otsu(gray, L=256):
    smax = 0
    tmax = 0
    for t in range(1, L):
        s2, T0 = sigma2(t, gray, L)
        if s2 > smax:
            smax = s2
            tmax = T0
    return smax, tmax

"""
根据最佳阈值求二值化图像
threshold: 最佳阈值(int)
return: 二值化图像(ndarray)
"""
def otsu_threshold(max_threshold, gray):
    threshold = np.mean(gray)
    binary = np.where(gray >= max_threshold, 255, 0)
    binary = binary.astype(np.uint8)
    return binary
    
smax, tmax = otsu(gray, 256)  
oimage = otsu_threshold(tmax, gray)
plt.figure(figsize=(10,10))
plt.subplot(121)#画子图
plt.imshow(mean_threshold(gray), cmap='gray')
plt.title("threshold")
plt.subplot(122)#画子图
plt.title("otsu")
plt.imshow(oimage, cmap='gray')

原文链接:https://blog.csdn.net/weixin_43828944/article/details/128911462

梦里有时身化鹤

浣溪沙

宋代 张元干

目送归州铁瓮城。
隔江想见蜀山青。
风前团扇仆频更。
梦里有时身化鹤,
人间无数草为萤。
此时山月下楼明。

这首诗描绘了一个人在远离家乡的地方,望着隔江的故乡感到思念。他在风前摇动着团扇,试图让心中的思念随风飘散。他在梦中化身为鹤,表达了对自由的向往。草地上的萤火虫则象征着生命的短暂和无常。最后,作者在山间的楼台下,感受到了月光的温柔和安宁。

人之初

人之初,性本善,有些恶念,是后天逼迫出来的。

人之初,性本恶,良善之心,是后天教化出来的。

善恶,也是矛盾的对立统一。

网络套路

遇事不决,量子力学。

风格跳跃,虚拟世界。

解释不通,穿越时空。

不懂配色,赛博朋克。

脑洞不够,平行宇宙。

画面老土,追求复古。

不清不楚,致敬克苏鲁。

macos 性能测试 内核优化配置

解决mac 在糟糕网络下 tcp/http 等连接较高概率超时失败问题

经过定位,应该是系统的tcp 和 socket连接数太小的问题,导致开大量应用后会出现该问题

1.增加 max files:

解决mac 在糟糕网络下 tcp/http 等连接较高概率超时失败问题

经过定位,应该是系统的tcp 和 socket连接数太小的问题,导致开大量应用后会出现该问题

1.增加 max files:

sysctl -a | grep files
kern.maxfiles = 12288
kern.maxfilesperproc = 10240

#设置系统最大连接数从12288到1048600.
sudo sysctl -w kern.maxfiles=1048600

#设置进程连接数限制,进程的最大连接数要小于等于全局连接数
sudo sysctl -w kern.maxfilesperproc=1048576

2.增加max sockets:

sysctl -a | grep somax
kern.ipc.somaxconn: 256
sudo sysctl -w kern.ipc.somaxconn=4096

3.设置动态端口范围portrange

sysctl net.inet.ip.portrange
net.inet.ip.portrange.first: 49152
net.inet.ip.portrange.last: 65535

说明:Linux动态端口号默认范围是32768-65535,也就是说,作为客户端连接同一个IP和同一个端口号,最多只能建立30000多个连接,而Mac默认只能建立16000个左右的连接。
sudo sysctl -w net.inet.ip.portrange.first=32768

4.tcp最大分段寿命
sysctl net.inet.tcp.msl
net.inet.tcp.msl: 30000

说明:最大段寿命*是一个 [TCP] [分段]可以存在于互联网系统中的最大时间。它被任意地定义为两分钟长。最大段寿命的值用来确定 TIME_WAIT 周期(最大段寿命的两倍)
sudo sysctl -w net.inet.tcp.msl=5000

说明:设置tcp失败后回收时间,由默认的30s修改为5秒,一般方便性能测试。

5.设置ulimit
ulimit -n 
说明:命令显示当前shell能打开的最大文件数,默认值:256,该值总是小于kern.maxfilesperproc的值,因为一个shell就是一个进程。
ulimit -n 1048576

6.确保重启后参数生效(永久设置)
6.1按以上的方式设置参数有个问题,当系统重启后,这些参数又恢复成了默认值,解决办法就是把参数写到/etc/sysctl.conf文件中,但是,默认macos这个文件是不存在的,所以首先就要创建它:
sudo touch /etc/sysctl.conf
然后把参数写到文件里
kern.maxfiles=1048600
kern.maxfilesperproc=1048576
kern.ipc.somaxconn=4096
net.inet.tcp.msl=5000
net.inet.ip.portrange.first=32768
#net.inet.ip.portrange.last=65535

至于ulimit-n的值,可以把ulimit-n1048576 写到.bashrc中实现自动修改。

查看批量查看结果

ulimit -n 

sysctl kern.maxfiles kern.maxfilesperproc kern.ipc.somaxconn net.inet.tcp.msl net.inet.ip.portrange.first net.inet.ip.portrange.last

最后修改参数总结:(临时设置)
sudo sysctl -w kern.maxfiles=1048600
sudo sysctl -w kern.maxfilesperproc=1048576
sudo sysctl -w kern.ipc.somaxconn=4096
sudo sysctl -w net.inet.tcp.msl=5000
sudo  sysctl -w net.inet.ip.portrange.first=32768
ulimit -n 1048576

一将功成万骨枯

己亥岁二首·僖宗广明元年
唐 · 曹松
泽国江山入战图,生民何计乐樵苏。
凭君莫话封侯事,一将功成万骨枯。
传闻一战百神愁,两岸强兵过未休。
谁道沧江总无事,近来长共血争流。

穷不怪父,孝不比兄,苦不责伴,气不凶子

家,是人生的港湾,

家,是永远的依靠;

一家人,和和睦睦,

才是兴旺的基础,

家人之间生活在一起,

要懂得互相包容,

互相理解,关心关爱,

要懂得换位思考,

才能做到相处融洽。

这个世界上,只有家人,

不管发生什么事情,

都会永远陪着我们,

家人我们无法选择,

但他们是爱我们最无私的人。

要想和家人和睦相处,

做到以下四点,

才是最好的相处之道!

—01—

穷不怪父

为人父母,

对待子女,掏心掏肺,

一旦成为父母,

余生最爱的便只有孩子,

做父母的,

什么都可以给予子女,

甚至是自己的生命。

我们应该懂得感恩,

时刻铭记父母的爱,

而不是责怪父母,

给予的不够多。

父母能给的都给你了,

你的人生路,

要靠自己走下去,

不管你的生活多苦,

接下来的日子多难,

都不应该责怪父母;

相反,

你要感恩孝敬父母,

穷不怪父,

父母在能力范围内,

已经给你你的他们的全部。

—02—

孝不比兄

孝敬父母,

是作为子女的义务,

对父母孝敬的程度,

看你自己的良心,

不要与手足,

做过多的比较。

如果连孝敬父母,

都要去做一番比较,

那么,

孝顺就失去了原本的意义。

孝顺父母这件事作比较,

不仅寒了父母的心,

更会伤了手足的情。

在父母有生之年,

给予自己能力范围内,

你能给的所有,

用心尽孝,

不给自己留下遗憾。

—03—

苦不责伴

这个世界上,

能陪我们最久的人,

不是父母,不是子女,

而是携手一生的伴侣。

生活中不如意之事,

十之八九,

生活过得不如意的时候,

不要责怪自己的伴侣。

十年修得同船渡,

百年修得共枕眠,

不管生活多难,

都要珍惜对方。

想要过上好日子,

就靠自己的双手努力,

夫妻本事一体,

两个人携手共进退,

互相包容,互相体谅,

才能执子之手与子偕老。

—04—

气不凶子

没本事的人,

才会把自己的怒火,

发泄在家人的身上;

你的恶言恶语,

不应该冲着家人,

更不应该冲着孩子。

很多家长不在意的一点,

或许你只是气头上的话,

但是却成为孩子一生的痛。

感受不到家庭温暖的孩子,

很容易在社会上误入歧途。

你是怎样的人,

你的孩子就会成为怎样的人;

不管你在外面受了对少委屈,

都不应该冲着孩子发泄,

对孩子,

可以教育,但不要责骂,

让孩子感受到家庭的温暖,

也是人生的必修课。

这个世界上,

你能伤害到的人,

只有你的家人和爱你的人;

能做到:

穷不怪父,孝不比兄,

苦不责伴,气不凶子的人,

才是真正成功的人!

spring cloud alibaba springboot nacos 版本兼容匹配

Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version
2021.0.1.0Spring Cloud 2021.0.12.6.3
2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE
2021.1Spring Cloud 2020.0.12.4.2
2.2.6.RELEASESpring Cloud Hoxton.SR92.3.2.RELEASE
2.1.4.RELEASESpring Cloud Greenwich.SR62.1.13.RELEASE
2.2.1.RELEASESpring Cloud Hoxton.SR32.2.5.RELEASE
2.2.0.RELEASESpring Cloud Hoxton.RELEASE2.2.X.RELEASE
2.1.2.RELEASESpring Cloud Greenwich2.1.X.RELEASE
2.0.4.RELEASE(停止维护,建议升级)Spring Cloud Finchley2.0.X.RELEASE
1.5.1.RELEASE(停止维护,建议升级)Spring Cloud Edgware1.5.X.RELEASE
正式版本依赖关系(推荐使用)

依赖管理

Spring Cloud Alibaba BOM 包含了它所使用的所有依赖的版本。

RELEASE 版本

Spring Cloud 2021

如果需要使用 Spring Cloud 2021.0.x 版本,请在 dependencyManagement 中添加如下内容

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-alibaba-dependencies</artifactId>
   <version>2021.0.1.0</version>
   <type>pom</type>
   <scope>import</scope>
</dependency>
Spring Cloud Alibaba VersionSentinel VersionNacos VersionRocketMQ VersionDubbo VersionSeata Version
2021.0.1.0*1.8.31.4.24.9.22.7.151.4.2
2.2.7.RELEASE1.8.12.0.34.6.12.7.131.3.0
2.2.6.RELEASE1.8.11.4.24.4.02.7.81.3.0
2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE1.8.01.4.14.4.02.7.81.3.0
2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE1.8.01.3.34.4.02.7.81.3.0
2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE1.7.11.2.14.4.02.7.61.2.0
2.2.0.RELEASE1.7.11.1.44.4.02.7.4.11.0.0
2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE1.7.01.1.44.4.02.7.30.9.0
2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE1.6.31.1.14.4.02.7.30.7.1
每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本

网络精彩30条神回复

01

为什么友情可以变成爱情,但爱情变回友情就很奇怪呢?

神回复:毛巾用久了可以当抹布,但抹布再用回毛巾是不是很奇怪?

02

是不是一个人越成熟就越难爱上一个人?

神回复:不是越成熟越难爱上一个人,而是越成熟,越能分辨那是不是爱。

03

“老铁”是怎样一种存在?

神回复:友谊是如此甜美、稳固、忠诚,又至死不渝的神圣情感,只要他们不跟你借钱。

04

暗恋一个人什么感觉?

神回复:看到一个满格的Wi-Fi信号,却不知道密码。

05

结婚后两个人在一起,最重要的是什么?

神回复:就当这婚还没结。

06

你心中的完美爱情是怎么样的?

神回复:可以有不完美。

07

为什么人类都喜欢把自己正在打吊针的手的照片po到网上。

神回复:这是在告诉大家,他们没有放弃治疗。

08

到底要不要结婚?

神回复:想结婚的就去结婚,想单身就维持单身,反正到最后你们都会后悔。

09

这辈子说过最后悔的话是什么?

神回复:你觉得怎么好看就怎么剪吧。

10

比“宇宙”更大的词是什么?

神回复:考试范围

11

你是如何考上一本的?

神回复:我考了个二本,然后学校很努力,自己升一本了。

12

为什么现代人普遍牙不好?

神回复:因为人生大都要靠咬牙撑过来。

13

为什么在学校感觉这么困呢?

神回复:因为学校,是梦开始的地方。

14

最伟大的虚拟人物是?

神回复:别人家的孩子

15

有没有双重否定,不是肯定的句子?

神回复:女朋友说,我没有不高兴。

16

纹个什么比较能彰显我的身份?

神回复:身份证。

17

如何走出人生的阴霾?

神回复:多走几步。

18

什么是离婚的主要原因?

神回复:结婚。

19

网红脸放在古代算什么?

神回复:算欺君。

20

上学时听过的最伤感的一句话?

神回复:背诵全文。

21

为什么开了空调就不会有蚊子?

神回复:因为饭菜冷了就不好吃了。

22

两个干净的东西碰在一起,不可能变成脏东西吧?

神回复:想想蛋糕碰到衣服。

23

失眠的时候都在想什么?

神回复:想睡觉

24

如何从睡觉看出贫富差距?

神回复:“我上床睡觉了”“我回房间睡觉了”“我去楼上睡觉了”

25

为什么人常会在黑夜里,变得矫情万分?

神回复:要渲染的图像少了,CPU就有空闲来思考人生了。

26

如何用一句话证明你很寂寞?

神回复:这句话一共有六十九笔。

27

矮是什么感觉?

神回复:所有人见到我都抬不起头。

28

有哪个瞬间会让你想“就这么一直下去该多好”?

神回复:ATM吐钞的时候。

29

喝酒的乐趣是什么?

神回复:吞下去的是苦水,吹出来的是牛。

30

如何让时间变慢?

神回复:做平板支撑。

沉默是金

年少时只觉歌好听,中年已是曲中人;

夜风凛凛 独回望旧事前尘
是以往的我 充满怒愤
诬告与指责积压着满肚气不忿
对谣言反应甚为着紧
受了教训 得了书经的指引
现已看得透 不再自困
但觉有分数
不再像以往那般笨
抹泪痕轻快笑着行
冥冥中都早注定你富或贫
是错永不对真永是真
任你怎说安守我本分
始终相信沉默是金
是非有公理 慎言莫冒犯别人
遇上冷风雨休太认真
自信满心里 休理会讽刺与质问
笑骂由人 洒脱地做人
受了教训 得了书经的指引
现已看得透 不再自困
但觉有分数
不再像以往那般笨
抹泪痕轻快笑着行
冥冥中都早注定你富或贫
是错永不对真永是真
任你怎说安守我本份
始终相信沉默是金
是非有公理 慎言莫冒犯别人
遇上冷风雨休太认真
自信满心里 休理会讽刺与质问
笑骂由人洒脱地做人
少年人洒脱地做人
继续行洒脱地做人

谁可以决定你的名字

我等临世之初,皆赤身柔弱、一无所有。立祠祭祖,乃是感激先人赐生、赐养、赐成之功德,不仅赐我等之身体发肤,亦留今日所享用的一切。不忘身从何来、不忘德之所教、不忘何以立世,此为孝。

姓名,不是乱起的,哪怕是天才,神算,相师这类起名大能,也不是随便给人起名的。

姓名,赐生、赐养、赐成,从不轻易与人。赐予姓名,是看重的表示,如果背叛,要承受的惩罚也是成倍的。

比如像小竹小荷以及花千朵,小白,大黄,红豆,像是一个宠物,好歹也是个名还不是么。

对于人而言,赐生者、赐养者、赐成者,方可赐名。绝大多数人的名字都是父母起的,亲生父母或者养父母,这就是赐生、赐养的关系。

很多父母也会请别人帮忙给孩子起名,比如说找个算命先生给起个“好”名字。这并不等于算命先生有资格给别人的孩子起名,这仍然是父母在行使权利,只是找人咨询而已。

还有一种情况,比如出家人的法号、学艺者的艺名一般都是师父给起的。师父得教授他进入某一行或者某一门的方法,这是赐成者。

有的人成年后会给自己改名字,或者起笔名与网名,这也是赐成者,因为每个人的成就既依靠自己也属于自己。

皇帝陛下为什么要造反

在古代的皇帝制度中,皇帝是金字塔顶,掌握生杀大权,整个国家的财富和资源。当然这是在正常的情况下。历史上也有很多”不正常”的皇帝,他们虽然高高坐在龙椅上,但是头顶总悬着一把剑,这把剑的主人就是权臣。这样的皇帝战战兢兢,如履薄冰,稍有不慎就会被废掉。小编下面要说的就是这样的事。

两晋和隋朝之间有一段分裂混战的乱世,被成为南北朝时期。南朝有四个–宋、齐、梁、陈,四个向走马灯一样,你方唱罢我等场的南方政权,北方有北魏、东魏、西魏、北齐、北周。北魏是一个整体的北方,后来分裂为东魏和西魏,东头一个,西头一个,再往后各自被北齐和北周取代。南北朝大概就是这么个走向。

北魏为什么要分裂呢?和一个权臣有关。这个人叫做高欢,是个汉人,但是由于生活的环境影响,已经鲜卑化了。他是怎么爬上去的小编就不赘述了,总之最后高欢是权倾朝野,实力非常大。北魏孝武帝元修搞不过他,那怎么办啊?干脆跑吧。于是元修投奔宇文泰去了。高欢索性再立元善见为帝,于是北魏就被分开了。

抛开西魏不讲,单说东魏的皇帝元善见,那纯粹就是一个傀儡。元善见比较聪明,知道自己是个什么情况,他能忍。后来高欢去世,高澄继承了权力,他更加嚣张跋扈。元善见有一次打猎,马跑得快了一点,就有人提醒他别跑得太快;还有一次元善见和高澄在酒桌上起了矛盾,高澄骂他是”狗脚朕”,还让人给元善见三记老拳。这皇帝当得真是憋屈。

元善见不想这么憋屈,想要干掉高澄。他也有一些追随者,荀济等人就想帮助元善见逃出去,然后再说别的。怎么逃呢?挖地道吧。于是这帮人就开挖。没想到挖到千秋门的时候,让守门士兵听到动静了,汇报给高澄。结果滑稽的一幕发生了,高澄带着兵闯进皇宫,质问元善见:”陛下为什么要造反呢?”

元善见听到这样荒唐的问题实在是忍不住了,正面顶撞高澄。高澄一看皇帝翅膀硬了,说说好话吧。于是他哭着叩头谢罪,再跟元善见来顿小酒,一醉化恩仇。当然这并没有什么卵用。后来高澄去世,高洋继承权力,他逼迫元善见禅让,开创了北齐。

参考文献:《魏书》

Memcache 内存分配策略

memcached的内存存储机制

Memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。

Slab Allocator的基本原理是按照预先规定的大小,将分配的内存以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定,分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配,以解决内存碎片问题。

Page

分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。

Chunk

用于缓存记录的内存空间。

Slab Class

特定大小的chunk的组。

Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。memcached根据收到的数据的大小,选择最适合数据大小的slab。memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。例如:100字节大小的字符串会被存到slab2(88-112)中,每个slab负责的空间是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修改-f参数来修改增长比例。

Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。chunk是memcached实际存放缓存数据的地方,这个大小就是管理它的slab的最大存放大小。每个slab中的chunk大小是一样的,如上图所示slab1的chunk大小是88字节,slab2是112字节。由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。这里需要注意的是chunk中不仅仅存放缓存对象的value,而且保存了缓存对象的key,expire time, flag等详细信息。所以当set 1字节的item,需要远远大于1字节的空间存放。

memcached在启动时指定 Growth Factor因子(通过-f选项), 就可以在某种程度上控制slab之间的差异。默认值为1.25。

slab的内存分配具体过程如下:

Memcached在启动时通过-m参数指定最大使用内存,但是这个不会一启动就占用完,而是逐步分配给各slab的。如果一个新的数据要被存放,首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如果没有则要进行申请,slab申请内存时以page为单位,无论大小为多少,都会有1M大小的page被分配给该slab(该page不会被回收或者重新分配,永远都属于该slab)。

申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,再从这个chunk数组中选择一个用于存储数据。若没有空闲的page的时候,则会对改slab进行LRU,而不是对整个memcache进行LRU。

Memcached stats sizes

Memcached stats sizes 命令用于显示所有 item大小个数

stats sizes

该命令返回两列,第一列是 item 的大小,第二列是 item 的个数

Memcached 1.4.27 及以后的版本自动开启了 stats sizes 功能

这之前的版本需要在 Memcached 启动时带上 -o track_sizes 则来开启

如未开启会提示

STAT sizes_status disabled # 提示 sizes_status 不可用

经测试1.5版本中默认也是禁用的,需要添加参数开启