碎碎碎碎屁

单线多播一次无谓的尝试

by on 1月.28, 2017, under

家里宽带(杭州电信)套餐是100M,之前speedtest测试可以到105+,而且在测试时候发现光猫下两根线可以同时pppoe拨号拿到ip,考虑可以多播尝试下。于是耗费巨资¥140买了个二手路由器,Netgear WNDR3800。历经千辛万苦(刷完机wifi没启,家里设备没有线口)装上openwrt 15.05.1,并成功使用配置好了单线多播。结论是无用。

OpenWrt-Network-Interface-Overview

openwrt 15.05.1 完成这事已经比较简单了,只要在界面上System/Sofeware里搜软件装就好:luci-app-mwan3、mwan3、kmod-macvlan。前两个是mwan3 管理多条wan使用,后一个是虚拟网卡用。

步骤简单分成几块:1. 虚拟网卡。

ip link add link eth1 vth1 type macvlan
ifconfig vth1 up

ip link add link eth1 vth2 type macvlan
ifconfig vth2 up

eth1是wan的interface所在,别的设备可能不叫eth1。vth1只是个名字。完成之后在界面上Add new interface,类型啥参照原来wan的,我这儿就是pppoe了,注意metric要每个不一致(没太懂一样会怎样)。这步看别的文章好了,内容大同小异。上面几行命令加在System/Startup里,其实就是rc.local,这样开机能起来。正常的话应该各个网卡都能拿到pppoe后的ip了,如前文图。

步骤2. mwan3配置

在Network/Load Balancing下点点就能完成,都是属于mwan3的配置,Interfaces、Members、Policies、Rules 4个地方要改改。Interfaces里的tracking IP用国内的,比如alidns的223.5.5.5 223.6.6.6 再加个百度dns 180.76.76.76。Members里metric weight太复杂,都1先。Policies里也就留一条好了,其他不删留着也可以,Last resort的3个选项没太理解各自含义与用法。Rules也就配置了默认路由到Policy。Rules里用到了ipset,反正我lsmod看了都在,dnsmasq看了下也支持ipset,所以没装dnsmasq-full。至此就起来啦,如果不正常在”/admin/network/mwan/advanced/diagnostics” 这个下restart mwan。

speedtest测试三个wan都走字,然而上传和下载都没有叠加……gg

stop单个wan、两个wan,流量都能正常切换,暂时也没发现多播之后客户端会不会出什么问题。不过……在原有1个路由就一个pppoe,加新增一个路由器3个pppoe同时拨上之后(总共4个存活),只要断了一个,断的那个是无法再拨上的,提示超时(Timeout waiting for PADS packets),也就是一只光猫下只有3个pppoe的链接是稳定的。在晚上测试的时候发现只能2个pppoe了,可能是在光猫再上一层做的限制。

结论:杭州电信100M光宽带能够单线多播,然而网速不能叠加,且多播数>2时不稳定。

ref不分先后:

https://wiki.openwrt.org/doc/howto/mwan3

https://www.dianlujitao.com/archives/46

http://leon.leanote.com/post/OpenWrt%E5%A4%9A%E6%8B%A8%E8%AE%B0%E5%BD%95-macvlan-mwan3

http://www.right.com.cn/forum/thread-132875-1-1.html

 

Leave a Comment :, , more...

kernel_task狂飙cpu之迷

by on 2月.21, 2015, under

MacBookAir5,1,之前情况是突发的cpu狂飙伴随着磁盘快速增长导致磁盘满(增量大约4G),约几分钟后自行恢复。由于磁盘满时不能进行任何操作,当然也没法找到底是谁快速占磁盘。

网上看到的解kernel_task cpu快速涨的方法,简单来说是在/System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/ACPI_SMC_PlatformPlugin.kext/Contents/Resources 这个目录下删除机型对应的plist,并重启。实际操作后发现重启完后磁盘空间还占着但cpu不高(可能偶然),有稍许空余空间得以检查磁盘满之事。

发现大文件目录为/System/Library/Caches/com.apple.coresymbolicationd/下的data文件以及另一个grow.mkxAdPh文件,各约4G左右吧,lsof检查后发现有系统进程还开着data文件,mv掉之后重启,暂无异常。

真是专业清磁盘20年……

3 Comments :, more...

从str2time开始的优化

by on 4月.07, 2013, under ,

线上有个perl的脚本,准实时(1分钟cron着)的跑着,一般一跑要1分多钟。之前初看还以为是sql设计差、脚本变量都是全局等等问题,后来想想不行,得用数据说话,于是找到了传说中的nytprof。安装据说要先装下JSON::Any,再装Devel::NYTProf;用的时候perl -d:NYTProf ./a.pl,再nytprofhtml nytprof.out下,好了现在只要w3m nytprof/index.html就能看到详细了。

不看不知道,一看吓一跳,最前面耗时最长的居然都是Date::Parse、Time::Local,而main、DBI这些原以为会慢的差前面两个Date、Time一个数量级啊。那今天就把目光放在Date::Parse里,仔细看了脚本,其实就是用到了str2time,把形如”2013-04-07 22:22:22″的转化为那个秒数。我们这个脚本大概执行一次会用到50多万次的str2time。

网上翻了翻说是Date::Parse慢,于是换了个Time::ParseDate,测试用例如下:
#1.pl
use Date::Parse;
my $start = "2013-04-08 02:00:00";
my $end = "2013-04-08 03:00:00";
for (my $i = 0; $i < 100000; $i++)
{ print str2time($start),"\n",str2time($end),"\n";}
#2.pl
use Time::ParseDate;
my $start = "2013-04-08 02:00:00";
my $end = "2013-04-08 03:00:00";
for (my $i = 0; $i < 100000; $i++)
{ print parsedate($start),"\n",parsedate($end),"\n";}

time比较出来的时间是从原来的13秒变成9秒,稍有提高。

期间多次strace发现经常会访问/etc/localtime,怀疑是模块里不论何时都要去算下现在时间引起的,遂决定直接用timelocal这个最基本的命令传入年月日时分秒来计算。
#3.pl
use Time::Local;
sub new() {
$_ = @_[0];
my( $Y,$M,$D,$h,$m,$s ) = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
return timelocal($s,$m,$h,$D,$M-1,$Y);
}
my $start = "2013-04-08 02:00:00";
my $end = "2013-04-08 03:00:00";
for (my $i = 0; $i < 100000; $i++)
{ print &new($start),"\n",&new($end),"\n";}

于2.pl的耗时比较,从9秒降到6秒多。

strace里还是能看到访问/etc/localtime,在Time::Local里看到还有timegm,试试
> return timelocal($s,$m,$h,$D,$M-1,$Y);
< return timegm($s,$m,$h,$D,$M-1,$Y)-28800;

由于并不牵涉时区,遂直接写死在里面。瞬间,从6秒多降到2秒内,和最开始比已经下降了一个数量级了。所以那,调用次数高的函数啊一定要好好调教下~

把这个提给原脚本owner后发现,原脚本只是为了比较两个时间string转后的大小。他直接改成
> return timegm($s,$m,$h,$D,$M-1,$Y)-28800;
< return ($Y*366*24*3600 + $M*31*24*3600 + $D*24*3600 + $h*3600 + $m*60 + $s);

来进行比较。时间差不多从2秒内变为1秒内。

然后洗澡时候忽然想起别人说过笑话,数据库存时间直接用string存20130407222222,于是测试这样比大小。
sub new() {
$a = @_[0];
$a =~ tr/ \-://d ;
return $a;
}
my $start = "2013-04-08 02:00:00";
my $end = "2013-04-08 03:00:00";
for (my $i = 0; $i < 1000000; $i++)
{ if (&new($start) < &new($end)){print 1};}

测试用例上提高一个数量级跑,上一种7秒多,这一种2秒多。
#p.s.用=~ s/\-|\s*|\://g;代替=~ tr/ \-://d;会比上一段所说的还要慢
也就是说,最开始13秒的,现在已经变成0.2秒了,所以那,优化逻辑也很重要~

改了之后load下降

Leave a Comment :, more...

$PS1增加py的virtualenv支持

by on 4月.09, 2012, under ,

刚刚开始学用python的virtualenv,顺带用上了virtualenv wrapper,发现默认会在PS1之前加上($VIRTUAL_ENV),不好看啊,和我原来的不匹配。然后就花了几小时去改之前就写的很头大的PS1。现在显示到右边啦~

新版PS1效果图

PS1='${debian_chroot:+($debian_chroot)}`a=$?;if [ $a -ne 0 ]; then a=" "$a; echo -ne "\[\e[s\e[1A\e[$((COLUMNS-2))G\e[32m\e[1;41m${a:(-3)}\e[u\]\[\e[0m\e[2m\]"; fi`\[\033[01;32m\]\u@\[\033[01;35m\]\h\[\033[00m\]:\[\033[01;34m\]`pwd`\[\033[00m\]`B=$(git branch 2>/dev/null | sed -e "/^ /d" -e "s/* \(.*\)/\1/"); if [ "$B" != "" ]; then S="git"; elif [ -e .bzr ]; then S=bzr; elif [ -e .hg ]; then S="hg";B="$(hg branch)"; elif [ -e .svn ]; then S="svn"; else S=""; fi; W="\`showvirtualenv 2>/dev/null \`"; if [ "$W" != "" ]; then if [ "${W:0:14}" = "showvirtualenv" ]; then W=""; else W="workon:$W"; fi; fi; if [ "$S" != "" ]; then if [ "$B" != "" ]; then M=$S:$B; else M=$S; fi; fi; if [ "$W" != "" ]; then if [ "$M" = "" ]; then M=$W; else M="$W $M"; fi; fi; [[ "$M" != "" ]] && echo -en "\e[s\e[$((COLUMNS-${#M}-1))G\e[33m\e[1;40m($M)\e[0m\e[u"`\n\[\033[01;34m\]\$\[\033[00m\] '
不分割了,太损血了。

Leave a Comment :, , , more...

openvz下ubuntu-lucid的syslog-ng的reload问题

by on 10月.11, 2011, under

昨天发现vps邮箱经常有root的邮件

/etc/cron.daily/logrotate:
syslog-ng: Error setting capabilities, capability management disabled; error=’Operation not permitted’

放狗搜后发现有这个,里面说

SOLUTION

syslog-ng –no-caps

Debian:
/etc/default/syslog-ng:SYSLOGNG_OPTS=”–no-caps”

于是注释了/etc/default/syslog-ng里面的

SYSLOGNG_OPTS=”–no-caps”

可是今天,居然还是有邮件,不过内容变了

/etc/cron.daily/logrotate:
start-stop-daemon: unrecognized option ‘–no-caps’
Try ‘start-stop-daemon –help’ for more information.
invoke-rc.d: initscript syslog-ng, action “reload” failed.
error: error running non-shared postrotate script for /var/log/syslog of ‘/var/log/syslog ‘
run-parts: /etc/cron.daily/logrotate exited with return code 1

再放狗搜找到了这个bug,我的syslog-ng版本号是3.1.2-1,在3.1.2-2修复了,可是没有3.1.2-2的deb包,乱入debian的deb包也有很多依赖问题。
本来都想手动做deb包了,然后搜到了launchpad的这个diff了一下看到,就是改了下syslog-ng.init。

坑爹啊,手动改/etc/init.d/syslog-ng的syslogng_reload()部分,像刚才这个diff一样删掉 $SYSLOGNG_OPTS,好了,世界安静了~

Leave a Comment :, , , , more...