查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

博客新家:https://postgres.fun/

 
 
 
 
 
 

ZFS: 文件系统空间使用率的疑惑

2014-7-9 17:00:43 阅读8735 评论0 92014/07 July9

 
      刚开始使用 ZFS 时,对 ZFS 文件系统的使用率比较疑惑, 发现初始时每个已 mount 的 zfs 文件系统的 Size( df -Th 输出 ) 都一样.     
    
      zfs 对文件系统的处理有所不同,  每个数据集(dataset)都能使用整个池子的空间. 每个 dataset  的可使用最大值为所在池子剩余空间大小, 这和 LVM 的理念不同, 下面通过实验测试下:

--1 创建文件

dd if=/dev/zero of=/tmp/file1 bs=1G count=1
dd if=/dev/zero of=/tmp/file2 bs=1G count=1

备注: 预先分配大小的文件也可用来创建 ZFS, 但不推荐使用, 这里仅用来做测试.

--2 创建 zpool

root@francs:~ # zpool create zp1 /tmp/file1 /tmp/file2

root@francs:/data1 # zpool status zp1
  pool: zp1
 state: ONLINE
  scan: none requested
config:

        NAME          STATE     READ WRITE CKSUM
        zp1           ONLINE       0     0     0
          /tmp/file1  ONLINE       0     0     0
          /tmp/file2  ONLINE       0     0     0

备注:创建一个大小为 2.0 GB 的池子.         
          
--3 创建四个 dataset

root@francs:~ # zfs create -o mountpoint=/data1 zp1/data1
root@francs:~ # zfs create -o mountpoint=/data2 zp1/data2
root@francs:~ # zfs create -o mountpoint=/data3 zp1/data3
root@francs:~ # zfs create -o mountpoint=/data4 zp1/data4


--4 查看文件系统

root@francs:~ # df -Th
Filesystem          Type     Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default  zfs       16G    3.4G     12G    22%    /
devfs               devfs    1.0K    1.0K      0B   100%    /dev
zroot/tmp           zfs       12G    704K     12G     0%    /tmp
zroot/usr/home      zfs       12G    156K     12G     0%    /usr/home
zroot/usr/ports     zfs       13G    874M     12G     7%    /usr/ports
zroot/usr/src       zfs       13G    545M     12G     4%    /usr/src
zroot/var           zfs       13G    636M     12G     5%    /var
zroot/var/crash     zfs       12G    148K     12G     0%    /var/crash
zroot/var/log       zfs       12G    384K     12G     0%    /var/log
zroot/var/mail      zfs       12G    152K     12G     0%    /var/mail
zroot/var/tmp       zfs       12G    152K     12G     0%    /var/tmp
zp1                 zfs      2.0G     31K    2.0G     0%    /zp1
zp1/data1           zfs      2.0G     31K    2.0G     0%    /data1
zp1/data2           zfs      2.0G     31K    2.0G     0%    /data2
zp1/data3           zfs      2.0G     31K    2.0G     0%    /data3
zp1/data4           zfs      2.0G     31K    2.0G     0%    /data4

备注: 可以看到 /data1 ,/data2, /data3,/data4 四个已 mount 的目录. 每个目录的 Size 都为 2.0 GB.

--5 向 /data1 目录写入数据

root@francs:/data1 # dd if=/dev/zero of=/data1/file_test.img bs=100M count=3
3+0 records in
3+0 records out
314572800 bytes transferred in 37.706116 secs (8342753 bytes/sec)

备注: 在 /data1 目录里写入一个 300 MB 的文件.

--6 再次查看文件系统使用率

root@francs:/data1 # df -Th
Filesystem          Type     Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default  zfs       16G    3.4G     12G    22%    /
devfs               devfs    1.0K    1.0K      0B   100%    /dev
zroot/tmp           zfs       12G    2.1M     12G     0%    /tmp
zroot/usr/home      zfs       12G    156K     12G     0%    /usr/home
zroot/usr/ports     zfs       13G    874M     12G     7%    /usr/ports
zroot/usr/src       zfs       13G    545M     12G     4%    /usr/src
zroot/var           zfs       13G    636M     12G     5%    /var
zroot/var/crash     zfs       12G    148K     12G     0%    /var/crash
zroot/var/log       zfs       12G    384K     12G     0%    /var/log
zroot/var/mail      zfs       12G    152K     12G     0%    /var/mail
zroot/var/tmp       zfs       12G    152K     12G     0%    /var/tmp
zp1                 zfs      1.7G     31K    1.7G     0%    /zp1
zp1/data1           zfs      2.0G    300M    1.7G    15%    /data1
zp1/data2           zfs      1.7G     31K    1.7G     0%    /data2
zp1/data3           zfs      1.7G     31K    1.7G     0%    /data3
zp1/data4           zfs      1.7G     31K    1.7G     0%    /data4

备注:发现 /data2,/data3,/data4 目录的 SIze 都降为 1.7GB , 说明 zfs 文件目录的最大使用 Size 是会变化的, 每一个 zfs 目录都可以使用整个池子的容量.

--7 接着往 /data2 目录写入一个 200M 的文件

root@francs:/data1 # dd if=/dev/zero of=/data2/file_test.img bs=100M count=2
2+0 records in
2+0 records out
209715200 bytes transferred in 19.487790 secs (10761364 bytes/sec)


--8 再次查看文件系统使用率

root@francs:/data1 # df -Th
Filesystem          Type     Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default  zfs       16G    3.4G     12G    22%    /
devfs               devfs    1.0K    1.0K      0B   100%    /dev
zroot/tmp           zfs       12G    2.8M     12G     0%    /tmp
zroot/usr/home      zfs       12G    156K     12G     0%    /usr/home
zroot/usr/ports     zfs       13G    874M     12G     7%    /usr/ports
zroot/usr/src       zfs       13G    545M     12G     4%    /usr/src
zroot/var           zfs       13G    636M     12G     5%    /var
zroot/var/crash     zfs       12G    148K     12G     0%    /var/crash
zroot/var/log       zfs       12G    384K     12G     0%    /var/log
zroot/var/mail      zfs       12G    152K     12G     0%    /var/mail
zroot/var/tmp       zfs       12G    152K     12G     0%    /var/tmp
zp1                 zfs      1.5G     31K    1.5G     0%    /zp1
zp1/data1           zfs      1.8G    300M    1.5G    17%    /data1
zp1/data2           zfs      1.7G    200M    1.5G    12%    /data2
zp1/data3           zfs      1.5G     31K    1.5G     0%    /data3
zp1/data4           zfs      1.5G     31K    1.5G     0%    /data4

备注: 这时就比较清楚了. 池子好比是公共资源, 同一个池子的每一个目录都能使用这些资源, 先用先得。

--9 查看 ZFS 空间使用

root@francs:~ # zpool iostat -v zp1
                 capacity     operations    bandwidth
pool          alloc   free   read  write   read  write
------------  -----  -----  -----  -----  -----  -----
zp1            501M  1.50G      0      2     21  94.8K
  /tmp/file1   251M   765M      0      1     10  47.5K
  /tmp/file2   250M   766M      0      1     11  47.3K
------------  -----  -----  -----  -----  -----  -----

备注: 数据均匀地写入到了文件 /tmp/file1 和 /tmp/file2。

作者  | 2014-7-9 17:00:43 | 阅读(8735) |评论(0) | 阅读全文>>

ZFS: 创建池

2014-7-6 17:47:35 阅读2171 评论0 62014/07 July6


        前两天刚把 FreeBSD 安装好,接下来准备学习 ZFS 的使用, zfs 文件系统特性网上内容很多,这里不介绍了,这里仅记录 zfs 的简单使用,做个笔记。

       实验环境为 FreeBSD 10.0 虚拟机,先创建一块 30 G 的虚拟盘,步骤略。

--1 创建 zpool

root@francs:~ # zpool create zp1 /dev/da0

root@francs:~ # zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
zp1    29.8G   134K  29.7G     0%  1.00x  ONLINE  -
zroot  17.9G  5.17G  12.7G    28%  1.00x  ONLINE  -


--2 查看池状态

root@francs:/zp1/database # zpool status zp1
  pool: zp1
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zp1         ONLINE       0     0     0
          da0       ONLINE       0     0     0


--3 查看池属性

root@francs:/zp1/database # zfs get all zp1
NAME  PROPERTY              VALUE                 SOURCE
zp1   type                  filesystem            -
zp1   creation              日  7  6 12:57 2014  -
zp1   used                  151M                  -
zp1   available             29.1G                 -
zp1   referenced            32.5K                 -
zp1   compressratio         1.01x                 -
zp1   mounted               yes                   -
zp1   quota                 none                  default
zp1   reservation           none                  default
zp1   recordsize            128K                  default
zp1   mountpoint            /zp1                  default
zp1   sharenfs              off                   default
zp1   checksum              on                    default
zp1   compression           off                   default
zp1   atime                 on                    default
zp1   devices               on                    default
zp1   exec                  on                    default
zp1   setuid                on                    default
zp1   readonly              off                   default
zp1   jailed                off                   default
zp1   snapdir               hidden                default
zp1   aclmode               discard               default
zp1   aclinherit            restricted            default
zp1   canmount              on                    default
zp1   xattr                 off                   temporary
zp1   copies                1                     default
zp1   version               5                     -
zp1   utf8only              off                   -
zp1   normalization         none                  -
zp1   casesensitivity       sensitive             -
zp1   vscan                 off                   default
zp1   nbmand                off                   default
zp1   sharesmb              off                   default
zp1   refquota              none                  default
zp1   refreservation        none                  default
zp1   primarycache          all                   default
zp1   secondarycache        all                   default
zp1   usedbysnapshots       0                     -
zp1   usedbydataset         32.5K                 -
zp1   usedbychildren        151M                  -
zp1   usedbyrefreservation  0                     -
zp1   logbias               latency               default
zp1   dedup                 off                   default
zp1   mlslabel                                    -
zp1   sync                  standard              default
zp1   refcompressratio      1.00x                 -
zp1   written               32.5K                 -
zp1   logicalused           152M                  -
zp1   logicalreferenced     16.5K                 -


--4 创建具有压缩功能的 zfs 文件系统

root@francs:~ #  zfs create zp1/database
root@francs:/zp1/database # zfs set compression=gzip zp1/database


--5 查看属性

root@francs:~ # zfs get -r compression zp1
NAME          PROPERTY     VALUE     SOURCE
zp1           compression  off       default
zp1/database  compression  lz4       local


--6  传一个文件,验证是否压缩

root@francs:/zp1/database # du -k /root/db_francs库恢复日志.sql
1545    /root/db_francs库恢复日志.sql

root@francs:/zp1/database # cp /root/db_francs库恢复日志.sql .

root@francs:/zp1/database # du -k db_francs库恢复日志.sql
84      db_francs库恢复日志.sql

备注:这里设置了 gzip 压缩方法,还支持  LZJB, ZLE等压缩方法,这里不测试了。

--7 写入 /etc/fstab

# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/gpt/swap0          none    swap    sw              0       0
zp1/database    /zp1/database   zfs     rw,noatime      0       0

备注:这步可选,之前 reboot 后,发现新建的 /zp1 目录会自动 mount。

--8 参考

作者  | 2014-7-6 17:47:35 | 阅读(2171) |评论(0) | 阅读全文>>

C语言学习:数组和指针

2013-3-4 16:17:12 阅读9398 评论0 42013/03 Mar4

  
        今天学习了指针章节的数组部分,一开始觉得指针和组数组没啥必然的联系,
通过书中的例子,了解了一些,通过例子学习:

一  例一:一维数组测试: array_point.c
 #include <stdio.h>

int main(void)
{
  long mult[]={15L,25L,35L,45L};
  long *p=mult;
  int i=0;


 /* 查看数组 mult 的值和地址 */
  printf("\nmult= %ld", *mult );
  printf("\nmult= %d", mult );

 /* 列出数组元素值 */
 for ( i=0;i<4;i++)
  {
   printf("\nmult[%d]=%d", i, mult[i] );
   printf("\naddress p+%d (&muti[%d]): %d ", i,i,p+i);
  }

   printf("\n");
   return 0;
}
   

--1.1 编译执行
 [pg92@redhatB point]$ gcc -o array_point array_point.c
[pg92@redhatB point]$ ./array_point

mult= 15
mult= -1077617976
mult[0]=15
address p+0 (&muti[0]): -1077617976 
mult[1]=25
address p+1 (&muti[1]): -1077617972 
mult[2]=35
address p+2 (&muti[2]): -1077617968 
mult[3]=45
address p+3 (&muti[3]): -1077617964 
  备注:可见数组 mult 表示第一个数组元素的地址。 *mult 表示第一个数组元素的值。
  

二:例二:二维数组:muti_array.cs
 /*Program:muti_array.c*/

#include <stdio.h>

int main(void)
{
  char board[3][3]={{'1','2','3'},{'4','5','6'},{'7','8','9'}};
  int i=0;

  printf("\n values of board[0][0]: %c",board[0][0]);
  printf("\n values of board[0]: %p",board[0]);
  printf("\n values of *board[0]: %c",*board[0]);
  printf("\n values of *board: %p",*board);
  printf("\n values of **board: %c",**board);
  printf("\n values of *board[0]: %c",*board[0]);
  printf("\n values of *board[1]: %c",*board[1]);
  printf("\n values of *board[2]: %c",*board[2]);

  /*List all elements of the array 注意: *board 为数组的第一个元素的地址,**board 为数组第一个元素的值*/
  for(i=0;i<9;i++)
  {
   printf("\nboard: %p",*board+i);
   printf("\nboard: %c",*(*board+i));
  }
  
   printf("\n");
   return 0;
 }
   
 
--2.1 编译执行
  values of board[0][0]: 1
 values of board[0]: 0xbfa14103
 values of *board[0]: 1
 values of *board: 0xbfa14103
 values of **board: 1
 values of *board[0]: 1
 values of *board[1]: 4
 values of *board[2]: 7
board: 0xbfa14103
board: 1
board: 0xbfa14104
board: 2
board: 0xbfa14105
board: 3
board: 0xbfa14106
board: 4
board: 0xbfa14107
board: 5
board: 0xbfa14108
board: 6
board: 0xbfa14109
board: 7
board: 0xbfa1410a
board: 8
board: 0xbfa1410b
board: 9
   
 备注:这个例子引用的是二维数组并打印一系列的值,用于理解各变量的意义。
 
       board[0][0]:表示直接引用第一个数组的第一个元素值。
       board[0]:    表示二维数组第一个数组的起始地址。
      *board[0]:    指明了第一个数组,但没指明哪个元素,省略元素是指引用第一个元素。
      *board:       表示二维数组第一个数组的第一个元素地址。
      **board:     表示二维数组第一个数组的第一个元素值。
      *board[i]:    表示二唯数组第 i 个数组第一个元素的值。
       board+i:     获得数组所有元素的地址。
      *(*board+i)   获得数组所有元素的值。
      
三 总结
    数组和指针的关系比较复杂,暂时也总结这些,以后再补上。


四 附:访问数组元素的指针表达式

C语言学习:数组和指针 - francs - PostgreSQL DBA
 
 
          

作者  | 2013-3-4 16:17:12 | 阅读(9398) |评论(0) | 阅读全文>>

C语言学习:常量指针和指向常量的指针

2013-2-22 16:08:26 阅读11591 评论0 222013/02 Feb22


             今天在学习常量指针和指向常量的指针两个概念时,开始总感觉很混乱,后来实验后,
总算明白了,记录下,以后忘记了还能看看复习。


一 常量指针
  
  常量指针是指指针中存储的地址不能改变,但能更改指针指向的值,声明时格式如下:

    int *const pcount=&count;
   
   编写以下脚本测试:
   
--1.1 常量指针测试脚本
 [pg92@redhatB point]$ vim test_1.c

/*Program test_1.c  常量指针: 指针存储的地址不能改变,但能改变指针指向的值.*/

#include <stdio.h>

int main(void)
{
 int count=43;
 int sum=45;
 int *const pcount=&count; /*Defines a constant, means "pcount" read-only variable */

 printf("\n step1 count=%d",count);
 *pcount=143;
 pcount=&sum;
 printf("\n step2 count=%d",count);
 printf("\nthe address of pcount is %p",pcount);
 printf("\nthe value of pcount is %d\n",*pcount);
}
   

--1.2 编译
 [pg92@redhatB point]$ gcc -o test_1 test_1.c 
test_1.c: In function ‘main’:
test_1.c:13: error: assignment of read-only variable ‘pcount’
     备注:更改常量指针地址时,报错。

--1.3 去掉 "pcount=&sum;" 行时,正常执行
 [pg92@redhatB point]$ gcc -o test_1 test_1.c 
[pg92@redhatB point]$ ./test_1

 step1 count=43
 step2 count=143
the address of pcount is 0xbfc7b224
the value of pcount is 143
   备注:从上面看出常量指针 pcount 存储的地址不能被修改,但能更改它指向的值。
  
  
  
二 指向常量的指针
   
   指向常量的指针是指该指针指向的值不能通过指针改变,但能更改指针存储的地址。
   声明如下:
  
    const int *pcount=&count;
   
   编写脚本测试:
   
--2.1 指向常量的指针测试脚本。
 [pg92@redhatB point]$ vim test_2.c

/*Program test_2.c  指向常量指针: 指针指向的值不能改变,但能改变指针地址.*/

#include <stdio.h>

int main(void)
{
 int count=43;
 int sum=45;
 const int *pcount=&count; /*Defines a pointer to a constant,means "*pcount" is read-only. */

 printf("\n step1 *pcount=%d",*pcount);
 printf("\n step1 The address of pcount is %p",pcount);
 pcount=&sum;
 printf("\n step2 *pcount=%d",*pcount);
 printf("\n step2 The address of pcount is %p\n",pcount);
}   
   

--2.2 编译执行
 [pg92@redhatB point]$ gcc -o test_2 test_2.c
[pg92@redhatB point]$ ./test_2

 step1 *pcount=43
 step1 The address of pcount is 0xbfab4928
 step2 *pcount=45
 step2 The address of pcount is 0xbfab4924
[pg92@redhatB point]$ 
   备注:上面测试说明指针存储的地址改变了。 如果脚本中增加“ *pcount=&sum;” 代码,则会报以下错:
 
 --2.3 ERROR
 [pg92@redhatB point]$ gcc -o test_2 test_2.c
test_2.c: In function ‘main’:
test_2.c:14: error: assignment of read-only location ‘*pcount
    备注:说明不能通过 *pcount 更改指向变量的值;从以上实验看出,指向常量的指针指向的值并是保持不变,
               因为虽然不能通过 *pcount 来更改指针指向的值,但更改指针地址后,它指向的值依然被改变。
        

作者  | 2013-2-22 16:08:26 | 阅读(11591) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 

关于我

 
 
模块内容加载中...
 
 
 
 
 

日志分类

 
 
日志分类列表加载中...
 
 
 
 
 
 
 

浙江省 杭州市 处女座

 发消息  写留言

 
人生格言Don't look how far you have to go,look how far you have come !
QQ151389554
E-Mail francs3@163.com
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 

francs 的微博

 
 
模块内容加载中...
 
 
 
 
 
 
 
 
留言列表加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018

登录  
 加关注