TL;DR
Clickhouse 迁移数据后,很容易出现权限问题导致无法启动,运行以下命令后重启即可解决。
chown -R clickhouse /var/lib/clickhouse /var/log/clickhouse-server /etc/clickhouse-server /etc/clickhouse-client
Clickhouse 迁移数据后,很容易出现权限问题导致无法启动,运行以下命令后重启即可解决。
chown -R clickhouse /var/lib/clickhouse /var/log/clickhouse-server /etc/clickhouse-server /etc/clickhouse-client
本文第一章节主要内容转载自:linux cpu 运行模式
CPU动态节能技术用于降低服务器功耗,通过选择系统空闲状态不同的电源管理策略,可以实现不同程度降低服务器功耗,更低的功耗策略意味着CPU唤醒更慢对性能 影响更大。
对于对时延和性能要求高的应用,建议关闭CPU的动态调节功能,禁止 CPU休眠,并把CPU频率固定到最高。
通常建议在服务器BIOS中修改电源管理为Performance,如果发现CPU模式为conservative或者powersave,可以使用cpupower设置CPU Performance模式,效果也是相当显著的。
几种模式如下:
performance: 顾名思义只注重效率,将CPU频率固定工作在其支持的最高运行频率上,而不动态调节。userspace:最早的cpufreq子系统通过userspace governor为用户提供了这种灵活性。系统将变频策略的决策权交给了用户态应用程序,并提供了相应的接口供用户态应用程序调节CPU 运行频率使用。也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置powersave: 将CPU频率设置为最低的所谓“省电”模式,CPU会固定工作在其支持的最低运行频率上。因此这两种governors 都属于静态governor,即在使用它们时CPU 的运行频率不会根据系统运行时负载的变化动态作出调整。这两种governors 对应的是两种极端的应用场景,使用performance governor 是对系统高性能的最大追求,而使用powersave governor 则是对系统低功耗的最大追求。ondemand: 按需快速动态调整CPU频率, 一有cpu计算量的任务,就会立即达到最大频率运行,等执行完毕就立即回到最低频率;ondemand:userspace是内核态的检测,用户态调整,效率低。而ondemand正是人们长期以来希望看到的一个完全在内核态下工作并且能够以更加细粒度的时间间隔对系统负载情况进行采样分析的governor。 在 ondemand governor 监测到系统负载超过 up_threshold 所设定的百分比时,说明用户当前需要 CPU 提供更强大的处理能力,因此 ondemand governor 会将CPU设置在最高频率上运行。但是当 ondemand governor 监测到系统负载下降,可以降低 CPU 的运行频率时,到底应该降低到哪个频率呢? ondemand governor 的最初实现是在可选的频率范围内调低至下一个可用频率,例如 CPU 支持三个可选频率,分别为 1.67GHz、1.33GHz 和 1GHz ,如果 CPU 运行在 1.67GHz 时 ondemand governor 发现可以降低运行频率,那么 1.33GHz 将被选作降频的目标频率。conservative: 与ondemand不同,平滑地调整CPU频率,频率的升降是渐变式的,会自动在频率上下限调整,和ondemand的区别在于它会按需分配频率,而不是一味追求最高频率;
查看当前的模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
查看所有逻辑CPU
watch -n -1 "cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor"
查看所有逻辑CPU当前运行的频率
watch -n -1 "cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq"
查看频率信息
cpupower frequency-info
调整频率
cpupower frequency-set -g performance
上文给出的内容可能部分已经过时,下面给一个在我的 ArchLinux + Asus Zenbook UX3450x 上的实际运行结果,并附上 Claude 给出的分析报告:
$ sudo cpupower monitor
[sudo] songtianlun 的密码:
intel-rapl/intel-rapl:0
0
intel-rapl/intel-rapl:0/intel-rapl:0:0
0
intel-rapl/intel-rapl:0/intel-rapl:0:1
0
| Nehalem || Mperf || RAPL || Idle_Stats
CPU| C3 | C6 | PC3 | PC6 || C0 | Cx | Freq || pack | core | unco || POLL | C1E | C6 | C10
12| 0.00| 47.66| 0.00| 0.00|| 7.20| 92.80| 2194||23628906|15290855|1354305|| 0.07| 7.80| 9.83| 75.30
13| 0.00| 0.00| 0.00| 0.00|| 33.04| 66.96| 2775||23628906|15290855|1354305|| 0.01| 14.97| 52.19| 0.00
14| 0.00| 33.27| 0.00| 0.00|| 5.01| 94.99| 2344||23628906|15290855|1354305|| 0.01| 8.17| 34.95| 52.03
15| 0.00| 47.03| 0.00| 0.00|| 4.06| 95.94| 2371||23628906|15290855|1354305|| 0.00| 5.45| 24.07| 66.59
16| 0.00| 16.66| 0.00| 0.00|| 4.80| 95.20| 2046||23628906|15290855|1354305|| 0.00| 11.45| 41.66| 42.28
17| 0.00| 52.60| 0.00| 0.00|| 3.45| 96.55| 1971||23628906|15290855|1354305|| 0.01| 6.34| 8.76| 81.57
18| 0.00| 0.00| 0.00| 0.00|| 7.24| 92.76| 2042||23628906|15290855|1354305|| 0.01| 14.95| 78.06| 0.00
19| 0.00| 1.14| 0.00| 0.00|| 5.56| 94.44| 2274||23628906|15290855|1354305|| 0.00| 9.09| 70.10| 15.47
1| 0.00| 1.03| 0.00| 0.00|| 23.08| 76.92| 3295||23628906|15290855|1354305|| 0.02| 18.70| 8.31| 50.08
2| 0.00| 1.03| 0.00| 0.00|| 2.40| 97.60| 3081||23628906|15290855|1354305|| 0.01| 0.21| 2.09| 95.32
3| 0.00| 1.65| 0.00| 0.00|| 32.88| 67.12| 3675||23628906|15290855|1354305|| 0.02| 17.54| 8.86| 40.85
4| 0.00| 1.65| 0.00| 0.00|| 4.20| 95.80| 2809||23628906|15290855|1354305|| 0.00| 11.68| 1.47| 82.74
0| 0.00| 0.00| 0.00| 0.00|| 7.20| 92.80| 2894||23628906|15290855|1354305|| 0.01| 5.83| 13.04| 74.08
5| 0.00| 0.00| 0.00| 0.00|| 20.27| 79.73| 3067||23628906|15290855|1354305|| 0.05| 22.37| 21.72| 35.85
6| 0.00| 0.09| 0.00| 0.00|| 19.44| 80.56| 2724||23628906|15290855|1354305|| 0.01| 21.37| 30.71| 28.68
7| 0.00| 0.09| 0.00| 0.00|| 4.29| 95.71| 2592||23628906|15290855|1354305|| 0.01| 0.76| 0.95| 94.03
8| 0.00| 0.18| 0.00| 0.00|| 15.50| 84.50| 2535||23628906|15290855|1354305|| 0.02| 11.31| 22.62| 50.75
9| 0.00| 0.18| 0.00| 0.00|| 1.68| 98.32| 2181||23628906|15290855|1354305|| 0.00| 0.46| 5.16| 92.74
10| 0.00| 1.09| 0.00| 0.00|| 20.15| 79.85| 2530||23628906|15290855|1354305|| 0.02| 16.76| 9.28| 54.03
11| 0.00| 1.09| 0.00| 0.00|| 0.03| 99.97| 2482||23628906|15290855|1354305|| 0.00| 0.04| 0.00| 99.92
20| 0.00| 0.02| 0.00| 0.00|| 1.53| 98.47| 956||23628906|15290855|1354305|| 0.00| 0.20| 0.48| 97.99
21| 0.00| 99.51| 0.00| 0.00|| 0.11| 99.89| 589||23628906|15290855|1354305|| 0.00| 0.05| 0.10| 99.74
该报告基于 cpupower monitor 命令的输出,显示了系统 CPU 的电源管理和性能状态。数据显示一个拥有多核 CPU(22个核心,编号从0到21)的系统,监控了 C-states(CPU 电源状态)、性能指标、功耗数据和空闲统计信息。
CPU 活跃度(C0 状态)从高到低排序的前五名:
大多数核心在多种空闲状态之间分布:
核心 21 处于 C6 状态的时间高达 99.51%,表明这个核心几乎完全处于深度睡眠状态。
RAPL(运行平均功率限制)数据显示:
频率最高的核心:
频率最低的核心:
这个系统显示典型的现代处理器电源管理行为,大部分核心大多数时间处于低功耗状态。系统工作负载主要集中在少数几个核心上(如核心 3、13),而其他核心则保持在各种节能状态。这种行为对于优化功耗和热量管理非常有利,特别是在轻负载情况下。
核心 21 的极低频率(589MHz)和极高的 C6 占用率(99.51%)可能表明该核心被操作系统识别为效率较低的核心,因此优先使用其他核心进行任务分配,或者系统正在积极管理功耗限制。
以下组合若没有特殊说明,基本都是键位组合。
ctr-d:向后翻半页ctr-u:向前翻半页ctr+f:向后翻整页ctr+b:向前翻整页g+g:1shift+:1shift+g:$shift+:$需要一个正常的可工作仓库,而不是裸镜像仓库。以下是在不使用 --mirror 选项的情况下,拉取所有分支和标签并推送到新仓库的步骤:
首先,正常克隆源仓库:
# 克隆源仓库(默认只会检出 main 或 master 分支)
git clone <源仓库URL> repo-copy
cd repo-copy
默认情况下,git clone 只会创建和检出默认分支。你需要额外步骤来获取和创建所有远程分支的本地跟踪:
# 获取所有远程分支的信息
git fetch --all
# 为每个远程分支创建本地跟踪分支
git branch -r | grep -v '\->' | while read remote; do
git branch --track "${remote#origin/}" "$remote"
done
# 拉取所有分支的最新更改
git fetch --all
git pull --all
确保所有标签也被获取:
# 拉取所有标签
git fetch --tags
# 添加目标远程仓库
git remote add target <目标仓库URL>
# 推送所有分支到目标仓库
git push target --all
# 推送所有标签到目标仓库
git push target --tags
下面是一个完整的脚本,可以一键完成整个过程:
# 克隆源仓库
git clone <源仓库URL> repo-copy
cd repo-copy
# 获取所有远程分支信息
git fetch --all
# 为远程分支创建本地跟踪分支
git branch -r | grep -v '\->' | while read remote; do
git branch --track "${remote#origin/}" "$remote"
done
# 拉取所有分支和标签的最新更改
git fetch --all
git pull --all
git fetch --tags
# 添加目标远程仓库
git remote add target <目标仓库URL>
# 推送所有内容到目标仓库
git push target --all
git push target --tags
echo "所有分支和标签已成功推送到目标仓库"
在较新版本的 Git 中,你可以使用以下简化命令:
# 克隆仓库
git clone <源仓库URL> repo-copy
cd repo-copy
# 获取所有分支并设置本地跟踪
git fetch origin
git checkout -b local_branch origin/remote_branch # 对需要的每个远程分支重复此命令
# 获取所有标签
git fetch --tags
# 添加新远程仓库并推送
git remote add target <目标仓库URL>
git push target --all
git push target --tags
rack-mini-profiler 和 bullet 是ruby 开发中两个广受欢迎的性能分析工具。
Bullet 更加实用,提得建议更加直接有效,rack-mini-profiler 信息丰富,需要更细致的排查时使用。
rack-mini-profilerrack-mini-profiler 是一个轻量级的性能分析工具,它能够实时显示页面加载时间和数据库查询详情。在页面右上角显示一个小窗口,展示了页面加载的总时间,并可以展开查看详细的性能数据。它的主要特点包括:
使用 rack-mini-profiler 只需要在 Gemfile 中添加 gem 'rack-mini-profiler',并重启服务器即可生效。默认情况下它会在开发环境中自动启用。
BulletBullet 则专注于解决 N+1 查询问题和检测未使用的预加载。N+1 查询是 Rails 应用中常见的性能问题,当获取关联数据时可能导致过多的数据库查询。Bullet 通过以下方式帮助开发者:
要使用 Bullet,需要在 Gemfile 中添加 gem 'bullet',并在 config/environments/development.rb 中进行配置:
config.after_initialize do
Bullet.enable = true
Bullet.alert = true
Bullet.rails_logger = true
end
这两个工具的结合使用能够帮助开发者全面了解应用的性能状况,及时发现和解决性能问题。rack-mini-profiler 提供了整体性能的详细视图,而 Bullet 则专注于数据库查询优化,它们互相补充,是 Rails 开发中不可或缺的性能优化工具。
以 JSON、MYSQL、PSQL、SQLITE、XML、YAML 和 CSV 格式提供城市、州、国家/地区的完整数据库。所有国家、州和城市都覆盖并填充了不同的组合和版本。
link: https://github.com/dr5hn/countries-states-cities-database
主要命令
rake db:migrate
rake db:rollback
rake db:migrate:up
rake db:migrate:down
rake db:migrate:redo
指定版本号的回滚
rake db:migrate:down VERSION=20141119130134
回滚最近几个迁移
rake db:rollback STEP=n
n 代表个数。注意:是最近几个,它们会被一起移除。
其它类似命令:
只执行指定版本号的迁移
rake db:migrate VERSION=20141119130134
只执行最近几次迁移
rake db:migrate STEP=n
回滚、然后重新执行最近几次迁移
rake db:migrate:redo STEP=n
来源:Rake 简介与编写
Rake 用法简介
Rake 的意思是 Ruby Make,一个用 ruby 开发的代码构建工具。
1.以任务的方式创建和运行脚本 当然,你可以用脚本来创建每一个你希望自动运行的任务。但是,对于大型的应用来说,你几乎总是需要为数据库迁移 (比如 Rails 中 db:migrate 任务)、清空缓存、或者代码维护等等编写脚本。对于每一项任务,你可能都需要写若干脚本,这会让你的管理变得复杂。那么,把它们用任务的方式整理到一起,会让管理变得轻松很多。
2.追踪和管理任务之间的依赖 Rake 还提供了轻松管理任务之间依赖的方式。比如,”migrate”任务和”schema:dump”任务都依赖于 “connect_to_database”任务,那么在”migrate”任务调用之前,”connect_to_database”任务都会被执行。
首先 rake 文件的后缀是.rake,存放在 lib/tasks 文件夹下。 可以通过 rake –tasks 来查看当前程序下所已存在的 rake 脚本。 看下面这个例子:
desc "study rake about rails" #desc 是Rake定义的方法,表示对下面定义任务的描述.这个描述会在使用Rake --tasks(或者Rake -T)命令时输出在屏幕上.
task :study_rake do #cmd 命令行中执行 rake study_rake 开始执行脚本,task是Rake最重要的方法.它的方法定义是:task(args, &block).任务体是一个block。
%w(a b c).each do |d|
puts d #编写你所需的功能代码。
end
end
这就是创建了一个 rake 脚本,这个脚本的作用是循环遍历 [“a”, “b”, “c”] 这个数组。
依赖关系
desc "rake1"
task :rake1 do
puts "rake1"
end
desc "rake2"
task ::rake2=> :rake1 do
puts "rake2"
end
输出结果:
rake1
rake2
命名空间
namespace :today do
desc "rake1"
task :rake1 do
puts "rake1"
end
end
那执行命令就是:rake today:rake1
在一个任务中调用另外一个任务
desc "today rake"
task :today do
Rake::Task["rakes:rake1"].invoke
Rake::Task["rakes:rake2"].invoke
Rake::Task["rakes:rake3"].invoke
end
namespace :rakes do
desc "rake1"
task :rake1 do
puts "rake1"
end
desc "rake2"
task :rake2 do
puts "rake2"
end
desc "rake3"
task :rake3 do
puts "rake3"
end
end
默认任务
task :default => [:today]
Rails 预定义了大量的 Rake 任务,在 Rails 应用的开发过程中,你想必已经在大量使用它们了。在 Rails 中,所有的 Rake 任务都放在 rails 目录的 lib/tasks 目录下 (在作者的环境下是 C:\Ruby\lib\ruby\gems\1.8\gems\rails-2.3.5 \lib\tasks),所有的 rake 任务都以.rake 作为后缀名,这些以.rake 结尾的文件会被自动加载到你的环境中。你可以到一个已有的 Rails 工程根目录下键入 rake –tasks,可以看到很多的 rake 任务已经为你整装待发了。
E. 参考资料 http://blog.sina.com.cn/s/blog_4748c4d20100y9iu.html
来源: 如何调试 Vim 脚本
使用 -D 参数可以开启 Debug 模式, 在 Debug 模式中可以使用 cont, next, interrupt, step, quit 等调试命令, 以及 breakadd, breakdel 来添加和移除断点。 使用 -u 来禁止加载任何配置文件,使用 :source 命令逐个加载。 使用 :set verbose 和 :set verbosefile 等 配置变量 可以设置日志级别和输出文件, -V 启动参数也可以起到同样的作用。
在介绍 Debug 之前有必要先介绍如何查看运行日志,本文只介绍到日志级别的设置方法和日志文件的设置方法。 日志级别是由 verbose 配置变量 控制的。这是一个默认为零的数字,级别越高输出越详细。 verbose 非零时 Vim 就会在当前窗口显示日志信息,例如 :set verbose=20 就可以开启几乎所有日志。 这些级别的描述如下:
>= 1 读写 viminfo 文件时
>= 2 当 ":source" 一个文件时,通常是载入一个配置文件
>= 5 所有搜索到的 tag 文件和 include 文件
>= 8 执行到 autocommands 的文件
>= 9 每次执行到 autocommand 时
>= 12 每次执行到 function 时
>= 13 产生、捕获、结束处理、忽略一个异常时
>= 14 ":finally" 语句中等待的所有命令
>= 15 每一个执行到的 Ex 命令(截断到 200 字符)
更多 verbose 选项变量的信息可以参考 :help vbs。 日志级别也可以通过 -V 启动参数来设置。例如:
vim -V20 main.cpp
如果你试过上述日志级别的设置方式会发现日志直接输出在当前屏幕,这会影响在当前 Vim 中的连贯操作。 我们可以通过 :set verbosefile 把日志输出到文件中。例如把它输出到 vim.log 文件:
set verbosefile=vim.log
然后在另一个 Shell 中 tail 这个文件,我们就可以一边使用 Vim 一边查看它的日志了:
tail -f vim.log
更多 verbosefile 选项变量的信息可以参考 :help verbosefile。 日志文件也可以通过 -V 启动参数来设置。例如设置级别为 20,输出文件名为 vim.log:
vim -V20vim.log main.cpp
注意级别与文件名之间不能加空格,且文件名不得以数字开头(否则会被识别为级别的一部分)。
有时为了定位问题,我们可以禁止 Vim 自动加载配置文件和插件,手动地逐个加载 Vim 脚本。 需要先零配置启动 Vim,通常设置 -u 即可:
vim -u NONE main.cpp
如果你在使用 GVim 可能需要使用 -U,具体情况可参考 :help -U 或 StackOverflow。 启动后使用 :source {filename} 命令来逐个加载 Vim 配置即可。
在启动 Vim 时添加 -D 参数即可开启调试模式,Vim 会在第一行配置文件出中断并进入 Debug 模式:
vim -D main.cpp
中断后会进入 Debug 模式,你可以看到 > 提示符。此时你就可以输入 Debug 命令,操作方式和 gdb 非常类似:
掌握 Debug 命令后下一个事情就是打断点,可以在函数和文件的相应行号处添加断点:
breakadd func [lineNumber] functionName
breakadd file [lineNumber] fileName
breakadd here
同样的语法可以用来移除断点,关键字从 breakadd 换为 breakdel:
breakdel func [lineNumber] functionName
breakdel file [lineNumber] fileName
breakdel here
还可以按照编号移除 breakdel {number} 和移除全部 breakdel *。 更详细的参数和命令可以参考 :help debug。
上述日志和调试命令已经足够定位 Vim 脚本的问题了。 下面介绍几个小技巧可以方便一些场景下的操作:
像 Chrome 控制台一样,可以 Debug 某个命令:
:debug CommandName
也可以直接 debug 某个函数,不需要 Vim 先进入 Debug 模式:
:debug call Foo()
类似地,日志级别也可以在调用函数时进行设置:
:20verbose call Foo()
必需:将 env
DERP_DOMAIN设置为您的域docker run -e DERP_DOMAIN=derper.your-domain.com -p 80:80 -p 443:443 -p 3478:3478/udp fredliang/derper也有其他不使用域名的方法,参考文献自行探索