SyncY v2版正式发布了,相比v1版本变化很大,可以支持多任务、多线程,同时可以设定限速时间段。多线程大家都很了解,pc上的下载程序都支持,不多说,让大家赶快来体验能在路由上运行的多任务多线程同步软件。
V2版程序新增3个配置项(speedlimitperiod、tasknumber、threadnumber):
speedlimitperiod:限速时间段,在此时间内按照设定设置的最大上传或下载速度限速,设置格式与运行时间段相同,默认值为0-0,表示不限速;
tasknumber:同时同步的任务数,即同时上传或下载的文件个数,默认值为2,最小值为1;
threadnumber:每个任务的线程数,该设置值表示每个任务的最大线程数,默认值为2,最小值为1.
v2版内存耗用比v1版大很多,根据我观察看,每增加一个线程需要耗用2M左右的内存,默认情况下(2任务2线程)有2个下载任务在运行时,内存耗用在20M左右(同步文件数量大且开启同步信息缓存时内存耗用还会增加),32M内存的路由跑起来压力很大,64M及以上的应该没什么问题。
我的启动没几下就会停了…
错误日志也没有
手动运行
root@OpenWrt:/data/syncy# syncy.py
2015-01-11 13:21:53 PCS quota is 2155G,used 70G.
2015-01-11 13:21:53 Start sync path: “/data/syncy/media:media:download”.
Segmentation fault
每个任务的线程数 填 2 就没有问题 填多了就会出现 Segmentation fault
不知道你是不是在路由上运行,如果不是你可以升级下python到最新的2.7.9版,如果是在路由上,总线程数不要设置的太多,占用太多的资源会被系统kill的,出现Segmentation fault错误很可能就是被系统干掉了,查了下大多是因为访问内存越界造成的,但对于python脚本来说不直接访问内存,应该不存在越界的问题。
还有一个可能就是你的系统设置的堆栈太小了,可以用ulimit -a查看堆栈大小,下面是我路由上的信息(我开2任务,每任务4线程,没有问题):
root@Router:/u01/log# ulimit -a
-f: file size (blocks) unlimited
-t: cpu time (seconds) unlimited
-d: data seg size (kb) unlimited
-s: stack size (kb) 8192
-c: core file size (blocks) 0
-m: resident set size (kb) unlimited
-l: locked memory (kb) 64
-p: processes 988
-n: file descriptors 1024
-v: address space (kb) unlimited
-w: locks unlimited
-e: scheduling priority 0
-r: real-time priority 0
如果你的堆栈较小,可以用命令ulimit -s来调大点。
非常感谢回复 我是在路由器上运行的 openwrt x86
root@OpenWrt:~# ulimit -a
-f: file size (blocks) unlimited
-t: cpu time (seconds) unlimited
-d: data seg size (kb) unlimited
-s: stack size (kb) 8192
-c: core file size (blocks) 0
-m: resident set size (kb) unlimited
-l: locked memory (kb) 64
-p: processes 3940
-n: file descriptors 1024
-v: address space (kb) unlimited
-w: locks unlimited
-e: scheduling priority 0
-r: real-time priority 0
那不知道你的内存多大,会不会是线程开多了,占用内存多被系统kill了。
512M的内存 远远够用吧.
找到错误原因了,是libcurl的dns解析和ssl访问非线程安全,开多线程会容易导致segmentation fault,有一个参数设置上就可以,我再试两天,没问题就发个更新。设置上那个参数影响是不能正常反馈dns解析不了的错误,dns解析不了的时候应该是极其少的。
并且现在优化了下,内存占用比原来少了很多,线程开的越多节省的越多,我开2任务,各4线程,只占用11M+的内存,之前要占用30M左右的内存。