我在虚拟机上安装了FreeBSD 10.2
,默认是不允许root
用户使用SSH
登录的。参照这篇文章,把/etc/ssh/sshd_config
文件的“#PermitRootLogin no
”改成“PermitRootLogin yes
”,然后重启ssh daemon
服务:
/etc/rc.d/sshd restart
就可以了。
我在虚拟机上安装了FreeBSD 10.2
,默认是不允许root
用户使用SSH
登录的。参照这篇文章,把/etc/ssh/sshd_config
文件的“#PermitRootLogin no
”改成“PermitRootLogin yes
”,然后重启ssh daemon
服务:
/etc/rc.d/sshd restart
就可以了。
本文摘自BENCHMARKING TRANSACTION DATABASES。
TPC-C benchmark
是Transaction Processing Council
制定测试数据库benchmark
标准,它是基于批发供应商(也称之为company
)的模型:
每个warehouse
拥有100000
个商品;
每个warehouse
供应10
个地区;
每个地区服务3000
个客户。
TPC-C benchmark
会增加warehouse
,而保持其它常量不变。TPC-C benchmark
的度量标准是tpm-C
,即每分钟处理的transaction
。HammerDB
就是一个提供TPC-C benchmark
测试的开源工具。
在命令行执行sysdig
命令,得到下列输出日志:
# sysdig | more
8 11:04:39.920906090 2 <NA> (0) > switch next=4606(qemu-kvm) pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
9 11:04:39.920923972 2 qemu-kvm (4606) < ioctl res=0
10 11:04:39.920927878 2 qemu-kvm (4606) > ioctl fd=17(<X>) request=AE80 argument=0
11 11:04:39.920933865 2 qemu-kvm (4606) < ioctl res=0
12 11:04:39.920934920 2 qemu-kvm (4606) > ioctl fd=17(<X>) request=AE80 argument=0
21 11:04:39.920950032 2 qemu-kvm (4606) < ioctl res=0
22 11:04:39.920951238 2 qemu-kvm (4606) > ioctl fd=17(<X>) request=AE80 argument=0
24 11:04:39.920958802 2 qemu-kvm (4606) > switch next=0 pgft_maj=0 pgft_min=930 vm_size=1534620 vm_rss=1083932 vm_swap=0
500 11:04:39.923348311 1 <NA> (0) > switch next=17 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
501 11:04:39.923351955 1 <NA> (17) > switch next=0 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
504 11:04:39.923380189 7 <NA> (0) > switch next=22 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
507 11:04:39.923394983 7 <NA> (22) > switch next=0 pgft_maj=0 pgft_min=0 vm_size=0 vm_rss=0 vm_swap=0
第一列是事件序号,它是增长的,不连续的原因是因为没有包含sysdig
自身产生的事件(可以使用sysdig -D
得到sysdig
自身产生的事件);
第二列是发生事件的时间戳;
第三列是CPU ID
;
第四列是命令;
第五列是线程ID
;
第六列是事件方向,比如进入ioctl
函数为>
,离开为<
;
第七列是事件名称(比如ioctl
);
第八列是事件参数。
参考资料:
Interpreting Sysdig Output;
How to understand evt.num?。
编译debug
版本sysdig
方法:
cd build
cmake -DCMAKE_BUILD_TYPE=Debug..
Database
和Instance
的区别如下:
What is a Database?
We already know that a database is a collection of data. And this data is stored in form of tables at logical level, and in the datafiles at the physical level. There are some other files as well like Redo log files, Control files, Initialization files which stores important information about the database.
What is an Instance?
To view or update data stored in tables/datafiles, Oracle must start a set of background processes, and must allocate some memory to be used during database operation. The background processes and memory allocated by Oracle together make up an Instance.
简言之,Database
是存放实际数据的所有文件。为了操作这些文件,就需要有Instance
:访问文件的进程和内存。
Oracle 12c For Dummies中关于Database
和Instance
二者之间关系的总结:
✓ An instance can exist without a database. Yes, it’s true. You can start an Oracle instance and not have it access any database files. Why would you do this?
• This is how you create a database. There’s no chicken-or-egg debate here. You first must start an Oracle instance; you create the database from within the instance.
• An Oracle feature called Automatic Storage Management uses an instance but isn’t associated with a database.
✓ A database can exist without an instance but would be useless. It’s just a bunch of magnetic blips on the hard drive.
✓ An instance can access only one database. When you start your instance, the next step is to mount that instance to a database. An instance can mount only one database at a time.
✓ You can set up multiple instances to access the same set of files or one database. Clustering is the basis for the Oracle Real Application Clusters feature. Many instances on several servers accessing one central data- base allows for scalability and high availability.
参考资料:
Bash quoting
可以关闭Bash
中具有特殊含义的meta
字符的功能:
a)单引号:所有meta
字符的功能均被关闭;
b)双引号:大部分meta
字符的功能被关闭,除了$
等少数字符;
c)反斜线(\
):仅跟着\
后面的meta
字符被关闭。
这样就可以理解为什么解压多个zip
文件时,要使用“unzip '*.zip'
”而不是“unzip *.zip
”。因为第二种会首先把*.zip
替换成所有的文件名,而第一种方法不会这样做。
参考资料:
Shell十三问;
How do I unzip multiple / many files under Linux?。
Algebraic data type
可以拥有多个value constructor
。比如Bool
类型就是一种algebraic data type
:
data Bool = False | True
每个value constructor
可以有0
个或多个参数。
使用data
关键字定义的数据类型,其实都是algebraic data type
,只不过其只包含了一个value constructor
。
Linux kernel
中针对shared memory
有两个重要的配置项:shmmax
和shmall
:
shmmax
定义了一次分配shared memory
的最大长度,单位是byte
:
# cat /proc/sys/kernel/shmmax
18446744073692774399
shmall
定义了一共能分配shared memory
的最大长度,单位是page
:
最大“shared memory” = shmall(cat /proc/sys/kernel/shmall) * pagesize(getconf PAGE_SIZE)
以shmmax
为例,介绍一下修改值的方法:
(1)现在系统shmmax
的值:
# sysctl -a | grep shmmax
kernel.shmmax = 18446744073692774399
(2)修改shmmax
的值:
# echo "536870912" > /proc/sys/kernel/shmmax
# sysctl -a | grep shmmax
kernel.shmmax = 536870912
可以看到值发生了变化。但是重启系统以后,shmmax
又变回之前的值。如果要让值永久生效,可以使用下列方法:
# echo "kernel.shmmax = 536870912" >> /etc/sysctl.conf
# sysctl -a | grep shmmax
kernel.shmmax = 18446744073692774399
# sysctl -p
kernel.shmmax = 536870912
# sysctl -a | grep shmmax
kernel.shmmax = 536870912
另外,关于如何设置shmall
和shmmax
的值,也可以参考这个脚本。
参考资料:
The Mysterious World of Shmmax and Shmall;
Configuring SHMMAX and SHMALL for Oracle in Linux;
What is shmmax, shmall, shmmni? Shared Memory Max。
使用data
关键字来定义一种新的数据类型(data type
):
data StudentInfo = Student Int String
deriving (Show)
StudentInfo
是type constructor
,也是这种新type
的名字,所以首字母必须大写。
Student
是value constructor
(有时也称之为data constructor
)的名字,它的首字母也必须大写(可以把它看做是首字母大写的函数),作用是用来创建StudentInfo
这种type
的值。在Student
后面的Int
和String
是StudentInfo
这种type
的component(
有时也称作field
或parameter
)
,其作用类似于其它编程语言中结构体成员。
type constructor
只用在type declaration
和type signature
中,而value constructor
只用在实际的代码中。因此二者的使用是相互独立的,可以让type constructor
和value constructor
拥有相同的名字,实际编码中基本也是这样做的:
data Student = Student Int String
deriving (Show)
也可以使用type
关键字为已有的类型定义一个同义词(type synonym
):
type SI = StudentInfo
type synonym
也可以为一个冗长的类型取一个短名字,举例如下:
type SI = (Int, String)
看一下take
函数的type signature
:
ghci> :type take
take :: Int -> [a] -> [a]
这表明它有两个参数,返回值是一个list
。“->
”是右相关(right-associative
),因此实际上也可以把take
函数的type signature
写成这样:
ghci> :type take
take :: Int -> ([a] -> [a])
因此也可以这样理解take
函数:它有一个Int
参数,返回值是另一个函数。这个函数的参数和返回类型是同一个类型的list
。