期权策略:Bull Call Spread

Bull Call Spread,可以翻译成牛市看涨价差策略,这是一个期权交易策略。

Bull Call Spread

这个交易策略由两个看涨期权(call option)组成,购买一个远期看涨期权,同时卖出一个相同到期日但是执行价更高的看涨期权。

使用这个策略的交易员期望投资标的以一个缓慢的趋势看涨。

优点

  • 该期权交易策略可以避免持有资产并且资产大幅下跌的风险
  • 可以认为是以打折的价格购买一个看涨期权,减少了部分买入看涨期权所花费的期权费
  • 适合在远期(几周,几个月)看好的标的上进行操作。
  • 该期权最适合在那些稳步上涨的股票中进行操作,在不持有正股的情况下也可以享受上涨的收益
  • 牛市看涨价差期权比仅购买看涨期权更便宜
  • 该策略将拥有资产的最大损失限制为策略的净成本

最大风险

  • 股价跌落,丧失期权购买费用
  • 另外就是如果股价突然上涨很多,那么该策略的最大收益也是封顶的,不会跟随着股价上涨而增加

如何构建牛市看涨价差策略

为了构建一个牛市看涨价差策略需要执行以下的一些操作

  • 首先要确定一个资产,这个资产最好是会稳步上涨的,并且提供足够的期权交易市场(期权交易流动性好),这个资产可以是股票,指数或者是现物(Currency)
  • 购买一个看涨期权,首先购买一个价内的看涨期权,这个期权可以是一个价内(In the money),具有内在价值的看涨期权。
  • 卖出一个同样到期时间的,价外看涨期权,重点在于同样到期时间,并且行权价更高的看涨期权。该看涨期权的价格肯定没有买入的看涨期权价格高,只能抵掉一部分(相当于一个折扣)
  • 监控持仓和市场,Bull Call Spread 策略建立之后,交易者可以监控期权的价格。
  • 结束持仓,如果行权日期临近,可以决定是否行权,或者通过卖出 Long Call 和买入 Short Call Option 的方式来关闭此策略。如果行权日时,股票的价格在卖出去的看涨期权行权价之上,那么此策略可以获得最大的收益。

需要注意的是,Bull Call Spread 策略的最大收益受限于两个看涨期权中间的价差减去期权价格,而最大的风险就是损失构建策略的期权购入价格。

一个例子

假如有一个股票叫做 ABC,当前的价格是 50 USD,交易者认为该股票会在下个月上涨,所以想要建立一个 Bull Call Spread。

首先购买一个在下个月到期的 50 USD 行权价的看涨期权,这个看涨期权叫做 at-the-money option,因为行权价就是当前的交易价格,期权的价格是每股 3 USD。

同时卖出了相同行权日,行权价 55 USD 的看涨期权,这个期权叫做 out-of-the-money 期权(价外期权),因为价格高于当前交易价格。

完成交易后,就构成了 Bull Call Spread。

波动性对牛市看涨价差的影响

因为同时买入和卖出了看涨期权,一定程度上波动性被抵消了。

当波动性上升时,两种期权的价格都会上涨,这意味着多头看涨期权的价值会增加,同时空头看涨期权的价值也会增加。但是由于这个策略是做多一个期权,并做空另外一个看涨期权,波动率在一定程度上被相互抵销了。

用期权的语言来说,这通常被称为「near-zero vega」,Vega 衡量期权价格对波动性变化的敏感度,接近于零的 Vega 意味着,假设其他因素保持不变,波动性发生变化时,Bull Call Spread 的价格变化很小。

但是需要指出的是,牛市看涨价差并不完全不受到波动性变化的影响,确切的影响可能还取决于其他因素,包括期权处于价内或价外的程度,以及距离到期的时间。

时间对牛市看涨价差的影响

时间对 Bull Call Spread 的影响,也称为时间衰减或 theta,这个有点复杂,该策略包含两种看涨期权,这两种期权对时间的流逝都有不同的反应。

期权总价值的时间价值部分随着行权日期临近而减少,这个称为时间侵蚀(time erosion)或时间衰减(time decay)。

对于多头看涨期权来说,时间衰减是有害的,随着时间推移,在其他条件相同的情况下,所购买的期权的价值会下降。这是因为该期权实现盈利的时间较少,价值较低。

另外一方面,对于空头看涨期权,时间衰减对卖出方有利,随着时间推移,出售的期权价值会下降,交易者对该期权负有义务,如果空头看涨期权到期时一文不值,交易者将保留出售该期权所获的全部权利金。

时间衰减对牛市看涨价差策略的总体影响取决于股票价格与价差执行价格的关系。如果股票价格接近或低于多头看涨期权(即执行价格较低的看涨期权)的执行价格,那么牛市看涨价差策略的价格会随着时间的推移而下降,发生亏损。多头看涨期权最接近交易价格,并且比空头看涨期权价值下降更快。

如果股票价格接近或高于空头看涨期权(即执行价格较高的看涨期权)的执行价格,那么牛市看涨价差策略的价格会随着时间的推移而增加,发生盈利。空头看涨期权现在比多头看涨期权更接近交易价格,价值下降得更快。

最后,如果股价处于执行价格的中间,那么时间侵蚀对牛市看涨价差的价格几乎没有影响,因为多头和空头看涨期权以大致相同的速率衰减。

资产标的价格变化对牛市看涨价差的影响

标的资产的价格变化对牛市看涨价差有重大的影响,当标的资产的价格上涨时,会获利。

如果资产价格大幅上涨并超过空头看涨期权的行权价,那么策略达到最大利润。多头看涨期权的价值增加,空头看涨期权则被标的资产价格的上涨所抵消。

另外一方面,如果标低价格温和上涨,并且在到期时处于多头看涨期权行权价和空头看涨期权行权价价格之间,该策略仍然会获利,但是不是最大收益。多头看涨期权的价值增加了,但是空头看涨期权的价值也开始增加,降低整体利润。

最后,如果标的资产价格下跌,或者没有涨幅,该策略产生净损失。如果到期时价格低于多头看涨期权的执行价,那么两个期权将在到期时毫无价值,并且建立策略时的权利金。

其他考虑和风险

该策略还有一些隐含的需要考虑的内容

  • 提前行权风险,美式期权可以在到期前任何时间行权,空头期权的持有者无法控制时间,随时都可能被要求履行义务。该策略中的空头看涨期权面临提前转让的风险,特别是当其接近到期日,且标的资产价格高于空头看涨期权的执行价格时。如果发生转让,交易者可能需要以空头看涨期权的执行价格出售标的资产
  • 股息,如果标的资产支付股息,可能会影响空头看涨期权提前分配的可能性,时间价值小于股息的实值看涨期权可能被提前分配
  • 不可避免的交易成本,买卖期权的成本可能会增加,特别是在交易者使用少量期权的情况下,成本可能会侵蚀交易的利润
  • 市场条件,牛市看涨价差最适合在适度看涨的市场中使用,如果市场波动很大或看跌,那么该策略可能不是最佳的选择
  • 到期日的选择,到期日的选择可以显著地影响牛市看涨价差的结果,如果到期日太早,标的资产可能没有足够的时间来实现预期的价格变动,如果到期日太远,期权费用可能很贵,构建该策略可能需要更多的资金。
  • 执行价格的选择,多头和空头看涨期权执行价格的选择也很重要,执行价格之间的价差越大,潜在的利润也越高,但是潜在的损失也越大。

Bull Call Spread 策略可以限制风险,最大的可能损失就是构建策略的成本,但是这个策略也限制了潜在的利润。

如何实施

Bull Call Spread 策略可以选择未来一段时间(几天,几周或几个月)小幅升值的资产来实现。

  • [[牛市看涨期权价差策略]]
  • [[牛市看跌期权价差]]
  • [[熊市看跌期权价差]]
  • [[熊市看涨期权价差]]

相关工具

如果你在日本


2024-06-14 call-option , option , option-trading , bull-call-spread , investment , invest , 期权 , 投资

使用 Quartz 发布 Obsidian 笔记库

自从使用 [[Obsidian]] 以来就一直想要有一个开源版本的 [[Obsidian Publish]] 代替,过去这几年也尝试了不少方案,比如 Jekyll 静态网站生成,比如使用 [[Logseq]] 生成网站, 然后还想过从 Obsidian 同步到 Notion 里面,然后再使用 [[NotionNext]] 来生成网站。

下面是所有我尝试过的方案

  • [[Nolebase]] 一款基于 VitePress 的在线知识库
  • [[Obsidian Digital Garden Plugin]] 一款 Obsidian 插件,结合 GitHub 仓库可以实现快速分享笔记
  • [[Digital Garden Gatsby Template]] 一款 Gatsby 模板
  • [[Digital Garden Jekyll Template]] 一个 Jekyll 模板
  • [[Gatsby Theme Primer Wiki]]
  • [[MindStone]]
  • [[Obsidian-mkdocs template]] 基于 [[mkdocs]] 的知识库
  • [[Obsidian PKM]]
  • [[Jekyll Garden Template]]
  • [[Perlite]]
  • [[Pubsidian]]
  • [[flowershow]]

但是以上的方案我尝试之后都不是一个我认可的完善的方案,或多或少有一些问题,也不能和我自己的工作流程结合起来。

但是很多年前看到过一个静态网站分享的方案 Quartz,没想到发展了几年之后发布的 v4 版本,可以完美的融合到我的工作流中,并且可以非常方便地分享我的本地 Obsidian Vault。

什么 Quartz

Quartz 是一个静态网站生成工具,可以用来发布 Markdown 的笔记,和 Obsidian 搭配使用绝佳。

Quartz 发布 4.x 版本之后可用度大大提高,并且可以直接作为 Obsidian Publish 的开源代替存在。

Quartz 需要 Node v18.14 以及 npm v9.3.1

功能

  • 自动生成双向链接 Automatically generated backlinks
    • 支持 wikilinks,backlinks, Latex, 语法高亮
  • 支持 Graph View
  • 链接预览 Link Previews
  • 本地关联图 Local graph
  • 支持两种链接 Markdown and WikiLinks
  • 支持 Table of Content
  • Dark & light mode

Cons:

  • No sidebar Navigation

安装

通过克隆代码本地安装

git clone https://github.com/jackyzha0/quartz.git
cd quartz
npm i
npx quartz create

在执行了上面的命令之后,会在命令中选择是否要创建一个全新的仓库,还是直接使用 ln -s 来软链接一个既存的文件夹。

然后再运行

npx quartz build --serve

就可以直接启用一个本地的在线预览。

最后效果可以参考这里

reference


2024-06-12 obsidian , obsidian-publish , obsidian-vault

爱沙尼亚电子居民申请记录

在网上逛论坛的时候,偶然看到有人提到了一个爱沙尼亚电子公民的电子居民卡,看起来挺有意思的,之前就看到过 [[帕劳数字居民身份证]],去检索了一下发现帕劳已经涨价到了 248 欧元,爱沙尼亚电子公民感觉上类似,所以就简单的记录一下。

爱沙尼亚的数字居民(E Resident)计划是由爱沙尼亚在 2014 年推出的一项电子公民计划。爱沙尼亚成为了第一个推出电子公民计划 E Residency 的国家。

爱沙尼亚目前是欧盟和北约的成员国,国旗是蓝黑白三色,国家域名是 .ee 电话号码的国际区号是 +372。

爱沙尼亚位于欧洲东北部,由大陆部分和波罗的海的 2222 个岛屿组成。它西临波罗的海,北濒芬兰湾,东靠楚德湖,南面和东面分别与拉脱维亚和俄罗斯接壤,总面积为 42,388 平方公里。该国属于温带大陆性湿润气候,主要民族是爱沙尼亚人,他们属于波罗的芬兰人。爱沙尼亚是北欧理事会、欧洲联盟、欧元区、申根区、北大西洋公约组织以及经济合作与发展组织的成员国之一,也是世界高收入经济体之一。

自上世纪 90 年代开始,爱沙尼亚就致力于成为互联网强国。所有的小学生都需要接受编程教育,并且将接入互联网视为基本人权之一。早在 2002 年,爱沙尼亚就已经完成了对境内大部分地区的 WiFi 覆盖。如今,几乎所有政府服务,包括投票选举、工商注册、报税等等,都可以在线办理,覆盖率高达 99%。爱沙尼亚发达的互联网也造就了很多互联网公司,比如 Skype,Hotmail 以及 [[Wise]]。

爱沙尼亚电子公民

爱沙尼亚电子公民不是签证,也不是居留权,所以如果要去爱沙尼亚旅游,还是需要申请申根区的签证。电子公民也不会影响原来国籍。

那么电子公民有什么好处?

  • 无需到爱沙尼亚,就可以注册一家爱沙尼亚的公司,之后可以完全线上经营,同时也可以开设爱沙尼亚银行账户,用于境外投资和交易
  • 爱沙尼亚公司启动成本低,注册公司仅需要 190 欧元,营收税率 0%,并且信誉高
    • 但需要注意,如果公司要进行分红或者开工资时,需要缴纳 20% 的税款

申请流程

要成为爱沙尼亚电子公民非常简单,只需要准备好如下材料

  • 护照照片或复印件
  • 使用英文准备好申请的目的和动机,至少 1000 个字母,不超过 2000 个字母
  • 支持支付 120 欧元的国际信用卡(Visa or Mastercard)
  • 一张近期拍摄的至少 1300 x 1600 像素的照片,但不大于 6000 x 7380 像素,至少 1MB,最大 5MB

登录爱沙尼亚电子公民计划官网,点击网页右上角的 「Apply Now」,根据提示填写个人信息,然后选择 Pick-up Location (领取卡片的地方)然后爱沙尼亚的边境管理部分会审核材料,通过之后就可以去大使馆领取电子公民卡。

北京领取卡片的地方在大使馆,北京市朝阳区亮马桥北小街 1 号(天泽路东门入口),只需要带上护照即可。如果是在东京,那么到东京的大使馆领取即可。其他地方可以根据官网 的内容进行选择。

最后会问为什么要申请爱沙尼亚的电子公民,根据自己的实际需求填写就行,这里推荐可以自己先写中文,然后借助 ChatGPT,Gemini(Bard) 等工具翻译成英文。

申请的几个步骤

  • Reason for applying 申请理由,目的,如果是开设公司则需要提供一些公司信息,这个地方我直接选择了 I do not have clear plans but I would like to be a member of the community of e-residents
  • Personal and contact details 填写个人信息,包括姓名,出生日期,国籍等
  • Identification details 护照信息 联系信息
  • CV, social media and bank accounts,简历,社交媒体主页链接,银行账号
  • Trade bans and criminal background 申明
  • Pick-up location,选择领取卡片的领事馆,选择一个就近的前往即可
  • Review your information,检查填写的信息是否正确
  • Terms & conditions,同意条款
  • Confirmation 提交申请并支付费用

申请注意

准备材料的时候所有文件都使用英文名命名,在上传的文件名中不要包含中文,日文或其他语言文字。

另外照片需要大于 1MB,可以使用 macOS 的 preview 然后放大照片的解析度。

QcvfAc6C32

另外申请的时候需要

时间

等待线上申请提交之后,会进入审核阶段。

  • 申请表单会保存 2 个月,如果 两个月内没有,申请表单会过期。
  • 申请提出到处理大约需要 30 天
  • 从账户审核完成到寄送到目的地大约需要 2 个月时间

所以总体下来,如果从网站申请,到审批签发,大约需要 1 个月到 2 个月左右时间。

费用

手续注册需要 120 欧元费用,后续 renew 也需要 100~120 欧元费用。

设置 e-ID

拿到 E-Residency Kit 之后不能马上使用,需要等待大约 24 小时等大使馆将信息传回爱沙尼亚,然后收到邮件通知之后,就表示被激活可以使用了。

e-Residency Kit 包含了

  • 电子芯片卡
  • USB 读卡器
  • 密码信封,PIN,PUK 码
  • 使用说明书

注册爱沙尼亚公司

如果想要使用这个电子居民身份开公司,有一家服务提供商 Xolo 提供,也可以直接参考 官方如何 run a company 获取其他信息。

e-Residency 官网提供了一个市场 上面列出了所有支持 e-Residency 的公司,比如提供公司注册的 Xolo,1Office,e-Residency Hub, 有提供银行开户的 LHV,Wise,Payoneer,Stripe 等等。

开设银行

爱沙尼亚也有一些银行支持电子居留卡登录和管理

  • SEB(瑞典),在爱沙尼亚有业务
  • 瑞典银行(瑞典)
  • LHV(爱沙尼亚),一家中等规模的现代爱沙尼亚银行,LHV 实际上是 Transferwise 使用的所有 SEPA 欧元交易的银行
    • 两家分行,塔林和塔尔图
  • [[拉脱维亚数字居民]]
  • 立陶宛电子居民
  • [[帕劳数字居民身份证]]
  • [[爱沙尼亚开公司]]

2024-06-10 爱沙尼亚 , 电子居民 , 帕劳 , KYC , 欧盟 , 公司 , 商业

DNS 泄漏以及如何防止

什么是 DNS 泄漏

DNS 泄露(DNS Leak)是指当使用虚拟专用网络(VPN)或其他匿名工具时,域名系统(DNS)查询数据绕过加密隧道,直接通过用户的本地 ISP(互联网服务提供商)进行解析。这意味着用户的浏览活动可能被 ISP 监视或记录,进而暴露了用户的实际 IP 地址和在线活动。

在深入探讨 DNS 泄露之前,有必要了解 DNS 的基本工作原理。DNS 是互联网的电话簿,当用户输入一个域名(如www.example.com)时,DNS将其转换为对应的IP地址(如192.0.2.1),以便计算机能够理解和访问该网站。

通常情况下,用户的设备会向 ISP 的 DNS 服务器发送请求进行解析。然而,当用户使用 VPN 时,所有的流量应通过加密的 VPN 隧道传输,并由 VPN 提供商的 DNS 服务器处理 DNS 请求。

DNS 泄露的原因 DNS 泄露可能由于以下几个原因发生:

操作系统配置问题:一些操作系统可能会忽略 VPN 设置,继续使用本地 DNS 服务器。 VPN 设置不当:不正确的 VPN 配置可能导致 DNS 请求未能通过 VPN 隧道传输。 VPN 软件缺陷:某些 VPN 软件存在缺陷,无法正确处理 DNS 请求。 IPv6 配置问题:如果 VPN 只处理 IPv4 流量,而未配置 IPv6,IPv6 流量可能会直接泄露。

如何检测 DNS 检测

检测 DNS 泄漏有很多方法,最简单的方法就是找一个在线的检测工具。

在线检测 DNS 泄漏的工具,通过用户访问网页的时候,在网站上生成多个域名解析请求,通过用户的设备发起,网站通过脚本捕获并记录这些域名请求结果,这些网站根据 DNS 响应,判断是哪个 DNS 服务器处理的,然后通过对比 DNS 服务器 IP 地址与公共 DNS 服务器 ISP DNS 服务器进行匹对。

如果检测的 DNS 服务器属于用户的 ISP 或者其他不安全的 DNS 服务器,而非用户期待的 DNS 服务器,则说明了 DNS 泄漏。

DNS 泄漏会造成什么影响

暴露用户的真实 IP 地址

即使用户使用 VPN 或者其他匿名网络访问工具来隐藏其真实的 IP 地址,但是如果 DNS 请求没有通过 VPN 隧道,而是通过用户自己的 ISP 解析,那么 ISP 和其他潜在的监听者仍然可以看到用户的真实 IP 地址,这意味着用户的地理位置和身份可能被暴露。

DNS 请求包含了用户访问的域名,如果这些请求通过 ISP 解析,ISP 可以记录和分析用户的浏览历史,这使得用户的在线活动变得不再私密,并且可能被用户于广告投放,数据挖掘,甚至在某些国家可能被政府监控。

潜在的网络攻击

DNS 泄漏还可能使得用户更容易成为攻击的目标,比如,攻击者可以利用 DNS 请求来识别用户网络行为,实施 DNS 劫持或中间人攻击,将用户引导至伪造的网站或恶意服务器,从而窃取敏感信息或传播恶意软件。

信息过滤和审查

某些政府或地区,政府或 ISP 会对用户访问的内容进行过滤和审查。通过 DNS 泄漏,政府或 ISP 可以轻松跟踪和组织用户访问被审查或禁止的网站,从而限制用户的互联网自由。

如何防止 DNS 泄漏

  • 使用可靠的 VPN 服务,并且配置 VPN 的 DNS,将所有的网络请求通过 VPN 进行
  • 手动配置 DNS 服务器
  • 如果 VPN 不支持 IPv6,则禁用 IPv6
  • 操作系统和路由器配置静态路由,或自行搭建安全的 DNS 服务器,比如 AdGuard Home [[PiHole]] 等

2024-06-09 dns , dns-leak , host , domain-resolve

从内地到香港出金最佳的方法

银行汇款

汇丰银行内地转汇丰银行香港

汇丰银行卓越及以上等级的用户可以免手续费汇款到汇丰银行香港。

内地中行到中银香港

中国银行的购结汇中,如果是境外中行,可以免除手续费以及电讯费的。

中行国内的普通借记卡即可。

中行对全球设有境外支行的当地中行都可以进行汇款,并且享受手续费减免,对日本汇款是 300 万日元内 1500 手续费,到香港是免除手续费的。

需要注意的是尽量到业务量比较大的支行办理开卡,业务量小的支行可能会为了揽储或完成 KPI 等,在汇出时各种阻拦

0 手续费兴业银行到汇丰银行

兴业银行寰宇人生借记卡可以以比较优惠的现汇利率购汇,然后也可以零手续费

直接到香港线下存款

优点是不占用每年 5 万的外汇限额,但是不方便,并且出境也有现金的限制。

境外赚取美元

比如在 AdSense,YouTube,X 等平台赚取美元,如果可以开设香港的账户,可以直接打款到香港的账户,然后不过国境。

对敲

如果有朋友需要港币换人民币,或者日元换人民币,那么可以通过朋友的账户直接进行(小额的)转账,国内通过银行到银行人民币转账,境外通过香港银行到香港银行的转账。

或者通过 熊猫速汇 或者 Wise 等等服务平台进行换汇。


2024-06-08 香港银行卡 , 香港 , 外汇 , 汇款 , 港币

Homerow 使用 Vimium 的方式控制 macOS

Homerow 是一个 macOS 上的快捷键助手,可以使用类似 [[vimium]] 的操作方式来控制 macOS。

速度快,原生应用,并且还是非常良心的一次性买断制。

RXOMAyCJJc


2024-05-29 homerow , macos , vimium , vim , chrome

如何避免 MySQL 因为内存不足被系统 Kill

这两天一台 VPS 上的 MySQL 总是自己宕机,查看了一下日志发现是因为 OOM ,内存不足被系统 Kill 了。

❯ sudo /etc/init.d/mysqld status
× mysqld.service - LSB: start and stop MySQL
     Loaded: loaded (/etc/init.d/mysqld; generated)
     Active: failed (Result: oom-kill) since Mon 2024-05-27 22:23:15 CST; 12h ago
       Docs: man:systemd-sysv-generator(8)
    Process: 2419860 ExecStop=/etc/init.d/mysqld stop (code=exited, status=0/SUCCESS)
        CPU: 1h 11min 53.021s

Notice: journal has been rotated since unit was started, output may be incomplete.

网上稍微查了一下,可以使用修改 syetemd service 的方式来阻止 Linux 因为内存不足而杀死 MySQL。

做法

编辑

sudo systemctl edit mysqld.service

然后在配置文件中添加

[Service]
OOMScoreAdjust=-1000

保存配置文件之后,重启 MySQL

sudo systemctl restart mysqld.service

可以检查配置是否生效,记得替换 MySQL 的 PID。

cat /proc/$(pidof mysqld)/oom_score_adj

原因分析

MySQL 宕机并出现 “Out of memory” 问题,通常是由于短时间内应用程序大量请求导致系统内存不足,从而触发了 Linux 内核中的 Out of Memory (OOM) killer 机制。OOM killer 会终止某个进程以释放内存给系统使用。

通过检查相关日志文件(/var/log/),可以看到类似的 Out of memory: Kill process 信息:

May 25 19:06:53 wh kernel: [5351539.967422] php-fpm invoked oom-killer: gfp_mask=0x1100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
May 25 19:06:53 wh kernel: [5351539.967429] CPU: 1 PID: 2384831 Comm: php-fpm Not tainted 5.15.0-84-generic #93-Ubuntu

Linux 内核根据应用程序的需求分配内存,通常应用程序分配了内存但未全部实际使用。为提高性能,这部分未用的内存可以被其它进程利用。这种内存归属于每个进程,内核直接回收利用较为复杂,因此采用了内存过度分配(over-commit memory)的策略,以间接提高内存使用效率。一般情况下,这种策略是有效的,但当大多数应用程序同时消耗内存时,问题就出现了。此时,所有应用程序的内存需求加起来超出了物理内存(包括 swap)的容量,内核必须通过 OOM killer 终止一些进程来释放内存,保障系统正常运行。可以通过银行的例子来理解:当部分人取钱时银行能够应对,但如果全国人民同时取钱且都想取完自己的钱,银行实际上无法满足。

内核检测到内存不足并选择终止进程的过程,可以参考内核源代码 linux/mm/oom_kill.c。当系统内存不足时,会触发 out_of_memory(),然后调用 select_bad_process() 选择一个 “bad” 进程进行终止。选择 “bad” 进程的过程由 oom_badness() 决定,其算法主要根据进程占用的内存量来判断:

/**
 * 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;
    }

    points = get_mm_rss(p->mm) + p->mm->nr_ptes + get_mm_counter(p->mm, MM_SWAPENTS);
    task_unlock(p);

    if (has_capability_noaudit(p, CAP_SYS_ADMIN))
        adj -= 30;

    adj *= totalpages / 1000;
    points += adj;

    return points > 0 ? points : 1;
}

理解了这个算法,我们就理解了为什么 MySQL 总是被首当其冲地终止,因为它的内存占用最大。解决这个问题的最简单方法是增加内存,或优化 MySQL 使其占用更少的内存。此外,还可以优化系统以减少内存占用,使应用程序(如 MySQL)能够使用更多内存。一个临时解决方案是调整内核参数,使 MySQL 进程不易被 OOM killer 选中。

配置 OOM killer

可以通过调整内核参数来改变 OOM killer 的行为,避免频繁终止进程。例如,可以在触发 OOM 后立即触发 kernel panic,并在 10 秒后自动重启系统:

# sysctl -w vm.panic_on_oom=1
vm.panic_on_oom = 1

# sysctl -w kernel.panic=10
kernel.panic = 10

# echo "vm.panic_on_oom=1" >> /etc/sysctl.conf
# echo "kernel.panic=10" >> /etc/sysctl.conf

从上面的 oom_kill.c 代码可以看到,oom_badness() 会为每个进程打分,根据分数决定终止哪个进程。可以通过调整进程的 oom_score_adj 参数来控制哪些进程不易被选中终止。例如,如果不希望 MySQL 进程被轻易终止,可以找到 MySQL 的进程号,并将其 oom_score_adj 设置为 -15:

# ps aux | grep mysqld
mysql    2196  1.6  2.1 623800 44876 ?        Ssl  09:42   0:00 /usr/sbin/mysqld

# cat /proc/2196/oom_score_adj
0
# echo -15 > /proc/2196/oom_score_adj

当然,如果需要的话,还可以完全禁用 OOM killer(不推荐在生产环境中使用):

# sysctl -w vm.overcommit_memory=2
# echo "vm.overcommit_memory=2" >> /etc/sysctl.conf

2024-05-28 mysql , linux , oom , oom-kill

Octarine 一个注重隐私的本地 Markdown 编辑器

Octarine 是一个注重隐私的本地 Markdown 编辑器。

功能

  • No vendor lock-in,不会被 Lock 到这个应用,可以随时切换成其他的应用
  • 支持多工作区,快速切换
  • 日历视图,以及日记,可以快速开始记录笔记
  • WYSIWYG 所见即所得编辑器
  • 所有的文件都保存在本地
  • 6 MB 大小

相较于 Obsidian

自从我发现并使用Obsidian 以来,我个人已经使用单一 Obsidian Vault 好多年了,我所有的摘录,笔记,Memo,PDF 文档全部都交给了 Obsidian 进行管理。到目前为止,Obsidian 的使用体验也没有任何可以让我放弃的理由。

如果和 Obsidian 比较的话,那么 Octarine 唯一值得一提的就是安装程序的大小,仅有 6 MB 大小,其他的体验,比如所见即所得的编辑器,因为我大部分情况下使用 Markdown,全部的时间都使用 Vim 模式,所以对我来说甚至是一个缺点。而我去 Reddit 官方询问了是否有 Vim 模式的支持,也没有得到正面的反馈。

因为没有 Vim 模式,就这一点,我就需要暂缓考虑 Octarine 了,不过也正是这一点,可以推荐给其他不使用 Vim 模式的朋友。

另外 Octarine 目前还没有插件系统,所以只推荐将其作为一个本地离线的 Markdown 编辑器,或者本地离线的个人知识管理来使用。


2024-05-24 markdown , obsidian , octarine , editor , knowledge , personal-knowledge-management

微信一次性发送超过 9 张照片

微信几乎是每天都会打开使用的 IM,但是这么多年了,我一直以为微信只能一次性发送 9 张图片。日本的五一黄金周出门玩了几天,用相机拍了不少照片,然后在电脑上如果只能 9 张 9 张的发送,那么也太麻烦了。

然后我就想有没有其他方法,当然我自己有我自己的网络相册 EV Photos 的,通过加密的网络相册也能发送,但是有一些还是不想再上传一遍到网络相册,毕竟还是会占用 VPS 空间,然后使用 AirDrop 也是一种方案,但仅限于大家在一起的时候,使用 iCloud 相册分享,有人用 Android,使用 Google Photos 分享,有人上不去,唉。

所以最后还是得在微信里面发送,于是我开始寻找微信有没有什么办法可以一次性发送多张照片,没想到的是,还真有!

在微信里面,可以在个人页面中找到「收藏」,在 macOS 桌面版也是一样,在收藏中点击 + 号,新建笔记,然后在菜单栏中「图片」选项中添加自己想要发送的图片即可。

在这个收藏里面,添加照片的数量和大小是没有限制的,想发多少就可以发送多少,间接地实现了一次性发送多张照片的需求。

vRfD

把照片全部拖到收藏笔记里面之后,点击笔记右上角的点点点,然后发送给朋友,这样就实现了一次性全部分享。

在笔记中还可以看到图片的数量,如果要转发给多个朋友,创建多个笔记即可。


2024-05-23 wechat , 微信 , 使用技巧 , 生活经验

ProxMobo 一款 Proxmox VE 管理客户端

ProxMobo 是一个第三方的 iOS 上 [[Proxmox VE]] 的管理工具,可以直接在 iOS 上直接对 Proxmox VE 进行查看,管理(停止,重启虚拟机等操作),或者可以直接通过 VNC,或终端对虚拟机进行管理。

功能

  • 通过 Host, 用户名和密码登录 Proxmox VE(PVE) 实例
  • 查看和管理 PVE 中的虚拟机,包括启动,停止,暂停,恢复,重启,关机等
  • 可以对虚拟机进行简单的配置,包括名字,是否和 PVE 同时启动,

界面预览

管理界面

vWvh

虚拟机管理界面。

vEgr

虚拟机详情

vzWH

PVE 虚拟配置管理

vdIC

注意

  • 最低要求 iOS 16
  • 另外要使用 VNC 和终端需要付费订阅

2024-05-22 proxmox , proxmox-ve , linux-virtualization , virtual-machine , proxmobo , pve-client

电子书

本站提供服务

最近文章

  • 期权策略:Bull Call Spread Bull Call Spread,可以翻译成牛市看涨价差策略,这是一个期权交易策略。
  • 使用 Quartz 发布 Obsidian 笔记库 自从使用 [[Obsidian]] 以来就一直想要有一个开源版本的 [[Obsidian Publish]] 代替,过去这几年也尝试了不少方案,比如 Jekyll 静态网站生成,比如使用 [[Logseq]] 生成网站, 然后还想过从 Obsidian 同步到 Notion 里面,然后再使用 [[NotionNext]] 来生成网站。
  • 爱沙尼亚电子居民申请记录 在网上逛论坛的时候,偶然看到有人提到了一个爱沙尼亚电子公民的电子居民卡,看起来挺有意思的,之前就看到过 [[帕劳数字居民身份证]],去检索了一下发现帕劳已经涨价到了 248 欧元,爱沙尼亚电子公民感觉上类似,所以就简单的记录一下。
  • DNS 泄漏以及如何防止 什么是 DNS 泄漏
  • 从内地到香港出金最佳的方法 银行汇款