迁移到linode东京机房

一开始就是新加坡机房,连接不稳定,延迟大。几次提交ticket,希望迁移到东京机房,都被客服以东京机房已满为由回绝。中间还迁过一次美国fremont机房,但似乎比新加坡机房更糟。于是我每隔一段时间,都提交一次ticket,内容不变,回复也不变。

今天,试着添加一个东京机房的节点,居然成功了。再提交ticket,回复居然依然是sorry。看了回复,以为东京机房空闲资源被人抢占了,于是再添加东京机房节点,还是成功。可以断定,要么就是客服按着习惯瞎回复,要么就是linode故意给东京机房保留资源——也许是留给新用户?

Google了一下,发现了自助迁移机房的办法,大喜。
步骤如下:
一、创建新节点
二、停掉旧节点
三、进入旧节点(管理页面),克隆资料到新节点。克隆过程跟联系客服迁移机房后,手动重启节点的过程一样。这个慢啊……
四、删除旧节点
因为linode是按小时记费的,还不用担心费用的问题。

网上说,日本机房很多ip都被封了。等到新节点起来,检测下,果然中奖了。
换ip可无法自助,只好提交ticket。

换了ip,一切ok。虽然延迟没法跟国内服务器比,但与新加坡、美国机房比明显强多了。

Posted in Uncategorized | Tagged , | Leave a comment

利用docker部署Hadoop单节点环境

之前早就编译好了几个hadoop镜像,含2.4.1、2.6.0、2.7.0三个版本。但一直未能成功地部署好docker hadoop环境。这个周末终于能静下心来,做成这件小事。
网络上所流传的docker hadoop部署方式,大都是一个容器一个节点(即master或slave)。我这里采用的是一个容器一个服务的方式。
必须要强调,这只是第一步。多节点部署方式还待研究。

先从镜像服务器拉取我制作的hadoop镜像。我所编译的hadoop镜像的hadoop原生库为64位,jdk为openjdk-7-jdk,Dockerfile见这里。这次我使用的版本是2.6.0。
docker pull wencan/hadoop:2.6.0

创建本地配置文件目录,和数据目录
mkdir conf
mkdir data
拷贝hadoop etc/hadoop目录下的全部配置文件到conf目录下,配置几个关键项。如果本地没有hadoop包,可以创建一个hadoop容器,利用docker cp从容器拷贝出默认的配置文件。
主要配置可见这里。另外还需要需要的配置的为namenode的数据目录,和datanode的数据目录,这个可以参考这里

格式化namenode数据目录
这里必须使用默认的桥接网络,否则会出错
docker run –rm -it -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop -v $PWD/data:/data wencan/hadoop:2.6.0 hdfs namenode -format

运行namenode,使用宿主网络,后面相同
docker run -d –name hadoop_namenode -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop -v $PWD/data:/data –net host wencan/hadoop:2.6.0 hdfs namenode

运行datanode
docker run -d –name hadoop_data -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop -v $PWD/data:/data –net host wencan/hadoop:2.6.0 hdfs datanode

可以登陆http://localhost:50070查看,可以看到一个datanode节点。

运行resourcemanager
docker run -d –name hadoop_resourcemanager -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 yarn resourcemanager

运行nodemanager
docker run -d –name hadoop_nodemanager -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 yarn nodemanager

可以登陆http://localhost:8088查看,可以在nodes页面看到一个nodemanager节点

运行historyserver
docker run -d –name hadoop_historyserver -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 mapred historyserver

创建/input/wordcount目录,并将本地配置文件复制过去,作为稍后wordcount的输入文件
docker run –rm -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 /bin/bash -c ‘hdfs dfs -mkdir -p /input/wordcount && hdfs dfs -copyFromLocal /etc/hadoop/* /input/wordcount’

列出刚才复制到hdfs的文件。也可以在50070查看。
docker run –rm -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 hdfs dfs -ls /input/wordcount/

执行wordcount,输入目录为/input/wordcount,输出目录为/output/wordcount
docker run –rm -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /input/wordcount /output/wordcount

输出mapreduce的计算结果
docker run –rm -e HADOOP_CONF_DIR=/etc/hadoop -v $PWD/conf/:/etc/hadoop –net host wencan/hadoop:2.6.0 hdfs dfs -cat /output/wordcount/*

参考:
Hadoop MapReduce Next Generation – Setting up a Single Node Cluster.
配置运行hadoop

Posted in Uncategorized | Tagged , | Leave a comment

JavaScript版k-means++算法实现

按照维基百科的定义,k-means为:把n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类。

k-means的过程为:
1、随机选取k个中心
2、将数据点依据中心归类为k个聚集
3、选择每个聚集的中心,作为新的中心
4、重复2、3步,直到聚集不再发生变化

k-means的缺陷为第一步的随机选择中心。如果数据点为[1, 5, 6, 9, 10]。k-means的结果可能为[[1], [5, 6], [9, 10]],也可能为[[1, 5, 6], [9], [10]]。从概念上看,这两个结果都是正确的,但后者很明显不是我们想要的。

k-means++改进了第一次选取中心的方法,使得第一次选取的中心之间间距够大。k-means++第一次选取中心的过程为:
1、随机选取一个数据点作为第一个中心
2、计算每个数据点到最近的中心的距离
3、选取上一步最后距离最大的数据点,作为新的中心
4、重复2、3步,直到选取到k个中心

下面是实现,包含了k-means和k-means++。
kmeans函数第三个参数为一个计算数据点权值的函数,用来计算数据点间距离和聚集平均权值。缺点是权值函数会被多次应用于同一数据点上。
[code lang=”javascript”]exports = module.exports = kmeans;

//随机取k个中心
function randomCentroids(points, k, weightFun){
var centroids = new Array(k);
var weights = new Array(k);
var idxs = [];
for(var i=0; i<k; i++){ while(true){ var idx = parseInt(Math.random() * points.length); //下标不能重复 if(idxs.indexOf(idx)!==-1) continue; //权值不能相等 if(weights.indexOf(weightFun(points[idx]))!==-1) continue; break; } centroids[i] = points[idx]; weights[i] = weightFun(points[idx]); idxs.push(idx); } return centroids; } //k-means++第一次选取中心 function firstCentroids(points, k, weightFun){ var centroids = []; var m = k; //随机选出第一个中心 var first = points[parseInt(Math.random()*points.length)]; centroids.push(first); m–; //选取剩下的中心 while(m>0){
//每个点到最近中心的距离
var dists = points.map(function(point){
var dists = centroids.map(function(centroid){
return Math.abs(weightFun(centroid) – weightFun(point))
})
return Math.min.apply(null, dists);
})
//取上面的距离中最大者
var max_dist = Math.max.apply(null, dists);
var max_idx = dists.indexOf(max_dist);

centroids.push(points[max_idx]);
m–;
}

return centroids;
}

//新的k个中心
//计算每个中心的平均权值,取聚集中权值与平均权值最接近的为中心
function newCentroids(clusters, weightFun){
return clusters.map(function(cluster){
var sum = cluster.reduce(function(a, b){return a+weightFun(b);}, 0)
var mean = sum / cluster.length;

var dists = cluster.map(function(point){
return Math.abs(weightFun(point) – mean);
})
var min_dist = Math.min.apply(null, dists);
return cluster[dists.indexOf(min_dist)];
})
}

//聚类,返回k个聚集
function classify(points, centroids, weightFun){
var clusters = centroids.map(function(){return [];});

for(var i=0; i<points.length; i++){
var min_idx;
var min_dist = undefined;
for(var j=0; j<centroids.length; j++){
dist = Math.abs(weightFun(points[i]) – weightFun(centroids[j]));
if(min_dist===undefined || dist<min_dist){
min_dist = dist;
min_idx = j;
}
}

clusters[min_idx].push(points[i]);
}

return clusters;
}

function kmeans(points, k, weightFun){
var centroids = firstCentroids(points, k, weightFun);

//console.log(‘centroids: ‘ + JSON.stringify(centroids));

while(true){
var clusters = classify(points, centroids, weightFun);
//console.log(‘clusters: ‘ + JSON.stringify(clusters));

var old = centroids;
var centroids = newCentroids(clusters, weightFun);
//console.log(‘centroids: ‘ + JSON.stringify(centroids));

//当新旧聚集中心相等时,聚类结果不会再发生变化,跳出循环
for(var i=0; i<k; i++){
if(centroids.indexOf(old[i])===-1){
break;
}
}
if(i===k) break;
}

return clusters;
}

if(!module.parent){
var points = [1, 5, 6, 9, 10, 34, 67, 12, 34, 67, 12, 344, 56, 23, 68, 23, 11, 333, 65, 23, 45, 23, 12];
//var points = [1, 5, 6, 9, 10];
console.log(kmeans(points, 3, function(x){return x;}))
}
[/code]

Posted in Uncategorized | Tagged | Leave a comment

配置运行hadoop

前面的。hadoop版本依然是2.4.1.

选择一个节点做主节点,运行hdfs的namenode、yarn的resourcemanager,以及jobhistoryserver。主节点的节点名称定为hadoop-master。
剩下的作为从节点,运行hdfs的datanode、yarn的nodemanager。每个从节点的节点名称定位hadoop-slave+编号。
“节点名称”这个词,好像是我发明的……

为每个节点创建hadoop用户。配置主节点的hadoop用户可以免密码登录到各个节点(包含自身)。

su – hadoop //切换到hadoop用户
sudo mkdir /opt/hadoop //创建hadoop主目录
cd /opt/hadoop //切换到hadoop主目录
tar xzvf */hadoop-2.4.1.tar.gz //解压缩hadoop包到当前目录,即hadoop主目录
ln -s hadoop-2.4.1 current //创建current符号链接到当前版本的hadoop目录

echo “export PATH=$PATH:/opt/hadoop/current/bin” | sudo tee /etc/profile.d/hadoop.sh //添加hadoop bin目录到PATH
sudo source /etc/profile //使刚才的修改立即生效

修改每个从节点的/etc/hostname,每个从节点的hostname改为hadoop-slave*。从节点的节点名称,就是主机名。

修改每个节点的/etc/hosts,将集群中所有节点的IP地址到主机名的映射添加到hosts,包含自身。

修改主节点的etc/hadoop/slaves,删除原始的localhost,将所有从节点的主机名添加进去,一行一个。

关闭每个节点的防火墙。实际运行环境不建议这么做。但在弄清楚hadoop各个程序监听的端口前,先这么做。

每个节点创建数据目录:
sudo mkdir /data //创建/data目录
sudo chmod o+wx /data //修改/data目录为其它目录可写可执行
sudo mkdir -p /data/hadoop //创建hadoop数据目录
sudo chown hadoop:hadoop /data/hadoop //修改hadoop数据目录为hadoop用户所有

每个节点创建日志目录:
sudo mkdir /var/log/hadoop
sudo mkown hadoop:hadoop /var/log/hadoop

修改每个节点的hadoop配置文件。配置文件都位于hadoop主目录的etc/hadoop下。

hadoop-env.sh:
export HADOOP_HOME=/opt/hadoop/current
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=/var/log/hadoop //大部分程序的日志目录
export JAVA_HOME=/usr/lib/jvm/default-java

mapred-env.sh:
export HADOOP_MAPRED_LOG_DIR=/var/log/hadoop //jobhistoryserver的日志目录

yarn-env.sh:
export YARN_LOG_DIR=/var/log/hadoop //yarn的日志目录

core-sites.xml:
fs.defaultFS: hdfs://hadoop-master:9000

hdfs-site.xml:
dfs.replication: 1 //数据副本数目。通常为3
dfs.namenode.name.dir: /data/hadoop/hdfs/name //namenode的数据存放目录(真实的本地目录)
dfs.datanode.data.dir: /data/hadoop/hdfs/data //datanode的数据存放目录(真实的本地目录)

mapred-site.xml:
mapreduce.framework.name: yarn

yarn-site.xml:
yarn.resourcemanager.hostname: hadoop-master
从节点yarn-site.xml:
yarn.nodemanager.aux-services: mapreduce_shuffle
yarn.nodemanager.hostname: hadoop-slave*
yarn.nodemanager.address: hadoop-slave*:19000

在默认配置中,很多主机地址为0.0.0.0,即监听所有地址。但程序也会把这个“0.0.0.0“发送给其它节点,然后其它节点向0.0.0.0发起连接……。所以,指定监听的主机地址为主机名/节点名称。
在默认配置中,部分监听端口为0,即随机取一个。但为了方便后面开防火墙端口,端口号0都改为指定的一个端口号。上面的19000就是我瞎取的。

主节点/etc/ssh/ssh_config中StrictHostKeyChecking建议设为no,免除每次连接到一个新的节点时,ssh都询问是否确认key fingerprint。

格式化名称空间:
hdfs namenode -format
开始hdfs和yarn:
sbin/start-sll.sh
开始jobhistoryserver:
sbin/mr-jobhistory-daemon.sh start historyserver

不知道有没有遗漏的地方……

Posted in Uncategorized | Tagged | Leave a comment

编译Hadoop

写在前面的话:有话题就发一帖,证明这个BLOG是活的。

我安装hadoop,是为了支撑spark。spark当前最新稳定版为1.3.0,需要的hadoop版本为2.4.*。2.4.*最新版为2.4.1。
hadoop官网下载页面已经不提供2.4.1的下载链接。但可以在apache的存档站点找到2.4.1:http://archive.apache.org/dist/hadoop/core/
下载来的hadoop的原生库是32位的,而目前主流机器架构却是64位,我们需要自己手动从源码编译hadoop。

hadoop源码说明文件为的BUILDING.txt。根据说明文件,需要like-unix系统,jdk1.6+,maven 3.0+,Findbugs 1.3.9,protobuf 2.5.0,cmake 2.6+,以及网络连接。
根据我的经验,如果不需要构建文档,Findbugs可无。文档最好有,虽然源码包里的文档只是API文档。帮助文档还得是官方包里才有。但我们可以在这里找到2.4.1的帮助文档。
jdk最好采用Oracle版。Redhat系列下载rpm包,yum localinstall即可。debian系可以下载压缩包,然后借助JavaPackage,将压缩包转为deb包(如果是jdk 1.8,可能需要wheezy-backports版的JavaPackage)。无论哪个系列的发行版,都需要更改默认java软链接到Oracle jdk。如果是debian系,可以借助update-alternatives命令完成这件工作,具体的可见JavaPackage的wiki。安装好jdk后,还需配置JAVA_HOME——我是这么想的,但我编译hadoop时,JAVA_HOME是早已配置好的。执行:
echo ‘export JAVA_HOME=……’ > /etc/profile.d/java.sh
source /etc/profile
protobuf必须2.5.0,还不认2.6.*。我机器上的protobuf刚好2.6,只有下载2.5,重新编译覆盖安装。

protobuf的github页面为https://github.com/google/protobuf
编译安装protobuf,需要先安装automake,然后照官方说明,一步步执行即可:
./autogen.sh
./configure
make
make check
sudo make install
安装protobuf2.5.0后,执行protoc –version检测版本,报:protoc: error while loading shared libraries: libprotobuf.so.8。执行下面的即可解决:
sudo ldconfig
再执行protoc –version检测版本,输出2.5.0,再下一步。

根据protobuf上吃过的亏,Findbugs既然要求1.3.9,而不是1.3.9+,还是严格采用1.3.9好。Findbugs无需安装,解压,环境变量中指定FINDBUGS_HOME。因为Findbugs只用一回,就不配置持久全局环境变量了,直接执行FINDBUGS_HOME=Findbugs路径。也可以在稍候的mvn命令前加上FINDBUGS_HOME=Findbugs路径。

按照BUILDING.TXT,执行编译命令:
mvn package -Pdist,native,docs -DskipTests -Dtar
该命令将会编译产生dist文件(怎么翻译?)、原生库、文档,跳过测试,并将最终文件tar打包
这时会陷入长久的等待……

最后maven输出BUILD SUCCESS,表示你成功了;如果不幸输出BUILD FAILED,检查人品吧。
编译成功后,找到源码目录下的hadoop-dist/target/hadoop-2.4.1.tar.gz,我们需要的就是这个压缩文件。

PS:如果只是要64位的原生库,应该只编译原生库部分就可以了。

Posted in Uncategorized | Tagged | 3 Comments

使用公钥认证免密码SSH登录的一般步骤和问题排除

一般步骤
1、ssh-keygen,一路回车,不设密码,程序便会在~/home/.ssh下生成id_rsa私钥和id_rsa.pub公钥
2、ssh-copy-id username@remotehost,程序会将步骤一生成的公钥添加到remotehost:/home/username/.ssh/authorized_keys中。如果没有remotehost:/home/username/.ssh/目录,应该手动创建

问题排除
检查remotehost的/etc/ssh/sshd_config:
AllowUsers或AllowGroups如果被定义,username应该在指定的用户列表或用户组里
DenyUsers或DenyGroups如果被定义,username应该不在……
AuthorizedKeysFile应该设为.ssh/authorized_keys
RSAAuthentication和PubkeyAuthentication应该设为yes
如果使用root登录,PermitRootLogin应该设为noyes
修改/etc/ssh/sshd_config之后别忘了重启sshd

检查本地的id_rsa.pub的内容确实被添加到remotehost:/home/username/.ssh/authorized_keys

检查remotehost的/etc/hosts
将本地机器的ip和主机名添加进去

修改remotehost:/home/username/.ssh/权限,该目录应该其它用户可读可执行
chmod o+rx -R .ssh
删除用户组读写执行权限
chmod g-rwx -R .ssh

调试
盯着remotehost的日志文件。不同的发行系列,sshd的日志路径可能不同
remotehost: sudo tail -f /var/log/secure

开启本地ssh的调试日志输出
ssh -v username@remotehost

如果sshd日志输出:“Authentication refused: bad ownership or modes for directory /home/username/.ssh”,表示.ssh目录权限不正确
如果ssh输出:“Agent admitted failure to sign using the key”,再执行ssh-add

好了,祝你成功!

参考
http://askubuntu.com/questions/30788/does-ssh-key-need-to-be-named-id-rsa

Posted in Uncategorized | Tagged | Leave a comment

免翻墙访问Dropbox、Box等境外网盘

秘诀就是使用网盘代理。比如:multcloud。
网盘代理本身不存储文件,只提供一个聚合多个网盘的工具。
multcloud还提供不同网盘间的文件传输(和复制粘贴)功能。我试用了一下,速度绝不比把文件下载下来再上传到另一网盘快。但鉴于那些网盘是不能直接访问的,就忍了。
很令我惊喜的是,multcloud居然自动为我提供中文,我的系统、浏览器都是英文的,不知multcloud是怎么识别出我是中文用户的。IP段识别?
遗憾的是multcloud尚不提供移动客户端,有没有移动网页版就不知道了。

Posted in Uncategorized | Tagged , | 3 Comments

Show一下赶京东618买的图书

Camera360_20140610111705

可惜,不少图书京东没有货、没有优惠、没来得及下手。
也很惭愧,全是计算机方面的书籍。

如果去年双11买的书也Show下就好了。

Posted in Uncategorized | 2 Comments

Origin游戏下载加速——以Battlefield 3为例

想买Battlefield 3很久,但一直舍不得花钱。只是买了促销价的Battlefield bad company 2。
这次EA居然把Battlefield 3给免费了——感谢EA,但首先感谢Value做的表率!

但几年过去,Origin在中国大陆的下载速度一直没改进,CDN也似乎只是个摆设。网上流传的hosts大法并不起作用。

碰巧,最近在读《HTTP权威指南》,想起开Wireshark抓个HTTP包分析——正好抓包时,Origin正下着Battlefield 3。于是可以看到下面一幕:
Battlefield 3

可以看到,Origin使用HTTP下载游戏数据,host为akamai.cdn.ea.com(而非网上hosts大法提的ams.akamai.cdn.ea.com),方法为GET,GET目标是一个ZIP压缩文件,每次都指定一个文件范围。于是我们就可以得到一个直接下载链接(含后面的认证参数):
http://akamai.cdn.ea.com/eamaster/s/p/eagames/bf3/bf3_patch8_ww_20130227.zip?sauth=1401509472_d7c14785429d6cca92d09ec8352b99c5
用迅雷下下来,得到完整的zip文件,解压覆盖到Origin GamesBattlefield 3。再启动Origin,就可以看到我的游戏中Battlefield 3的状态由“正在下载”改为“正在安装”。

安装成功后,别忘了检查更新——其实就是验证文件。

Posted in Uncategorized | Tagged | Leave a comment

双显卡机器安装Debian Wheezy运行Steam游戏

我机器是Dell inspiron 14r 7420,显卡为Intel + Nvidia。

想要在Debian上运行Steam游戏,会面对两大难题:
硬件支持,特别是双显卡切换的支持。
游戏支持。

真不幸,同时把Linux两大硬伤都给碰上了。
双显卡切换的问题:可以用Bumblebee解决,虽然不是很稳定,但有个解决方案总比没个好。另外,Nvidia官方对Linux双显卡切换的支持已经在路上了,估计不会很远,也不会很近。
客户端和游戏支持的问题:虽然Steam官方支持大家安装Ubuntu系统运行Steam,虽然Steam还推出了基于Debian sid的SteamOS,虽然Steam还允许开发者自行给Steam for Linux客户端打包,但就是没有官方的Steam for Debian wheezy客户端——无论Steam官方,还是Debian官方。还好,Steam支持开发者自行打包Steam for Linux客户端,让我们有非官方的Steam-Installer-for-Wheezy。现在,这个项目已经变得实际可用!

第一步:安装Debian,之后就该立即安装Bumblebee。照着Debian官方wiki指示安装即可。
安装Bumblebee后,测试下Bumblebee是否可用。执行:optirun glxgears -info,如果执行出错,按照官方说明排错;如果没错,同时执行lspci | grep VGA,查看独显是否由ff状态改为非ff状态。
独显激活时:
wencan@debian2014:~$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GT 640M] (rev a1)

独显未激活时:
wencan@debian2014:~$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GT 640M] (rev ff)

optirun glxgears -info输出的FPS值可能并不如你想象的那般大,参见这里——重点是把独显启用。
如果不是双显卡,跳过这一步。

第二步:安装Steam-Installer-for-Wheezy。先执行steam-debian-depends.sh再安装steam-debian-*all.deb包。在控制台试运行steam-debian,如果程序报错或意外退出,可以在控制台得到错误信息。
如果报:/home/nomad/.local/share/Steam/steam.sh: line 755: 4437 Segmentation fault $STEAM_DEBUGGER “$STEAMROOT/$PLATFORM/$STEAMEXE” “$@”之类的错误,尝试改为运行LC_ALL=C steam-debian,如果该问题解决,应该考虑修改/usr/bin/steam-debian,在命令前加上LC_ALL=C。

第三步:安装并运行Steam上的游戏——暂时不通过Bumblebee运行。
如果报:”Required OpenGL extension “GL_EXT_texture_compression_s3tc” is not supported. Please install S3TC texture support.”之类的错误,安装libtxc-dxtn-s2tc0:i386。
如果游戏提示“Please install ‘en_US.UTF-8’ locale”,且游戏中中一些中文字不能显示——比如TF2服务器列表中的中文字,执行 dpkg-reconfigure locales,选择en_US.UTF-8注册。

第四步:修改游戏的启动参数。将启动参数设为:primusrun %command%,通过primusrun来运行游戏。

第五步:优化。
Bumblebee 使用你的 Optimus NVIDIA 显卡来渲染一个配置了 VirtualGL 的不可见的 X 服务器,并且将结果传输到你当前的 X 服务器上。传输之前将压缩侦,这可以节省带宽并且能够用于加速 bumblebee 的优化。
压缩方法会影响 GPU性能和GPU使用,压缩方法(比如 jpeg)会最大限度的使用 CPU,并且尽可能少的使用 GPU;非压缩的方法最大限度的使用 GPU,而尽可能少的使用 CPU。

通过指定bumblebee配置中的压缩方法,来影响渲染的性能。
压缩方法如有: jpeg, rgb, yuv;非压缩方法有: proxy, xv。默认是proxy。
通过”optirun -c 方法名 glxgears -info”来观察各个方法下的渲染性能。结果表明使用jpeg,比使用默认的proxy,PFS值高出一倍还要多。
修改/etc/bumblebee/bumblebee.conf中optirun段VGLTransport为jpeg,重启bumblebeed服务。
现在,Debian上游戏性能,应该与Windows上的相差不大,也许还要高出些。

如果以上步骤和方法不能解决你的问题,建议你使用Ubuntu+Gnome。如果你向Steam官方客服反馈你的问题,估计你会得到一样的答案,因为Steam客服就是这么回复我的。
另外,你还可以等待相关程序更新,和相关技术进步。时间已经证明,后一种方法总是能解决我们的问题……

参考:
https://wiki.debian.org/Bumblebee
https://wiki.archlinux.org/index.php/Bumblebee_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29
https://github.com/Bumblebee-Project/Bumblebee/wiki/FAQ
https://github.com/amonakov/primus#faq
https://support.steampowered.com/kb_article.php?ref=6316-GJKC-7437
https://github.com/GhostSquad57/Steam-Installer-for-Wheezy/issues/27

Posted in Uncategorized | Tagged , , , | Leave a comment