PostgreSQL 初识

要介绍 PostgreSQL 通过几个关键词就可以,开源,对象关系型数据库。本文主要是学习过程中的一些笔记,都是基础内容,大部分都是看得基础入门书籍和官方的文档内容,老手请直接跳过。

History

PostgreSQL 发展历程可以追溯到 1986 年,加州伯克利分校开发了一个名叫 Postgres 的关系型数据库服务器,这份代码被 Illustra 公司发展成为了一个商业化产品。到 1994 年, Andrew Yu 和 Jolly Chen 向 Postgres 中增加了 SQL 语言解释器 —- Postgres95,随后公布了其源码,成为一个开放源码数据库。

到 1996 年,Postgres95 被改名 PostgreSQL,支持查询语言标准,同时版本号从 6.0 开始迭代。

2011 年 9 月 12 日,PostgreSQL 9.1 发布,提供了强大的更新,同步复制,最近相邻索引,外部数据封装等功能。

这张图 充分的可以说明 PostgreSQL 的发展及流行程度。

Installation

在 Linux Mint 19,或者其他 Debian/Ubuntu 系列上安装:

sudo apt install postgresql postgresql-contrib

PostgreSQL 安装之后会在系统上新增一个 postgres 用户,通过该用户来运行服务。

检查版本

sudo -u postgres psql -c "SELECT version();"

会输出 PostgreSQL 的版本

PostgreSQL 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0, 64-bit

PostgreSQL 默认端口是 5432,可以通过 sudo netstat -tupln 来查看服务是否启动。

PostgreSQL 默认用户名是 postgres,默认数据库也是 postgres,没有默认密码。

Configuration

PostgreSQL 的配置文件在 /etc/postgresql/10/main/postgresql.conf

允许远程访问 PostgreSQL 服务

打开配置文件 sudo vi /etc/postgresql/10/main/postgresql.conf , 然后找到如下一行,并配置

listen_addresses = '*'

然后重启服务

sudo systemctl restart postgresql

检查服务启动

ss -nlt | grep 5432

然后修改 sudo vi /etc/postgresql/10/main/pg_hba.conf 文件

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# The user test_user will be able access all databases from all locations using a md5 password
host    all             test_user            0.0.0.0/0                md5

# The user test_user will be able access only the test_db from all locations using a md5 password
host    test_db          test_user            0.0.0.0/0                md5

# The user test_user will be able access all databases from a trusted location (192.168.43.106) without a password
host    all             test_user            192.168.1.134            trust

登录和管理服务器

管理 PostgreSQL 可以通过命令行,也可以通过 GUI 工具,市场上现在 GUI 工具已经非常成熟,有开源方案,也有商业方案。这里就介绍一下 pgAdmin,其他工具可以自行了解。

GUI 管理工具 pgAdmin

详情见官网: https://www.pgadmin.org/download/

安装方式也都特别简单,略过。

命令行方式

PostgreSQL 只能在 postgres 用户下管理,所以可以切换到该用户操作

sudo su - postgres

然后使用 psql 命令登录 PostgreSQL 控制台

psql

此时相当于用 postgres 用户以同名身份登录了数据库,默认没有密码,系统提示符会变成 postgres=#.

为用户设置密码 \password .

\password postgres

然后输入密码。

创建其他用户,并为这些用户设定密码

CREATE USER your_username WITH PASSWORD 'your_password';

创建用户数据库

CREATE DATABASE sample_db OWNER your_username;

赋予用户所有权限,读写操作

GRANT ALL PRIVILEGES ON DATABASE sample_db to your_username;

退出控制台

\q

如果不想在控制台也可以直接从 shell 中设定

sudo -u postgres createuser --superuser your_username
sudo -u postgres psql
\password your_username
\q
sudo -u postgres createdb -O your_username sample_db



/usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l logfile start

在 PostgreSQL 中,超级用户角色连接到数据库允许绕过所有数据库权限检查,登录权限除外。因此不要轻易使用超级用户权限,PostgreSQL 文档建议将大多数数据库作为非超级用户角色管理。

Usage

登录数据库

上面演示了如何创建用户及数据库,那么在 shell 中可以以如下方式来登录数据库

psql -U your_username -d sample_db -h 127.0.0.1 -p 5432

然后输入 your_username 的密码即可登录控制台。注意这里的 -d 参数是必须的。

修改数据库

对数据库的基本操作,和 MySQL 类似,只要懂得 SQL 基本就可以略过下面大部分的内容。

创建

CREATE DATABASE sample_db;
CREATE DATABASE sample_db OWNER username;

修改数据库

ALTER DATABASE sample_db RENAME TO new_sample_db;
ALTER DATABASE new_sample_db OWNER TO postgres;
ALTER DATABASE new_sample_db WITH CONNECTION LIMIT = 10;

删除数据库

DROP DATABASE sample_db[, ...n];

表相关操作

大部分都是 SQL 相关的内容,这里就做过引子,具体还是去学习 SQL

创建表

create table tb_demo1 (
	id int PRIMARY KEY,
	name varchar(25),
	age int,
	salary float
);

create table tb_demo2 (
	id int,
	name varchar(25) NOT NULL,
	age int,
	salary float,
	PRIMARY KEY(id, name)
);

CREATE TABLE dep (
	id INT,
	name VARCHAR(25)
)

创建外键关联,在表 demo5 中添加外键约束 fk_dep 将表 depId 列关联到 dep 表 id。

CREATE TABLE demo5 (
	id INT PRIMARY KEY,
	name VARCHAR(25) NOT NULL,
	age int,
	depId INT,
	CONSTRAINT fk_dep FOREIGN KEY(depId) REFERENCES dep(id)
)

修改表结构

ALTER TABLE old_table_name RENAME TO new_table_name;
ALTER TABLE table_name ALTER COLUMN column_name TYPE VARCHAR(30);
ALTER TABLE table_name RENAME old_column_name TO new_column_name new_type;
ALTER TABLE table_name ADD COLUMN new_column new_type;
ALTER TABLE table_name ADD COLUMN new_column new_type NOT NULL;
ALTER TABLE table_name DROP column_name;
ALTER TABLE table_name DROP CONSTRAINT constraint_name;

删除表

DROP TABLE [IF EXISTS] table1, table2 ...;

恢复外部数据

psql -U your_username -d sample_db -h 127.0.0.1 -p 5432 < backup_external.sql

其他控制台命令

\h            	explain sql, such as \h select
\?				help
\l 				list all db
\c [database_name] 		connect to db
\d 				list all tables of current db
\d [table_name] 	show table structure, like describe table in mysql
\du 			list all user
\e 				open text editor
\conninfo 		print database and connection infomation

数据类型

整数类型

类型 字节数 说明  取值范围
SMALLINT 2 字节   小整数 -32768 ~ 32767
INT 4 字节   整数 -2147483648 ~ 2147483647
BIGINT 8 字节   大整数 -92233720368547758089 ~ 9223372036854774807

浮点数

类型 字节数 说明  取值范围
REAL 4 6 位十进制数字精度   1E-37 ~ 1E+37
DOUBLE PRECISION 8 15 位十进制数字精度  1E-307 ~ 1E+308

PostgreSQL 支持 SQL 标准表示,float 和 float(p) 声明非精确的数值类型。p 声明以二进制表示的最低可接受精度。

  • REAL - float(1) 到 float(24)
  • DOUBLE PRECISION - float(25) 到 float(35)

范围之外的 p 值将导致错误,没有声明精度的 float 将被当作 DOUBLE PRECISION。

任意精度类型

NUMERIC 表示数值是任意精度,使用 NUMERIC(M, N) 表示,M 称为精度,总位数,N 表示标度,表示小数的位数。比如 123.456 ,精度是 6, 标度是 3

超出精度则四舍五入处理。

日期与时间

TIME, DATE, TIMESTAMP 和 INTERVAl,每一个类型都有合法取值范围,当不合法时会以零值插入到数据库。

类型 字节数 说明  取值范围
TIME 8 字节 一天内时间 00:00:00 - 24:00:00 插入 HHMMSS 字符串会自动转成时间 HH:MM:SS
DATE 4 字节 日期 YYYY-MM-DD
TIMESTAMP 8 字节 日期和时间 YYYY-MM-DD HH:MM:SS

字符串类型

字符串类型

类型 字节数 说明  取值范围
CHAR(n)/CHARACTER(n)   固定长度非二进制,不足补空白 由 n 决定
VARCHAR(n)/CHARACTER VARYING(n)   变长非二进制,有长度限制 n 决定
TEXT   变长非二进制,无长度限制 由字符串决定

二进制类型

PostgreSQL 提供 BYTEA 类型,用来存储二进制字符串,BYTEA 类型存储空间位 4 字节加上实际的二进制字符串。

CREATE TABLE tmp ( b BYTEA );
INSERT INTO tmp VALUES (E'\\000');
SELECT * from tmp;

布尔类型

PostgreSQL 提供 BOOLEAN 布尔类型,用一个字节来存储,有 TRUE,FALSE 两个值。

其他有效文本,可以代替 TRUE 或者 False。比如 ‘t’, ‘true’, ‘y’, ‘yes’, ‘1’, 或者 ‘f’, ‘false’, ‘n’, ‘no’, ‘0’

数组类型

PostgreSQL 允许将字段定义成变长或者变长的一维或者多维数组,数组类型可以是基本类型或者是用户定义类型。

声明数组

numbs INT[],
zz TEXT[4][4]

对于一维数组也可以

arr_column INT ARRAY[5]

插入数组

CREATE TABLE tmp (bt int[]);
INSERT INTO tmp VALUES('\{\{1,1,1\}, \{2,2,2\}, \{3,3,3\}\}');
SELECT * FROM tmp;

除开这些基础类型,PostgreSQL 还支持非常多的复杂类型,比如 json, xml 等等,具体可以参考官网 , 这些复杂类型的使用可以单开一篇文章来讲了,初识篇就到此。

reference


2019-08-25 postgresql , sql , mysql , db , database

制作 Rime 词库

之前就写过文章介绍这款跨平台的开源输入解决方案 Rime,所有的配置以及同步方法都在之前的文章中有介绍。这篇文章主要介绍如何制作 Rime 的扩展词库。虽然目前网上也有一些非常不错的词库,但是很多内容还是需要自己慢慢培养的。

词库转换工具

从 2.4 版本起支持加密的搜狗词库了,直接导出搜狗词库,然后转成 Rime 的格式即可。

繁简转换

安装 opencc 繁简转换工具

sudo apt install opencc

然后运行装换

opencc -i source.txt -o dest.txt

luna_pinyin.mywords.dict.yaml

---
name: luna_pinyin.mywords
version: "0.0.1"
use_preset_vocabulary: true

然后找到 luna_pinyin.extended.dict.yaml,打开文件导入新的词库

import_tables:
  - luna_pinyin.mywords
-
- ## Rime 导入词库

rime_dict_manager

Rime 导出词库


2019-08-24 rime , Rime , 词库 , 小狼毫 , 中州韵

Linux Mint 19 自定义登录界面

Linux Mint 19 不支持 MDM 显示管理器,您需要安装 LightDM

检查当前显示管理

cat /etc/X11/default-display-manager

如果输出 mdm 则需要更换

sudo apt install lightdm lightdm-settings slick-greeter
sudo dpkg-reconfigure lightdm

这里的 mdm 和 lightdm 值得都是 Linux Login manager,或者也被叫做 Linux Display Manager。更多的选择可以看这里

配置

显示配置

/usr/sbin/lightdm --show-config

修改背景图片

Linux Mint 下系统自带壁纸在

/usr/share/backgrounds/

更多的配置参考: https://wiki.debian.org/LightDM

更多主题

  • https://www.gnome-look.org/search/projectSearchText/login

2019-08-24 linux , mint , linux-mint , lightdm , mdm , login-manager

apt update 相关内容记录

我们都知道 Ubuntu 系列的软件仓库可以通过 /etc/apt/sources.list 以及 /etc/apt/sources.list.d/*.list 来配置。

sources.list 格式

sources.list 的格式大部分情况下都是

deb http://site.example.com/debian distribution component1 component2 component3
deb-src http://site.example.com/debian distribution component1 component2 component3

这几部分可以划分为这几类:

  • 包类型 deb , deb-src
  • 仓库地址
  • 发行版
  • 软件包分类

deb 和 deb-src 区别

  • deb 表示二进制内容,会使用仓库中的二进制预编译软件包,可以直接通过 apt 来安装
  • deb-src 表示源代码,在使用 apt 时会根据源代码来进行安装,通常可以使用 apt source $pacakge 来下载然后编译

仓库地址

在配置中的 url 一般为仓库的地址,世界各地会有不同的镜像,选择一个比较快的镜像即可。

发行版

不同版本的系统有着不同的代号,比如 Ubuntu

  • Xenial 16.04
  • Bionic 18.04

软件包分类

跟在发行版之后的就是软件包的具体分类了,可以有一个或多个

Debian

  • main 包含符合 DFSG 指导原则的自由软件包,而且这些软件包不依赖不符合该指导原则的软件包。这些软件包被视为 Debian 发型版的一部分
  • contrib 包含符合 DFSG 指导原则的自由软件包,不过这些软件包依赖不在 main 分类中的软件包
  • non-free 包含不符合 DFSG 指导原则的非自由软件包

Ubuntu

  • main 官方支持的自由软件
  • restricted 官方支持的非完全自由的软件
  • universe 社区维护的自由软件
  • multiverse 非自由软件

apt update 时最前面标识含义

在运行 apt update 时会发现在输出的没一行前面会有 GET, HIT 等等字符的出现,这几个字符有着其自身的含义:

  • GET 表示在该源中有更新,并且新的内容已经被保存
  • HIT 表示已经在该源中有最新的包
  • IGN 表示包被忽略,要不然是没有更新,要不然就是该包已经被废弃,如果开发者改变了版本或者更换了仓库密钥也会这样

2019-08-22 apt , ubuntu , linux , package-management

Linux 下的输入法 fcitx vs ibus

无论在那个系统下,输入法几乎是必备的软件,在 Linux 下有两大主要的输入法支持框架 fcitx 和 IBus,当然有些还有 XIM ,scim 等等。Linux 下本来没有多少用起来非常舒服的中文输入法,有出名很久的 rime, 也有搜狗开发的输入法,不过也是不久之前的事情。

但是稍微注意一下就是知道 搜狗使用的是 fcitx, 而 rime 声称二者都支持,但是 fcitx-rime 已经很久没有更新,主要的更新还在 IBus 那边。那这就需要一个抉择,因为 Linux 下无法将二者并存。

fcitx

fcitx 是 Free Chinese Input Toy for X 的简称。

源代码托管在 Gitlab

在 Debian/Ubuntu 下可以使用

apt install fcitx
apt install fcitx-pinyin    # 汉语拼音方案
apt install fcitx-googlepinyin
apt install fcitx-hangul    # 韩语
apt install fcitx-rime      # 小狼毫

配置文件内容在

  • /usr/share/fcitx/data/
  • ~/.config/fcitx/

在看 fcitx 的一些历史 不经唏嘘,如今 2019 年已经过去 12 年 fcitx 依然健在,而那些说 fcitx 不好的人却不知道在哪里。

主题

一个非常漂亮的 fcitx 主题

IBus

IBus 是 Intelligent Input Bus 的简称。

IBus 下也有 rime

sudo apt install ibus-rime

切换输入法

切换输入法可以使用如下命令:

im-config -s fcitx

如果要查看当前可用的输入法可以使用 im-config -l ,更多查看 man im-config

或者在界面搜索 input method

Rime

OS X 下的配置管理工具

reference


2019-08-21 linux , fcitx , ibus , input-method , rime

Ubuntu 从 16.04 升级 18.04

经常看到的 Ubuntu 16.04 或者 18.04 都是 Ubuntu 长期支持版本

A Long Term Support release or LTS release, means that Ubuntu will support the version for five years.

如果要从 16.04 升级到 18.04 包括两个部分,一是将当前安装的程序及 lib 升级到 18.04 兼容的版本,另外一个就是将系统升级到 18.04.

sudo apt update && sudo apt upgrade
sudo apt autoremove
sudo apt dist-upgrade

运行 apt dist-upgrade 会升级所有 packeges 到想要升到的 Ubuntu 版本,而 sudo do-release-upgrade 会将 Ubuntu 升级到新版本。大部分情况下不需要手动触发 sudo apt dist-upgrade,因为在运行 sudo do-release-upgrade 会自动先运行 dist-upgrade 。预先将所有的应用程序都更新到最新版本避免兼容性问题。

最后进行升级 Do upgrade

sudo do-release-upgrade

要注意該命令无法回滚,做好相应的备份工作,或者知道如何处理失败。

Install Cinnamon

sudo add-apt-repository ppa:embrosyn/cinnamon
sudo apt update && sudo apt install cinnamon

Remove

sudo apt-get install ppa-purge
sudo ppa-purge ppa:embrosyn/cinnamon

升级到非 LTS

编辑 /etc/update-manager/release-upgrades 并设置

Prompt=normal

然后再运行 sudo do-release-upgrade


2019-08-19 ubuntu , linux

记一次 fail2ban 启动失败

前两天重启服务器之后发现 fail2ban 启动失败,出现如下错误:

/etc/init.d/fail2ban restart
[....] Restarting fail2ban (via systemctl): fail2ban.service
Job for fail2ban.service failed because the control process exited with error code. See "systemctl status fail2ban.service" and "journalctl -xe" for details.
 failed!

检查日志

journalctl -xe

查看具体错误

/usr/bin/fail2ban-client -v -v start

看到结果:

fail2ban.service: Failed with result 'start-limit-hit'.

具体错误一目了然。其实重要的就是 Debug 的内容。


2019-08-18 fail2ban , linux

Substratum Android 上的主题引擎

Substratum 是一款 Android 上的主题工具,能够不用 root 来达到系统级主题修改。并且在该工具下有一群爱好者和社区开发了无数的美观且实用的主题。Substratum 开始于以前非常流行的 CyanogenMod, Cyanogen 内置了该主题引擎,并使得修改主题异常简单。但是不幸的是,Cyanogen 没有继续下去, 但是 Substratum 死灰复燃。最初的时候 Substratum 还需要 Root 来使用,但是 Android Oreo 之后就可以不依赖于 Root 了。

Installation

如果想要正式版从 Play Store 下载:

如果要开发版可以在 Telegram channel 下载

Substratum Themes

Substratum 有非常多著名的主题,可以从 Play Store 搜索,或者到 xda 寻找

  • Swift Black
  • Flux White
  • Victory
  • VaLeRie youtube
  • Transparent

Conclusion

最后,Swift theme 看起来不错,1.99 刀还可以,果断购入。

reference


2019-08-10 theme , android , substratum , oneplus-7-pro , oneplus , android-pie

Flask Babel 使用

Flask babel 是 Flask 的语言扩展,允许非常简单的方式让 Flask 支持多语言。

Installation

pip install flask-babel

安装时会安装依赖

  • Babel, Python 国际化
  • pytz 时区
  • speaklater 辅助工具集

Configuration

在 python 文件中要使用多语言的文字时引入

from flask_babel import gettext

比如

gettext('author')

在 html 模板文件中

<pre>{\% trans \%\}Submit{\% endtrans \%\}</pre>

在项目目录中新建 babel.cfg

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_,webassets.ext.jinja2.AssetsExtension

然后生成模板文件

pybabel extract -F babel.cfg -o translations/messages.pot .

文件 messages.pot 就是翻译模板文件

然后生成中文翻译文件

pybabel init -i translations/messages.pot -d translations -l zh_Hans_CN

复杂的项目可以借助 GUI 工具 poedit

编辑后编译

pybabel compile -d translations

如果更新了项目文件,新增了需要翻译的字段,在生成 messages.pot 之后可以使用如下方法将更新合并到需要翻译的文件中

pybabel update -i translations/messages.pot -d translations

Flask Babel 和 Flask WTF 一起使用

如果直接定义时使用 gettext 可能无法使用 babel 的翻译,需要使用 lazy_gettext('').

class LoginForm(Form):
    username = TextField(gettext(u'Username'), validators=[validators.Required()])

Notice

translations 位置

translations 目录必须是跟你 Flask 的 app 应用对象在同一目录下,如果你的 app 对象是放在某个包里,那 translations 目录也必须放在那个包下。

如果使用自定义的目录那么,需要自己手动指定目录名字。

app.config['BABEL_TRANSLATION_DIRECTORIES'] = 'translation'

Other

可以使用 pybabel --list-locales 来查看本机语言编码。

reference


2019-08-03 flask , flask , flask-babel , translations , langauge

Android 内核中的 CPU 调频

CPU 调频模块主要分为三块:

  • CPUFreq 核心模块,核心模块主要是公共的 API 和逻辑
  • CPUFreq 驱动,处理和平台相关的逻辑,设置 CPU 频率和电压
  • CPUFreq governor,频率控制器,CPU 调频的策略,CPU 在什么负载,什么场景下使用多少频率

最后第三部分 governor 也是本文重点。传统的 CPU governor 选择,以 Performance 和 Powersave 举例,就是一个让 CPU 跑在最高频率,一个让 CPU 跑在最低频率,所有动作都在初始化时设置。

调频器策略

OnDemand, Conservative 或者 Interactive 内部都含有一个计时器,每隔一段时间就会去对 CPU 负载采样。这是一种基于负载采样的调频器策略。

而另外一种策略是,从内核调度器中直接取得 CPU 负载,这就是基于调度器的 governor。基于调度器的 CPU 调频策略会通过 PELT(per entity load tracking) 来统计各个任务的负载,映射到一个范围。内核中负载均衡通过这些统计值来平衡 CPU 之间的任务,基于调度器的 governor 就是通过把各个 CPU 负载映射到 CPU 频率来完成调频动作,负载越高,CPU 频率也越高。内核社区中有个方案:

  • ARM 和 Linaro 主导项目 cpufreq_sched
  • Intel 主导的 shedutil

CPU 调频器

OnDemand

OnDemand 是一个比较老的 linux kernel 中的调频器,当负载达到 CPU 阈值时,调频器会迅速将 CPU 调整到最高频率。由于这种偏向高频的特性,使得它有出色的流动性,但与其他调频器相比可能对电池寿命产生负面影响。OnDemand 在过去通常被制造商选用,因为它经过了充分测试并且很可靠,但已经过时,并且正在被 Google 的 interactive 控制器取代。

对于 OnDemand 会启用计时器,定时去计算 CPU 负载,当负载超过 80% 时,OnDemand 会将 CPU 频率调到最高。

OndemandX

基本上是拥有 暂停、唤醒配置的 OnDemand,没有在 OnDemand 上做更多的优化。

Performance

Performance 调频器将手机的 CPU 固定在最大频率。

Powersave

与 Performance 调频器相反,Powersave 调频器将 CPU 频率锁定在用户设置的最低频率。

Conservative

该调速器将手机偏置为尽可能频繁地选择尽可能低的时钟速率。换句话说,在 Conservative 调频器提高 CPU 时钟速度之前,必须在 CPU 上有更大且更持久的负载。根据开发人员实现此调频器的方式以及用户选择的最小时钟速度,Conservative 调频器可能会引入不稳定的性能。另一方面,它可以有利于电池寿命。

Conservative 调频器也经常被称为“slow OnDemand”。原始的、未经修改的 Conservative 是缓慢并且低效的。较新版本和修改版本 Conservative(来自某些内核)响应速度更快,并且几乎可以用于任何用途。

和 OnDemand 一样,会通过定时器来检测 CPU 负载,对 Conservative ,当负载较高时,会以 5% 步增调高频率,当负载低于一个值时,以 5% 步伐递减。

Userspace

这种调频器在移动设备中极为罕见,它允许用户执行的任何程序设置 CPU 的工作频率。此调频器在服务器或台式 PC 中更常见,其中应用程序(如电源配置文件应用程序)需要特权来设置 CPU 时钟速度。

Min Max

Min Max 调频器会根据负载选择最低或者最高的频率,而不会使用中间频率。

Interactive

Interactive 会平衡内核开发人员(或用户)设置的时钟速度。换句话说,如果应用程序需要调整到最大时钟速度(CPU 100%负载),用户可以在调频器开始降低 CPU 频率之前执行另一个任务。由于此计时器,Interactive 还可以更好地利用介于最小和最大 CPU 频率之间的中间时钟速度。它的响应速度明显高于 OnDemand,因为它在调整到最大频率时速度更快。

Interactive 还假设用户打开屏幕之后很快就会与其设备上的某个应用程序进行交互。 因此,打开屏幕会触发最大时钟速度的斜坡,然后是上述的定时器行为。

Interactive 是当今智能手机和平板电脑制造商的首选默认调频器。

InteractiveX

由内核开发人员“Imoseyon”创建,InteractiveX 调频器主要基于交互式调频器,增强了调整计时器参数,以更好地平衡电池与性能。但是,InteractiveX 调频器的定义功能是在屏幕关闭时将 CPU 频率锁定到用户最低定义的速度。

Smartass

基于 Interactive,表现和之前的 minmax 一致,smartass 相应更快。电池寿命很难精确量化,但它确实在较低频率下可以使用更长。

当睡眠时调整到 352Mhz ,Smartass 还会限制最大频率(或者如果您设置的最小频率高于 352,它将限制到您设定的最小频率)。

该调频器会在屏幕关闭时缓慢的降低频率,甚至它也可以让手机 CPU 频率降至一个让手机无法正常使用的值(如果最小频率没有设置好的话)。

SmartassV2

从 Erasmux 中而来的 Version 2 版本,该调频器的目标是“理想的频率”,并且更加积极地向这个频率增加,并且在此之后不那么激进。它在屏幕开启或者关闭时使用不同的频率,即 awake_ideal_freqsleep_ideal_freq。 当屏幕关闭时,此调频器非常快地降低 CPU(快速达到 sleep_ideal_freq )并在屏幕开启时快速向上调整到 awake_ideal_freq。 屏幕关闭时,频率没有上限(与 Smartass 不同)。因此,整个频率范围可供调频器在屏幕开启和屏幕关闭状态下使用。这个调频器的主打功能是性能和电池之间的平衡。

Scary

Scary 基于 Conservative 并增加了一些 smartass 的特征,它相应地适用于 Conservative 的规则。所以它将从底部开始,采取一个负载样本,如果它高于上限阈值,一次只增加一个梯度,并一次减少一个。 它会自动将屏幕外的速度限制为内核开发人员设置的速度,并且仍然会根据保守法律进行调整。 所以它大部分时间都花在较低的频率上。 这样做的目的是通过良好的性能获得最佳的电池寿命。

schedutil

schedutil 是最新版本 Linux 内核(4.7+)中的 EAS 调控器,旨在更好地与 Linux 内核调度程序集成。它使用内核的调度程序来接收 CPU 利用率信息并根据此输入做出决策。作为结果,schedutil 可以比依赖于定时器的 Interactive 等常规调控器更快,更准确地响应 CPU 负载。

更多的 governor 可以访问下方的 xda 链接。

reference


2019-08-02 android , kernel , cpu-governor

电子书

最近文章

  • Linux 下找出重复文件 rdfind - find duplicate files in linux 安装使用:
  • 使用 timeshift 来备份和还原系统 Linux Mint 自带的备份和还原工具就是 timeshift, 今天看到有人贡献 timeshift 的命令行版本,突然意识到这个工具其实还有命令行版本。
  • 复式记账 很早就听闻了复式记账这个名词,一直在我的 TODO 上没来得及消化,记得当时主要是看了 wzyboy 和 byvoid 二位的文章,我相信我关注的不同的人选择同样的方式来做一件事情,肯定是有意义的。所以当时我就将复式计帐和 Beancount 放到了我的 Trello 待办事项里面,这几天终于有时间来了解一下了。
  • Play Station 4 Pro Setup 记录一下 PS4 的设置。
  • 快充协议笔记 中文里面的快充,其实对应着很多个英文单次,Quick Charge, fast charge, dash charge, USB PD(USB Power Delivery), Dual charge, 这些许许多多的名词,在中文的语境中都被叫做快充其实是不太准确的。虽然都叫快充,但是其实各个设备厂商都有各自自己的实现,目前市场上比较常见的快充实现是 QC,PD。