me: 请教您一问题:目录下有一个有内容的message文件,当我在touch message时,没任何提示,直接回车。当我打开message的时候,发现还是原来的文件,那我touch的文件到哪里去了?
XX: touch了message了呀
touch不是清空文件呀
你是不是想把message文件清空?
me: 对,我的意思是要新建一个文件
不过跟message重名而已
我是想用新的文件覆盖旧的文件
XX: touch的意思是: 如果有文件存在, 只是更新一下文件的时间,
当文件不存在时, 才会创建文件
me: 只是更新时间啊!
XX: 嗯。清空的话, 可以使用: echo "" > message
>才会写文件
me: 对啊,我刚才看了一下,真的只更新了时间
me: 不是这样的,我是不明白如果一个同名的文件覆盖同名的文件是直接删除文件呢还是文件还是存在的?
是直接删除旧的文件还是旧文件还存在,只是不可见?
XX: 重新写指定的文件。
写完后, 内容就变化 了
me: 那么说,新的文件会在旧文件里面写内容,不过旧的文件内容依然存在,是不是这样?
me: 我懂了,覆盖只是将文件里面的数据给更新,而旧文件里面的内容将会被新文件给替换了
XX's new status message - I'm not here right now 4:53 PM
me: 如果新文件里面没有内容,覆盖后message文件里面也是没内容的
这是CP的结果
XX: 就是open和write函数。
me: MV的结果就不同了。
XX: 也是一样的。 如果是同名的意义是一样的。
me: 不一样的,MV后I节点改变了
CP的时候I节点却没有变
MV是不是将旧文件删除了然后将新文件放进去呢?
XX: 不是。
me: 是的,我在FreeBSD里面测试过了,的确改变了!
me: MV的结果就是将文件所在的block移到新的目录。
XX: 嗯。 是不同, 但是也不是你说的“block移到新目录“
me: 我是觉得一个文件就是一个存放数据的块而已,而这个块就是由i节点就是这个块的门牌而已,那这个i节点移到新的地方,那里面的数据块也会移过去
这是我个人理解
me: 要么就是message所在的文件夹修改message的节点,使其指到新的数据块中
XX: 这里有两种情况, :两个文件是否在同一分区
每个分区有自己的inode列表
[jessinio@niowork tmp]$ ls -i show
24969635 show
[jessinio@niowork tmp]$ ls -i do.sh
24969340 do.sh
[jessinio@niowork tmp]$ mv show do.sh
[jessinio@niowork tmp]$ ls -i do.sh
24969635 do.sh
这个例子是同一个分区的, 只是修改一个入口inode
[jessinio@niowork tmp]$ ls -i /boot/newfile
6025 /boot/newfile
[jessinio@niowork tmp]$ ls -i do.sh
24969635 do.sh
[jessinio@niowork tmp]$ sudo mv /boot/newfile do.sh
[jessinio@niowork tmp]$ ls -i do.sh
24969282 do.sh
这个例子是不同分区的,
有一个新的inode
XX: 不同分区的情况下, 才是把旧的文件删除。
你说到了一种。
不错。
有进步
使用strace这个命令可以清楚地看出mv命令都在做了些什么事情。
不知道freeBSD下使用什么工具可以知道mv到底干了些什么事。
XX's new status message - 又一次讨论问题讨到这么晚~~~~ 5:18 PM
me: FreeBSD里面也有strace这个命令
XX: 嗯。那就行
me: 不过要安装才可以的
XX: 这个工具应该是GPL的, 所以需要安装。
me: 照你这么说就是在不同分区中,mv一次就是将数据块稳到了被覆盖的文件的分区那边对啊?
XX: 数据块是“移动"不了的。
只有重新把数据都读出来, 写到新的文件上, 然后再把旧的文件删除
me: 原来这样!
是作删除然后新建
XX: 你看看下面的信息:
当我运行: strace mv /boot/newfile do.sh
mv命令首先rename("/boot/newfile", "do.sh") = -1 EXDEV (Invalid cross-device link)
但是出错了, 因为是在不同的分区
然后unlink("do.sh")
删除文件后,
open("do.sh", O_WRONLY|O_CREAT, 0100644) = 4
me: 那么在同一分区内进行MV覆盖,旧的文件是不是被删除了呢?
XX: 你说的“旧的文件“是指哪个?
mv old new
old这个文件当然是要删除的了
me: 嗯!
2010年10月28日
覆盖的不同方式
下面是我和一朋友的对话,里面具体说是CP和MV不同的覆盖方式。
2010年9月25日
rails的表示方式
app/view/name.html.erb -- 中文叫做视图,其实只作显示的一堆页面罢了。它们只显示app/controller/name_controller.rb里面函数的输出信息。name_controller.rb也就一堆函数罢了,只是把结果传给app/view/name.html.erb让它来显示,它们不可以做出任何显示的内容。它们俩是对应的,两者缺一不可。文件名也一定要对应起来!
它们的关系是: controller -----------> view -----------> 浏览器
而解析过程就是:
---------->config/routes.rb ----------->app/controller/name_controller.rb --------------------------> app/view/name.html.erb,
当app/view/name.html.erb没有内容时,浏览器会报下面的错误信息的:
从错误信息上面看得出,原来app/views/里面的东西都只一些模板,而内容呢就是app/controller/name_controller.rb里面的东西。这样可以拿一部手机去比喻它们间的关系:我手机上那几寸大的屏幕就是app/view/name.html.erb, 而手机后面的芯片组就是app/controller/nmae_controller!
Controller前面还有一层,那就是模型层。模型层是代码与数据库之间的那道门。除非通过模型,否则应用程序无法从数据库获得任何东西,当然也无法把任何东西写回数据库。
它们的关系是: controller -----------> view -----------> 浏览器
而解析过程就是:
---------->config/routes.rb ----------->app/controller/name_controller.rb --------------------------> app/view/name.html.erb,
当app/view/name.html.erb没有内容时,浏览器会报下面的错误信息的:
Missing template main/name with {:locale=>[:en, :en], :formats=>[:html], :handlers=>[:rxml, :builder, :erb, :rjs, :rhtml]} in view paths "/data/photo/app/views"
从错误信息上面看得出,原来app/views/里面的东西都只一些模板,而内容呢就是app/controller/name_controller.rb里面的东西。这样可以拿一部手机去比喻它们间的关系:我手机上那几寸大的屏幕就是app/view/name.html.erb, 而手机后面的芯片组就是app/controller/nmae_controller!
Controller前面还有一层,那就是模型层。模型层是代码与数据库之间的那道门。除非通过模型,否则应用程序无法从数据库获得任何东西,当然也无法把任何东西写回数据库。
2010年9月20日
2010年9月13日
lighttpd与nginx的性能比较
以下的测试是使用http_load来进行测试。
http_load的一些参数:
下面是简单测试后的结果:
而url.txt和urls.txt的内容分别是
url.txt (nginx)
urls.txt (lighttpd)
它们的配置文件如下:
从这里可以简单的看到,nginx的性能比lighttpd真的好一点,不过我发现了几个nginx不足的地方:
1 日志文件过于简单.我刚配置的时候,nginx无法支持php,我查看错误日志,错误日志只显示1051 directory index of "/data/blog/" is forbidden这个信息,并没指出错误所在,这一点就不够lighttpd了。其实nginx的错误日志有几种格式,我试过几个都不行!
2 启动后内存有点大。启动后nginx所占的内存比lighttpd大了快一倍。我想应该是nginx在启动后就加载了所有的模块,而lighttpd对模块的加载是可选的
上面只是我刚开始玩nginx的片面之谈。其实nginx有很多lighttpd无法比拟的地方。
http_load的一些参数:
-parallel/-p N:并发的用户进程数。
-fetches/-f N: 总计的访问次数
-rate/-p N: 每秒的访问频率
-seconds/-s N: 总计的访问时间
下面是简单测试后的结果:
IN[~]>>>http_load -parallel 5 -fetches 1000 url.txt
1000 fetches, 5 max parallel, 3.7365e+07 bytes, in 20.0007 seconds
37365 mean bytes/connection
49.9981 fetches/sec, 1.86818e+06 bytes/sec
msecs/connect: 0.097766 mean, 1.208 max, 0.043 min
msecs/first-response: 0.691867 mean, 2.7 max, 0.443 min
HTTP response codes:
code 200 -- 1000
结果说明:1000 fetches,获得1000个请求,5个并发的进程,20.0007秒内在一共传输了3.7365e+07 bytes。每个进程的传输数据量的大小为37365bytes.每秒有49.9981个请求和1.86818e+06 bytes的数据。每一连接的响应时间为0.097766毫秒,最大响应时间为1.208毫秒,最小响应时间为0.043毫秒。第一次响应时间为0.691867毫秒,最大的响应时间为2.7毫秒,最小的响应时候为0.443毫秒。响应页面的类型是200. 1000请求都为200!
IN[~]>>>http_load -parallel 5 -fetches 1000 urls.txt
1000 fetches, 5 max parallel, 3.7365e+07 bytes, in 39.9998 seconds
37365 mean bytes/connection
25.0001 fetches/sec, 934129 bytes/sec
msecs/connect: 0.129849 mean, 1.714 max, 0.047 min
msecs/first-response: 0.623193 mean, 4.695 max, 0.37 min
HTTP response codes:
code 200 -- 1000
结果说明:1000 fetches,获得1000个请求,5个并发的进程,39.9998秒内在一共传输了3.7365e+07 bytes。每个进程的传输数据量的大小为37365bytes.每秒有25.0001个请求和934129 bytes的数据。每一连接的响应时间为0.129849毫秒,最大响应时间为1.714毫秒,最小响应时间为0.047毫秒。第一次响应时间为0.623193毫秒,最大的响应时间为4.695毫秒,最小的响应时候为0.37毫秒。响应页面的类型是200. 1000请求都为200!
IN[~]>>>http_load -rate 5 -seconds 10 url.txt
49 fetches, 1 max parallel, 1.83088e+06 bytes, in 10.0164 seconds
37365 mean bytes/connection
4.89197 fetches/sec, 182788 bytes/sec
msecs/connect: 0.226449 mean, 0.706 max, 0.179 min
msecs/first-response: 0.233184 mean, 0.786 max, 0.194 min
HTTP response codes:
code 200 -- 49
IN[~]>>>http_load -rate 5 -seconds 10 urls.txt
49 fetches, 1 max parallel, 1.83088e+06 bytes, in 10.0106 seconds
37365 mean bytes/connection
4.8948 fetches/sec, 182894 bytes/sec
msecs/connect: 0.332449 mean, 1.048 max, 0.274 min
msecs/first-response: 0.196571 mean, 0.305 max, 0.167 min
HTTP response codes:
code 200 -- 49
而url.txt和urls.txt的内容分别是
url.txt (nginx)
http://localhost:8080/
urls.txt (lighttpd)
http://localhost/
它们的配置文件如下:
lighttpd1.5
server.modules = (
"mod_access","mod_accesslog" )
server.document-root = "/data/"
server.errorlog = "/var/log/lighttpd.error.log"
index-file.names = ( "index.php", "index.html")
server.pid-file = "/var/run/lighttpd.pid"
server.tag = "Lighttpd"
server.username = "www"
server.groupname = "www"
# mimetype mapping
mimetype.assign = (
,
".gif" => "image/gif",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".dtd" => "text/xml",
".xml" => "text/xml"
)
accesslog.filename = "/var/log/lighttpd.access.log"
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
nginx0.8.49
user www www;
worker_processes 1;
error_log /var/log/nginx.error.log info;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx.access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
location / {
root /data;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}
}
}
从这里可以简单的看到,nginx的性能比lighttpd真的好一点,不过我发现了几个nginx不足的地方:
1 日志文件过于简单.我刚配置的时候,nginx无法支持php,我查看错误日志,错误日志只显示1051 directory index of "/data/blog/" is forbidden这个信息,并没指出错误所在,这一点就不够lighttpd了。其实nginx的错误日志有几种格式,我试过几个都不行!
2 启动后内存有点大。启动后nginx所占的内存比lighttpd大了快一倍。我想应该是nginx在启动后就加载了所有的模块,而lighttpd对模块的加载是可选的
上面只是我刚开始玩nginx的片面之谈。其实nginx有很多lighttpd无法比拟的地方。
2010年9月8日
N900导出短信
在终端里面输入:
在这里可以看到,N900将短信(就是我发出去和收到的)储存在/home/user/.rtcom-eventlogger/el-v1.db这个数据库文件里面。通过sqlite3可以导出这些数据
这样子的导出格式是html格式的,这样方便可以通过浏览器去查看这些信息。
echo "<TABLE>" > /home/user/MyDocs/output.html
sqlite3 -html /home/user/.rtcom-eventlogger/el-v1.db "SELECT start_time,service_id,event_type_id,free_text, remote_uid FROM Events ORDER BY
start_time DESC;" >> /home/user/MyDocs/output.html
echo "</TABLE>" >> /home/user/MyDocs/output.html
在这里可以看到,N900将短信(就是我发出去和收到的)储存在/home/user/.rtcom-eventlogger/el-v1.db这个数据库文件里面。通过sqlite3可以导出这些数据
这样子的导出格式是html格式的,这样方便可以通过浏览器去查看这些信息。
2010年9月3日
varnish函数
下面我是理解的8个函数的用法。varnish是通过这些函数来对数据进行缓存或不缓存的。
Vcl_recl: 将匹配的数据放到varnish中
Vcl_fetch: 后端已获得数据并对其进行处理,并将处理后的数据返回给Browser是的操作。
Vcl_hash: 确定找到request的已使用的哈希key就进行的操作。
Vcl_miss: 当无法在缓存里面找到相应请求,这个就是SA对Varnish的操作,并不在后端和用户的范围内。
Vcl_pass: 将转换为最小的缓存服务不可处理的数据然后调给后端。这样做的原因是为了减轻后端的负担。
Vcl_hit: 在缓存服务器上可以直接找到数据然后就返回给用户,并不需要经过后端。
Vcl_deliver: 在(来自于缓存或后端web服务的)应答对象送到客户端前的操作。
Vcl_pipe: 不经过缓存服务器,直接去到后端让后端进行处理。
Vcl_recl: 将匹配的数据放到varnish中
Vcl_fetch: 后端已获得数据并对其进行处理,并将处理后的数据返回给Browser是的操作。
Vcl_hash: 确定找到request的已使用的哈希key就进行的操作。
Vcl_miss: 当无法在缓存里面找到相应请求,这个就是SA对Varnish的操作,并不在后端和用户的范围内。
Vcl_pass: 将转换为最小的缓存服务不可处理的数据然后调给后端。这样做的原因是为了减轻后端的负担。
Vcl_hit: 在缓存服务器上可以直接找到数据然后就返回给用户,并不需要经过后端。
Vcl_deliver: 在(来自于缓存或后端web服务的)应答对象送到客户端前的操作。
Vcl_pipe: 不经过缓存服务器,直接去到后端让后端进行处理。
订阅:
博文 (Atom)