<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Erlang非业余研究 &#187; kernel</title>
	<atom:link href="http://blog.yufeng.info/archives/tag/kernel/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.yufeng.info</link>
	<description>Erlang系统深度探索和应用</description>
	<lastBuildDate>Tue, 17 Jan 2012 06:05:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Erlang集群未公开特性：IP网段限制</title>
		<link>http://blog.yufeng.info/archives/1575</link>
		<comments>http://blog.yufeng.info/archives/1575#comments</comments>
		<pubDate>Sat, 01 Oct 2011 02:35:06 +0000</pubDate>
		<dc:creator>Yu Feng</dc:creator>
				<category><![CDATA[Erlang探索]]></category>
		<category><![CDATA[checkip]]></category>
		<category><![CDATA[inet_tcp_dist]]></category>
		<category><![CDATA[kernel]]></category>

		<guid isPermaLink="false">http://blog.yufeng.info/?p=1575</guid>
		<description><![CDATA[原创文章，转载请注明： 转载自Erlang非业余研究 本文链接地址: Erlang集群未公开特性：IP网段限制 Erlang集群二个节点之间的通讯是通过一个tcp长连接进行的，而且是全联通的，一旦cookie论证通过了，任何一个节点就获得全集群的访问权，可以参考Erlang分布的核心技术浅析 。erlang的这个授权模式特定搞的这么简单，但是在实际使用中还是有安全性的问题。我们退而求其次，来个IP网段限制，这个功能Erlang是有的只是没有文档化。 我们来看下代码: inet_tcp_dist.erl:L157 这个功能可以用-kernel check_ip true打开。 接着我们来实验下，在其中一个终端开： 在另外一个终端开： 通过跟踪我们确诊这个功能被打开了，而且在作用。如果没通过IP限制，SASL下会得到如下提示： ** Connection attempt from disallowed IP ~w **。 祝大家玩得开心，集群得安全！ Post Footer automatically generated by wp-posturl plugin for wordpress.]]></description>
			<content:encoded><![CDATA[<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://blog.yufeng.info/">Erlang非业余研究</a></p>
<p><strong>本文链接地址:</strong> <a href="http://blog.yufeng.info/archives/1575">Erlang集群未公开特性：IP网段限制</a></p>
</div>
<p>Erlang集群二个节点之间的通讯是通过一个tcp长连接进行的，而且是全联通的，一旦cookie论证通过了，任何一个节点就获得全集群的访问权，可以参考<a href="http://www.iteye.com/topic/288235">Erlang分布的核心技术浅析</a><br />
。erlang的这个授权模式特定搞的这么简单，但是在实际使用中还是有安全性的问题。我们退而求其次，来个IP网段限制，这个功能Erlang是有的只是没有文档化。<br />
<span id="more-1575"></span><br />
我们来看下代码:<br />
inet_tcp_dist.erl:L157</p>
<pre class="brush: erlang; title: ; notranslate">
do_accept(Kernel, AcceptPid, Socket, MyNode, Allowed, SetupTime) -&gt;
    receive
        {AcceptPid, controller} -&gt;
            Timer = dist_util:start_timer(SetupTime),
            case check_ip(Socket) of
                true -&gt;
                   ...
                   dist_util:handshake_other_started(HSData);
                {false,IP} -&gt;
                    error_msg(&quot;** Connection attempt from &quot;
                              &quot;disallowed IP ~w ** ~n&quot;, [IP]),
                    ?shutdown(no_node)
            end
    end.

%% ------------------------------------------------------------
check_ip(Socket) -&gt;
    case application:get_env(check_ip) of
        {ok, true} -&gt;
            case get_ifs(Socket) of
                {ok, IFs, IP} -&gt;
                    check_ip(IFs, IP);
                _ -&gt;
                    ?shutdown(no_node)
            end;
        _ -&gt;
            true
    end.

get_ifs(Socket) -&gt;
    case inet:peername(Socket) of
        {ok, {IP, _}} -&gt;
            case inet:getif(Socket) of
                {ok, IFs} -&gt; {ok, IFs, IP};
                Error     -&gt; Error
            end;
        Error -&gt;
            Error
    end.
check_ip([{OwnIP, _, Netmask}|IFs], PeerIP) -&gt;
    case {mask(Netmask, PeerIP), mask(Netmask, OwnIP)} of
        {M, M} -&gt; true;
        _      -&gt; check_ip(IFs, PeerIP)
    end;
check_ip([], PeerIP) -&gt;
    {false, PeerIP}.

mask({M1,M2,M3,M4}, {IP1,IP2,IP3,IP4}) -&gt;
    {M1 band IP1,
     M2 band IP2,
     M3 band IP3,
     M4 band IP4}.
</pre>
<p>这个功能可以用-kernel check_ip true打开。<br />
接着我们来实验下，在其中一个终端开：</p>
<pre class="brush: bash; title: ; notranslate">
$ erl -kernel check_ip true -name x@127.0.0.1
Erlang R14B04 (erts-5.8.5) 1 [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.5  (abort with ^G)
(x@127.0.0.1)1&gt; dbg:tracer().
{ok,&lt;0.39.0&gt;}
(x@127.0.0.1)2&gt; dbg:p(all,c).
{ok,[{matched,'x@127.0.0.1',32}]}
(x@127.0.0.1)3&gt; dbg:tpl(inet_tcp_dist,check_ip, [{'_', [], [{return_trace}]}]).
{ok,[{matched,'x@127.0.0.1',2},{saved,1}]}
(x@127.0.0.1)4&gt; dbg:tpl(inet_tcp_dist,check_ip, [{'_', [], [{return_trace}]}])(&lt;0.44.0&gt;) call inet_tcp_dist:check_ip(#Port&lt;0.623&gt;)
(&lt;0.44.0&gt;) call inet_tcp_dist:check_ip([{{172,16,64,1},{172,16,64,255},{255,255,255,0}},
 {{172,16,213,1},{172,16,213,255},{255,255,255,0}},
 {{192,168,1,3},{192,168,1,255},{255,255,255,0}},
 {{127,0,0,1},undefined,{255,0,0,0}}],{127,0,0,1})
(&lt;0.44.0&gt;) call inet_tcp_dist:check_ip([{{172,16,213,1},{172,16,213,255},{255,255,255,0}},
 {{192,168,1,3},{192,168,1,255},{255,255,255,0}},
 {{127,0,0,1},undefined,{255,0,0,0}}],{127,0,0,1})
(&lt;0.44.0&gt;) call inet_tcp_dist:check_ip([{{192,168,1,3},{192,168,1,255},{255,255,255,0}},
 {{127,0,0,1},undefined,{255,0,0,0}}],{127,0,0,1})
(&lt;0.44.0&gt;) call inet_tcp_dist:check_ip([{{127,0,0,1},undefined,{255,0,0,0}}],{127,0,0,1})
(&lt;0.44.0&gt;) returned from inet_tcp_dist:check_ip/2 -&gt; true
(&lt;0.44.0&gt;) returned from inet_tcp_dist:check_ip/2 -&gt; true
(&lt;0.44.0&gt;) returned from inet_tcp_dist:check_ip/2 -&gt; true
(&lt;0.44.0&gt;) returned from inet_tcp_dist:check_ip/2 -&gt; true
(&lt;0.44.0&gt;) returned from inet_tcp_dist:check_ip/1 -&gt; true
</pre>
<p>在另外一个终端开：</p>
<pre class="brush: bash; title: ; notranslate">
$ erl -name y@127.0.0.1
Erlang R14B04 (erts-5.8.5) 1 [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.5  (abort with ^G)
(y@127.0.0.1)1&gt; net_adm:ping('x@127.0.0.1').
pong
(y@127.0.0.1)2&gt;
</pre>
<p>通过跟踪我们确诊这个功能被打开了，而且在作用。如果没通过IP限制，SASL下会得到如下提示：<br />
** Connection attempt from disallowed IP ~w **。</p>
<p>祝大家玩得开心，集群得安全！</p>
<div style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">
<p>Post Footer automatically generated by <a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl plugin</a> for wordpress.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.yufeng.info/archives/1575/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>如何在TILEPro64多核心板卡上编译和运行Erlang</title>
		<link>http://blog.yufeng.info/archives/791</link>
		<comments>http://blog.yufeng.info/archives/791#comments</comments>
		<pubDate>Tue, 02 Nov 2010 02:25:35 +0000</pubDate>
		<dc:creator>Yu Feng</dc:creator>
				<category><![CDATA[Erlang探索]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[工具介绍]]></category>
		<category><![CDATA[64]]></category>
		<category><![CDATA[compile]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[otp]]></category>
		<category><![CDATA[Tilera]]></category>
		<category><![CDATA[并发，并行]]></category>

		<guid isPermaLink="false">http://blog.yufeng.info/?p=791</guid>
		<description><![CDATA[原创文章，转载请注明： 转载自Erlang非业余研究 本文链接地址: 如何在TILEPro64多核心板卡上编译和运行Erlang 参考文章： 1. https://groups.google.com/group/erlang-programming/msg/2d61b1083a10a7b6 2. http://erlang.2086793.n4.nabble.com/How-to-Cross-compile-Erlang-OTP-R13B04-for-TileraPro64-td2119304.html 美国Tilera公司的众核服务器，单颗内核包含64颗CPU。硬件架构图： 卡长这样的： Erlang已经可以在这款CPU上成功运行，我们可以参考Ulf Wiger在Multicore ☺ Message-passing Concurrency 文档中关于Erlang在Tilera上的性能图. Erlang系统前2年就开始正式支持Tilera，一直用这个CPU来调整他的调度器，所以性能和基础的编译运行支持都很到位。 Linux内核2.6.36起就开始支持Tilera的CPU架构了，看起来前途不错。 最近 上海泛腾电子科技 开始在国内销售 Tilera机器， 我公司也得到一台样机，使得我有机会把玩下这个高科技！ 该测试机是PCI-e的形式，是单板机，直接安装在PC机或者是服务器里,好处是可以通过主机的VGA口接显示器直接调试。当然也可以作为智能网卡来使用。构成一个与Host的异构结构，通过PCI-e总线进行通讯。 还需要相应的配套SDK: 目前有TileraMDE-2.1.2.112814 和 TileraMDE-3.0.alpha3.116173 二个版本, 来负责和板卡的通信。 推荐用2.0的，好像不容易出问题。 废话少说，让我们开始享受64核心快乐旅程吧！ 好吧到此为止，我们在目标机器上/tmp/otp目录下有个完整的erlang系统。 我们开个console连接到板载的linux系统去： Bingo! 我们顺利的跑了数学计算，同时绑定调度器到CPU core上去了。接下来就可以按照平常那样进行Erlang并发编程了。 祝玩的开心！ Post Footer automatically generated by wp-posturl plugin for wordpress.]]></description>
			<content:encoded><![CDATA[<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://blog.yufeng.info/">Erlang非业余研究</a></p>
<p><strong>本文链接地址:</strong> <a href="http://blog.yufeng.info/archives/791">如何在TILEPro64多核心板卡上编译和运行Erlang</a></p>
</div>
<p>参考文章：<br />
1. <a href="https://groups.google.com/group/erlang-programming/msg/2d61b1083a10a7b6">https://groups.google.com/group/erlang-programming/msg/2d61b1083a10a7b6</a></p>
<p>2. <a href="http://erlang.2086793.n4.nabble.com/How-to-Cross-compile-Erlang-OTP-R13B04-for-TileraPro64-td2119304.html">http://erlang.2086793.n4.nabble.com/How-to-Cross-compile-Erlang-OTP-R13B04-for-TileraPro64-td2119304.html</a></p>
<p>美国Tilera公司的众核服务器，单颗内核包含64颗CPU。硬件架构图：<br />
<a href="http://blog.yufeng.info/wp-content/uploads/2010/11/Tile_Processor_Hardware_Architecture.jpg"><img src="http://blog.yufeng.info/wp-content/uploads/2010/11/Tile_Processor_Hardware_Architecture.jpg" alt="" title="Tile_Processor_Hardware_Architecture" width="792" height="439" class="alignnone size-full wp-image-806" /></a><br />
卡长这样的：<br />
<a href="http://blog.yufeng.info/wp-content/uploads/2010/11/tilera_board.jpg"><img src="http://blog.yufeng.info/wp-content/uploads/2010/11/tilera_board.jpg" alt="" title="tilera_board" width="208" height="148" class="alignnone size-full wp-image-820" /></a><br />
Erlang已经可以在这款CPU上成功运行，我们可以参考Ulf Wiger在Multicore ☺ Message-passing Concurrency 文档中关于Erlang在Tilera上的性能图.<br />
<a href="http://blog.yufeng.info/wp-content/uploads/2010/11/multi_core_message_passing_concurrency_erlang.jpg"><img src="http://blog.yufeng.info/wp-content/uploads/2010/11/multi_core_message_passing_concurrency_erlang.jpg" alt="" title="multi_core_message_passing_concurrency_erlang" width="627" height="405" class="alignnone size-full wp-image-798" /></a></p>
<p>Erlang系统前2年就开始正式支持Tilera，一直用这个CPU来调整他的调度器，所以性能和基础的编译运行支持都很到位。</p>
<p>Linux内核2.6.36起就开始支持Tilera的CPU架构了，看起来前途不错。</p>
<p>最近 上海泛腾电子科技 开始在国内销售 Tilera机器， 我公司也得到一台样机，使得我有机会把玩下这个高科技！</p>
<p>该测试机是PCI-e的形式，是单板机，直接安装在PC机或者是服务器里,好处是可以通过主机的VGA口接显示器直接调试。当然也可以作为智能网卡来使用。构成一个与Host的异构结构，通过PCI-e总线进行通讯。</p>
<p>还需要相应的配套SDK: 目前有TileraMDE-2.1.2.112814 和 TileraMDE-3.0.alpha3.116173 二个版本, 来负责和板卡的通信。 推荐用2.0的，好像不容易出问题。</p>
<p>废话少说，让我们开始享受64核心快乐旅程吧！<br />
<span id="more-791"></span></p>
<pre class="brush: bash; title: ; notranslate">
# wget http://www.erlang.org/download/otp_src_R13B03.tar.gz  %%R13B04后otp_build变了好像有点问题，编译不过去。
# tar xzf otp_src_R13B03.tar.gz
# cd otp_src_R13B03
%%由于R13B03有个小小的bug会导致segment fault,我们需要对erl_misc_utils.c打个patch,以下是要打patch的地方:
# diff -Nau otp_src_R13B04/erts/lib_src/common/erl_misc_utils.c{~,}
--- otp_src_R13B04/erts/lib_src/common/erl_misc_utils.c~
2009-11-20 14:32:23.000000000 +0100
+++ otp_src_R13B04/erts/lib_src/common/erl_misc_utils.c 2010-03-29
15:53:28.000000000 +0200
@@ -373,8 +373,8 @@
        return 0;
     memcpy((void *) topology,
           (void *) cpuinfo-&gt;topology,
-          cpuinfo-&gt;configured*sizeof(erts_cpu_topology_t));
-    return cpuinfo-&gt;configured;
+          cpuinfo-&gt;topology_size*sizeof(erts_cpu_topology_t));
+    return cpuinfo-&gt;topology_size;
 }
%%源码算是准备完毕了 

%%开始编译前的环境准备
# export ERL_TOP=`pwd`
# eval `./otp_build env_cross $ERL_TOP/xcomp/erl-xcomp-TileraMDE2.0-tilepro.conf`
# export TILERA_ROOT=/root/TileraMDE-2.1.2.112814/tilepro/  %%这个最好用2.x版本的
# export PATH=$TILERA_ROOT/bin:$PATH
# tile-monitor --pci -- uname -a  %%验证板卡确实可用
Linux localhost 2.6.26.7-MDE-2.1.2.112814 #1 SMP Wed Sep 1 00:05:06 EDT 2010 tile GNU/Linux

%%开始交叉编译
# ./otp_build configure
# touch lib/crypto/SKIP &amp;&amp;  touch lib/ssl/SKIP &amp;&amp; touch lib/ssh/SKIP   %%这几个模块用到了openssl, 编译不过去，忽略掉
# ./otp_build boot -a
# ./otp_build release -a /tmp/otp %%安装到/tmp/otp目录去

%%如果一切顺利，到这时候就编译完毕了。

%%我们开始收获成果。

# cd /tmp/otp
# ./Install `pwd`
#  tile-monitor --pci --here -- bin/erl  %%没出错的话，就说明我们成功了。

%%当然我们可以把otp系统上载到板卡去，方便日后使用
# $TILERA_ROOT/bin/tile-monitor --pci  --upload /tmp/otp /tmp/otp --quit   %% 放在板卡的/tmp/otp目录下

%%我们还可以定义个命令别名，方便我们执行命令
# tile_erl=&quot;$TILERA_ROOT/bin/tile-monitor --pci --resume --tunnel 2023 23  --env HOME=/tmp  --tiles - all ^0 - -- /tmp/otp/bin/erl&quot;
# $tile_erl +sct L10-18,1-9,19-55,57,58,61c1-55,57,58,61 +sbt db   -noshell +S 58 -s init stop
</pre>
<p>好吧到此为止，我们在目标机器上/tmp/otp目录下有个完整的erlang系统。</p>
<p>我们开个console连接到板载的linux系统去：</p>
<pre class="brush: bash; title: ; notranslate">
[root@client otp_src_R13B03]# /root/TileraMDE-2.1.2.112814/tilepro/bin/tile-console
tile-console: Assuming '--pci'.
Connecting to /dev/ttyS0, speed 115200
 Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------
# uname -a
Linux localhost 2.6.26.7-MDE-2.1.2.112814 #1 SMP Wed Sep 1 00:05:06 EDT 2010 tile GNU/Linux

# cd /tmp/otp
%%我们跑个erlang程序&lt;em&gt;64核心并行&lt;/em&gt;进行数学计算
%% 代码在这里下载 http://shootout.alioth.debian.org/u32/program.php?test=spectralnorm&amp;lang=hipe&amp;id=2
#cat &gt; spectralnorm.erl
%   The Computer Language Benchmarks Game
%   http://shootout.alioth.debian.org/
%   contributed by Fredrik Svahn

-module(spectralnorm).
-export([main/1]).
-compile( [ inline, { inline_size, 1000 } ] ).

main([Arg]) -&gt;
    register(server, self()),
    N = list_to_integer(Arg),
    {U, V} = power_method(N, 10, erlang:make_tuple(N, 1), []),
    io:format(&quot;~.9f\n&quot;, [ eigen(N, U, V, 0, 0) ]),
    erlang:halt(0).

% eigenvalue of V
eigen(0, _, _, VBV, VV) when VV /= 0 -&gt; math:sqrt(VBV / VV);

eigen(I, U, V, VBV, VV) when I /= 0 -&gt;
    VI = element(I, V),
    eigen(I-1, U, V, VBV + element(I, U)*VI, VV + VI*VI).

% 2I steps of the power method
power_method(_, 0, A, B) -&gt; {A, B};
power_method(N, I, A, _B) -&gt;
    V = atav(N, A),
    U = atav(N, V),
    power_method(N, I-1, U, V).

% return element i,j of infinite matrix A
a(II,JJ) -&gt; 1/((II+JJ-2)*(II-1+JJ)/2+II).

% multiply vector v by matrix A
av(N, V) -&gt; pmap(N, fun(Begin, End) -&gt; av(N, Begin, End, V) end).

av(N, Begin, End, V) -&gt; server ! { self(), [ avloop(N, I, V, 0.0) || I &lt;- lists:seq(Begin, End) ]}.

avloop(0, _, _, X) -&gt;  X;
avloop(J, I, V, X) -&gt;  avloop(J-1, I, V, X + a(I, J)*element(J, V) ).

% multiply vector v by matrix A transposed
atv(N, V) -&gt; pmap(N, fun(Begin, End)-&gt; atv(N, Begin, End, V) end).

atv(N, Begin, End, V) -&gt; server ! { self(), [ atvloop(N, I, V, 0.0) || I &lt;- lists:seq(Begin, End) ]}.

atvloop(0, _, _, X) -&gt; X;
atvloop(J, I, V, X) -&gt; atvloop(J-1, I, V, X + a(J, I)*element(J, V) ).

% multiply vector v by matrix A and then by matrix A transposed
atav(N, V) -&gt; atv(N, av(N, V)).

%Helper function for multicore
pmap(N, F) -&gt;
    Chunks = chunks(0, erlang:system_info(logical_processors), N, []),
    Pids = [spawn(fun()-&gt; F(Begin, End) end) || {Begin, End} &lt;- Chunks],
    Res = [ receive {Pid, X} -&gt; X end || Pid &lt;- Pids],
    list_to_tuple(lists:flatten(Res)).

chunks(I, P, N, A) when I == P-1 -&gt; lists:reverse([{I*(N div P)+1, N} | A ]);
chunks(I, P, N, A) -&gt; chunks(I+1, P, N, [{ I*(N div P)+1, (I+1)*(N div P)} | A ]).

CTRL+D

# bin/erlc spectralnorm.erl
# time bin/erl -noshell -run spectralnorm  main 500  -s init stop
1.274224116
real    0m 16.90s
user    1m 16.07s
sys     0m 0.79s
# bin/erl  +sct L10-18,1-9,19-55,57,58,61c1-55,57,58,61 +sbt db   -noshell +S 58 -eval 'io:format(&quot;schedulers: ~p~n&quot;1)' -s init stop
schedulers: 58
</pre>
<p>Bingo! 我们顺利的跑了数学计算，同时绑定调度器到CPU core上去了。接下来就可以按照平常那样进行Erlang并发编程了。</p>
<p>祝玩的开心！</p>
<div style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">
<p>Post Footer automatically generated by <a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl plugin</a> for wordpress.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.yufeng.info/archives/791/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>用systemtap来修改下linux内核变量的值</title>
		<link>http://blog.yufeng.info/archives/102</link>
		<comments>http://blog.yufeng.info/archives/102#comments</comments>
		<pubDate>Thu, 29 Oct 2009 11:07:20 +0000</pubDate>
		<dc:creator>Yu Feng</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[调优]]></category>
		<category><![CDATA[-g]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[global]]></category>
		<category><![CDATA[guru]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[stap]]></category>
		<category><![CDATA[systemtap]]></category>

		<guid isPermaLink="false">http://blog.yufeng.info/?p=102</guid>
		<description><![CDATA[原创文章，转载请注明： 转载自Erlang非业余研究 本文链接地址: 用systemtap来修改下linux内核变量的值 我们在探索linux内核的时候，经常需要调整下变量的值，看它对系统的影响。如果这个值没有透过/proc来修改的话，那只能编译内核。这个步骤是非常繁琐的。现在我们有systemtap这个利器来帮忙了。 演示如下： 我们通过修改过 extern int sysctl_tcp_fin_timeout;的值来达到目的。是因为这个值是proc导出的 我们好验证是否成功。 这个时候 stap在运行， 只是还没有触发do_tcp_setsockopt. 现在我们来触发 Ok,这时候回头可以看到stap打出来以下： sysctl_tcp_fin_timeout = 18000 我们来验证下： OK,成功。 Tips： 1. stap对全局变量的写需要-g guru模式。 2. 全局变量必须在一个单元内的函数里面才可以修改， 而且必须是在内核上下文。 PS. 这样写的话会更好,因为这个变量是单元可见的,这个模块里面的任何函数被触发都可以看到这个变量. 因为这是tcp的核心模块随时都会被出发的,免除了以上的麻烦! Post Footer automatically generated by wp-posturl plugin for wordpress.]]></description>
			<content:encoded><![CDATA[<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://blog.yufeng.info/">Erlang非业余研究</a></p>
<p><strong>本文链接地址:</strong> <a href="http://blog.yufeng.info/archives/102">用systemtap来修改下linux内核变量的值</a></p>
</div>
<p>我们在探索linux内核的时候，经常需要调整下变量的值，看它对系统的影响。如果这个值没有透过/proc来修改的话，那只能编译内核。这个步骤是非常繁琐的。现在我们有systemtap这个利器来帮忙了。</p>
<p>演示如下：<br />
我们通过修改过<br />
extern int sysctl_tcp_fin_timeout;的值来达到目的。是因为这个值是proc导出的 我们好验证是否成功。</p>
<pre class="brush: bash; title: ; notranslate">
root@localhost ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
15000
[root@localhost ~]# cat test.stp
probe begin
{
        printf(&quot;ready go\n&quot;);
}

probe kernel.function(&quot;do_tcp_setsockopt&quot;)
{
        $sysctl_tcp_fin_timeout = $1
        printf(&quot;sysctl_tcp_fin_timeout = %d\n&quot;, $sysctl_tcp_fin_timeout);
        exit()
}

[root@localhost ~]# stap -g test.stp 18000
ready go
</pre>
<p>这个时候 stap在运行， 只是还没有触发do_tcp_setsockopt.<br />
现在我们来触发</p>
<pre class="brush: bash; title: ; notranslate">
[root@localhost ~]# erl
Erlang R13B02 (erts-5.7.3) 1 [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.3  (abort with ^G)
1&gt; {ok, LSock} = gen_tcp:listen(0, []).
{ok,#Port&lt;0.437&gt;}
2&gt;
2&gt; inet:setopts(LSock, [{nodelay,true}]).
ok
3&gt;
</pre>
<p>Ok,这时候回头可以看到stap打出来以下：<br />
sysctl_tcp_fin_timeout = 18000</p>
<p>我们来验证下：</p>
<pre class="brush: bash; title: ; notranslate">
root@localhost ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
18000
</pre>
<p>OK,成功。</p>
<p>Tips：<br />
1. stap对全局变量的写需要-g guru模式。<br />
2. 全局变量必须在一个单元内的函数里面才可以修改， 而且必须是在内核上下文。 </p>
<p>PS. 这样写的话会更好,因为这个变量是单元可见的,这个模块里面的任何函数被触发都可以看到这个变量. 因为这是tcp的核心模块随时都会被出发的,免除了以上的麻烦!</p>
<pre class="brush: bash; title: ; notranslate">
$ cat test.stp
probe begin
{
        printf(&quot;ready go\n&quot;);
}
probe kernel.function(&quot;*@net/ipv4/tcp.c&quot;)
//probe kernel.function(&quot;do_tcp_setsockopt&quot;)
{
        $sysctl_tcp_fin_timeout = $1
        printf(&quot;sysctl_tcp_fin_timeout = %d\n&quot;, $sysctl_tcp_fin_timeout);
        exit()
}
</pre>
<div style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">
<p>Post Footer automatically generated by <a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl plugin</a> for wordpress.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.yufeng.info/archives/102/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

