在windows系统中个,每个进程拥有自己独立的虚拟地址空间(Virtual Address
Space)。这一地址空间的大小与计算机硬件、操作系统以及应用程序都有关系。

Cygwin Unable to get setup from * 错误

FastDFS架构简介

对于32位程序来说,最多能使用2GB空间(0x00010000-0x7FFEFFFF)。为了获得3GB的地址空间,在不同的windows系统中可以按照如下方法来进行扩充。

图片 1

FastDFS是一款开源的、分布式文件系统(Distributed File
System),由淘宝开发平台部资深架构师余庆开发。FastDFS
是包括一组 Tracker Server 和 Storage Server 的。Tracker Server 与
Storage Server
之间不直接通信,其基本的信息由配置文件在系统启动加载时获知。多台 Tracker
Server 之间保证了 Tracker 的分布式,Tracker Server
之间是对等的,防止了单点故障。 Storage Server 是分成多个 Group,每个
Group 中的Storage 都是互相备份的,也就是说,如果 Group1 有
Storage1、Storage2、Storage3,其容量分别是100GB、100GB、100GB,那么
Group1 的存储能力是 100GB,而不是
300GB,这就是互相备份的意思。进一步说,整个 Group
的存储能力由该组中该储能力最小的 Storage 决定。多个 Group
之间的存储方式,可以采用 round robin(轮训)、load
balanced(负载均衡)或指定 Group
的方式。另一点相对于MS(Master-Slave)模式的优势,就是 Tracker Server 与
Master 是决然不同的,不仅 master 有上面可能提到的单点故障问题,而且
client 与 master 之间可能会出现瓶颈。但 FastDFS 架构中,Tracker Server
不会称为系统瓶颈,数据最终是与一个 available 的 Storage Server
进行传输的。

1.操作系统方面

解决方案

上传流程

① 32位windowsXP

是因为用自定义镜像站点,比如

我们可以通过 FastDFS 对文件的上传过程,来初步了解 FastDFS
的基本架构。首先客户端 client 发起对 FastDFS
的文件传输动作,是通过连接到某一台 Tracker Server
的指定端口来实现的,Tracker Server
根据目前已掌握的信息,来决定选择哪一台 Storage Server
,然后将这个Storage Server 的地址等信息返回给 client,然后 client
再通过这些信息连接到这台 Storage Server,将要上传的文件传送到给 Storage
Server上。

图片 2

安装x86_64位Cygwin时,因为多加了/导致Cygwin安装程序找不到steup

总结

② 32位win7 — 管理员权限执行命令:bcdedit
/set increaseuserva 3072来开启

换成如下即可

简单总结一下,FastDFS的特点包括(1)高可靠性:无单点故障;(2)高吞吐量:只要
Group 足够多,数据流量是足够分散的。

③ 64位win7 — 对32位程序默认开启3GB,无需额外设置

 

2.应用程序方面

原文

FastDFS部署:

无论是32位还是64位windows若要让32位程序能使用3GB内存,必须在链接时加上参数:
/LARGEADDRESSAWARE

1、机器分布

 

Tracker 192.168.100.106:22122 CentOS

进程地址空间区段

Group1-Storage1 192.168.100.106:23001 CentOS

图片 3

Group1-Storage1 192.168.100.125:23001 CentOS

注:进程地址空间在低地址,操作系统内核在高地址

 

 

2、需要到的软件和版本(软件存放位置:/root/soft)

进程地址空间分布(以2GB为例)

 图片 4

图片 5

说明:nginx主要实现负载均衡、缓存等功能

Windows系统在进程空间中专门划出一块0x70000000 –
0x80000000(共256MB)区域,用于映射这些常用的系统DLL(如kernel32.dll、ntdll.dll等)

 

对系统DLL的默认基地址进行调整,防止加载时冲突,触发ReBasing(重定基地址)

3、创建相关文件夹

注:基地址必须对齐到分配粒度(64KB)

配置tracker所需的base_path: /opt/fastdfs_tracker

 

配置storage所需的日志目录:fastdfs_storage_info。备注:存储storage之间同步文件等日志的

Win7下,exe在PE文件中基地址为0x400000,DllPrj.dll的基地址为0x10000000且该地址未被其他dll占用;但实际exe被映射到0xEC0000,DllPrj.dll被映射到0x535A0000

配置storage所需的存储文件目录: /opt/fastdfs_storage_data。备注:
这个目录是用来存储文件的

生成exe和dll模块时,链接时使用了参数/DYNAMICBASE(启用动态基地址)

 

注:地址空间布局随机化,
Address space layout randomization
(ASLR):防范恶意程序对已知地址进行攻击

以上三个文件将在后续的tracker.conf和storage.conf、mod_fastdfs.conf中用到

 

 

windows内存分配过程可细化为以下3个要点:

4、安装libfastcommon-1.0.7.zip
(注意:先检查是否安装unzip、zip、gcc、perl等)

① 保留一段虚拟内存地址空间:从进程的4GB中保留一段地址空间。// 带MEM_RESERVE参数的VirtualAlloc函数

unzip libfastcommon-1.0.7.zip

   
起始地址必须是系统分配粒度的整数倍(64KB),大小必须是系统页面大小的整数倍(4KB)。

cd libfastcommon-1.0.7

② 提交一段虚拟内存地址空间:将进程已保留的一段地址空间映射机器的虚拟内存上。// 带MEM_COMMIT参数的VirtualAlloc函数

sh make.sh && sh make.sh install

    起始地址和大小都必须是页面大小的整数倍(4KB)。

 


将虚拟内存地址空间映射到物理内存页(RAM):在访问进程提交的页面被访问时,通过缺页中断(又名页缺失、页面错误,
PageFault)机制来真正分配物理内存页,同时修改对应页面的地址空间映射关系。

perl安装:

注1:在程序中所访问的地址都必须是保留并提交的虚拟内存地址

wget

注2:可以使用VirtualFree来释放保留或提交的虚拟内存地址空间

              tar zxvf perl-5.20.2.tar.gz               

 

              mkdir /usr/local/perl

内存指标概念

              ./Configure -des -Dprefix=/usr/local/perl
-Dusethreads -Uversiononly

图片 6

              make

图片 7

              make install

Total = Image + Mapped File + Shareable + Heap + Managed Heap + Stack +
Private Data + Unusable

              perl -version   

Image:exe、dll等可执行模块的代码段、数据段等

 

Mapped File:作为数据载入的内存映射文件

注意:上述安装路径在/usr/lib64/,FastDFS主程序设置lib目录是/usr/local/lib,创建软连接如下: 

Shareable:进程间共享内存、消息等

             ln -s /usr/lib64/libfastcommon.so
/usr/local/lib/libfastcommon.so

Heap:malloc()、new、HeapAlloc()、LocalAlloc()创建出来的私有内存,由用户态堆管理器统一管理

             ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so

Managed Heap:由GC管理的私有内存

             ln -s /usr/lib64/libfdfsclient.so
/usr/local/lib/libfdfsclient.so

Stack:线程栈

             ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

Private Data:由VirtualAlloc()创建出来的私有内存

 

Page Table:分配在内核态的页表

5、安装fastdfs-5.05.tar.gz:

Unusable:起始地址以64KB对齐,导致一些无用的空闲内存地址空间

tar -zxvf fastdfs-5.05.tar.gz

Free:空闲内存地址空间

cd fastdfs-5.05


./make.sh && ./make.sh install

Blocks:拥有内存块的个数

 

Largest:所有内存块中最大一个的size

进入/etc/fdfs这个目录,如果有配置文件存在,则安装成功

 

图片 8

虚拟内存:

 

Private Bytes  //
进程Committed的虚拟内存字节数
   对应VMMap的Private、win7任务管理器中的【提交大小】,资源管理器中的【提交】

 

Peak Private Bytes  //
进程Committed的虚拟内存的最高峰字节数

 

Virtual Size //
进程Reserved的虚拟地址空间字节数

 

Page Faults  // 发生过的缺页中断次数   
对应win7任务管理器中的【页面错误】

以上步骤在tracker和storage机器上都需要执行

物理内存:

 

Working Set = WS Private + WS Shareable  // 进程占用物理内存总字节数
 对应win7任务管理器中的【工作设置(内存)】,资源管理器中的【工作集】

6、配置tracker (192.168.100.106)

     WS Private //
进程独享的物理内存字节数(如:堆内存+栈内存+cow机制创建的内存)  
对应win7任务管理器中的【内存(专用工作集)】,资源管理器中的【专用】

进入/etc/fdfs文件夹,执行命令: cp  tracker.conf.sample  tracker.conf。

     WS Shareable  //
进程可与其他进程共享的物理内存字节数(如:exe及dll代码段、数据段等)
 对应win7资源管理器中的【可共享】

      编辑tracker.conf,执行命令: vi  tracker.conf ,配置成如下:

     WS Shared  //
进程已与其他进程共享的物理内存字节数,WS Shared<=WS Shareable

disabled=false #false代表开启配置文件

                         //
若只启动一个exe实例,那么exe的代码段、数据段等不会被共享,因而就不统计在WS
Shared中

bind_addr= #空代表所有host,也可以指定host

Peak Working Set // 物理内存的最高峰字节数
 对应win7任务管理器中的【峰值工作设置(内存)】

port=22122 #tracker默认开启的端口号

注:无论是虚拟内存还是物理内存下的各个指标,都是通过统计用户态的那部分占用

connect_timeout=30 #连接超时时间

 

network_timeout=60 #网络超时时间

页交换文件

base_path=/opt/fastdfs_tracker #存放store的数据和日志文件

页交换文件(Page
File):一般被用作可写物理内存页的后备存储器。Windows下该文件名为pagefile.sys,位于各盘的根目录中。

max_connections=256 #允许最大连接数

                                     
可以根据机器的软硬件状况来设置页交换文件的大小,甚至关闭页交换文件的使用。

accept_threads=1 #允许的线程数

图片 9

work_threads=4 #工作线程数,必须小于等于max_connections

图片 10

store_lookup=2 #选择上传文件方式0:轮询,1:指定组,2:负载均衡

 

store_group=group1 #上传到组group1

页出(Page
Out):当物理内存不够时,系统会将一些不经常使用且有后备的物理内存页释放,并将虚拟地址映射关系指向后备。

store_server=0 #上传到storage,0:轮询,1:IP顺序,2:服务器顺序

①以页交换文件(如:堆、栈等)为后备:在页交换文件中分配空间,并拷贝内容到其中后再释放

store_path=0 #上传文件到哪个路径0:轮询,2:负载均衡

②以内存映射文件(如:exe、dll等)为后备:直接释放

download_server=0 #指定下载服务器0:轮询,1:使用源服务器

页入(Page
In):当系统读取某个虚拟内存地址,而该地址所在的页不在物理内存页中时,将产生一个缺页中断,

reserved_storage_space = 10% #保留的存储空间

告诉系统从页交换文件或者内存映射文件中取回包含该地址的虚拟内存页(即:将内容拷回到物理内存页,并建立新的虚拟地址映射到物理内存页上,然后释放页交换文件中对应部分的空间)

log_level=info #日志等级

 

run_by_group= #选择用户组,空代表当前用户组

写时复制机制

run_by_user= #选择用户,空代表当前用户

写时复制机制(copy on write,
COW):当WRITECOPY属性内存页面被修改时,会触发内存页拷贝,以此来节省物理内存和页交换文件的占用。

allow_hosts=* #允许访问的IP,*代表全部

注:系统在映射exe或dll文件时会把数据页指定为PAGE_WRITECOPY属性,代码页指定为PAGE_EXECUTE_WRITECOPY属性

sync_log_buff_interval = 10 #同步日志buff到磁盘的间隔时间

具体过程:

check_active_interval = 120 #检查storage状态间隔时间


当进程对内存页执行修改操作时,系统会找一个闲置的物理内存页,并拷贝所有内容到新页上,然后标记新页的后备存储器为页交换文件,最后将进程的虚拟内存页指向新的物理内存页。

thread_stack_size = 64KB #线程的堆栈大小,必须大于等于64KB


经过上述步骤,进程就可以使用自己副本了,修改在新的物理页上进行,而不对原来的内存页产生任何影响。

storage_ip_changed_auto_adjust = true #storageIP改变是自动调整

 

storage_sync_file_max_delay = 86400 #同步文件的最大延迟

重定基地址

storage_sync_file_max_time = 300 #同步文件的最大时间

重定基地址(Rebasing):模块装载时,如果目标地址被占用或基于安全考虑,系统会根据模块的所需地址空间的大小为其分配一个新的基地址,并将模块装载到该基地址处。

use_trunk_file = false #是否使用中继文件存储小文件

问题:

slot_min_size = 256 #存储文件的最小单位,必须大于等于4KB

①  一旦发生了Rebasing,当模块映射时,要对重定位表中所有页进行地址修正。

slot_max_size = 16MB #存储文件的最大单位,必须大于slot_min_size

② 系统修正这些地址的页面时,会触发写时复制机制。

trunk_file_size = 64MB #中继文件的大小,必须大于等于4MB

 

trunk_create_file_advance = false #是否允许创建中继文件超前

地址空间布局随机化(Address
space layout randomization,ASLR)

trunk_create_file_time_base = 02:00 #创建trunk文件的时间基准

微软在Vista系统中引入了名为ASLR的技术,模块每次会被加载到随机位置(伪随机),防范恶意程序对已知地址进行攻击。

trunk_create_file_interval = 86400 #创建trunk文件的时间间隔

ASLR不仅对模块地址做了随机处理,还对堆、栈、进程环境块(Process
Environment Block, PEB)、线程环境块(Thread Environment Block,
TEB)的地址也进行了随机化。

trunk_create_file_space_threshold = 20G

ASLR技术将Rebasing放到内核中进行处理,意味着可以在系统范围上(原来只能在进程范围内),最大程度上减少Rebasing的发生,从而节省物理内存和页交换文件的使用。

trunk_init_check_occupying = false

 

trunk_init_reload_from_binlog = false

PE文件装载

trunk_compress_binlog_min_interval = 0

图片 11

use_storage_id = false

 

storage_ids_filename = storage_ids.conf

注:映射必须以页面(4KB)为单位,并按照页边界进行对齐

id_type_in_filename = ip

执行完映射后,绝大部分指令和数据都还没有被装入物理内存中。装载过程是随着程序的执行动态进行的。

store_slave_file_use_link = false

具体过程:cpu在访问指令和数据时,发现该地址所在的页不在物理内存页中时,会触发缺页中断,此时系统会找一个闲置的物理内存页,并将内容从后备中(映像文件或页交换文件中)载入到该物理内存页中。

rotate_error_log = false

error_log_rotate_time=00:00

rotate_error_log_size = 0

log_file_keep_days = 0

use_connection_pool = false

connection_pool_max_idle_time = 3600

http.server_port=8080

http.check_alive_interval=30

http.check_alive_type=tcp

http.check_alive_uri=/status.htm

 

配置文件详细注解参考:

 

启动tracker: /usr/local/bin/fdfs_trackerd  /etc/fdfs/tracker.conf
 start (start\stop\restart)

检测是否启动成功:netstat -lntup|grep fdfs_trackerd

图片 12 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注