V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  pymumu  ›  全部回复第 2 页 / 共 3 页
回复总数  59
1  2  3  
2019-04-16 19:00:32 +08:00
回复了 pythonee 创建的主题 iPhone iPhone XR 用了半年,电池健康度 98%,这个正常吗
半年,100%,建议在 20%~ 80%间使用电池,不要一边游戏一边充电,发热很伤电池
2019-04-16 18:40:55 +08:00
回复了 linxiaoziruo 创建的主题 程序员 操作系统是怎么实现 epoll 的?
硬件中断,红黑树
2019-03-13 14:45:43 +08:00
回复了 ryd994 创建的主题 Linux 腾讯分发 TCPA 二进制的行为是否违反 GPL?
内核 api 有不同 license,只要没调用 gpl 接口就可以不开源

可以 modinfo 看一下这个驱动设置的 license,如果不是 GPL,那是不能调用 GPL 接口的
2018-08-03 14:56:36 +08:00
回复了 gleport 创建的主题 分享创造 一种把指定程序的 TCP 流量重定向到代理的方法
ptrace 厉害了,思路清奇,顶一个
@hnes 你总结的没错,ucontext 上下文切换是相对比较耗时的。
posix 移除此接口原因是 makecontext 函数与 ISO C 不兼容,这个两个有差别吗?

c 的协程对编程的要求比较高,如果切换不合理,一不小心性能反而会下降,并且协程如果调用系统调用阻塞了,那整个任务也就挂住了。并且现在多核的情况下,协程并不能有效利用 CPU。

协程的本意是用户态调度,目的是让写代码的人,感知不到切换,也就是一个上下文做一件事情,没有状态,这是对比异步 IO+多路复用来说的。
但我觉得对于高并发程序,还是应该使用异步 IO+多路复用的模式来写,因为底层 API 对异步 IO 已经支持很好了。支持几十万,上百万处理不是问题。

go routine 在这方面其实优化的很好,不仅保证了写代码的便捷,同时保证了性能。

如果这个库能让 C 有类似的能力的话,就很好了。否则也只是特定的业务使用,并且还要小心使用。
这个轮子对比 libc 的 ucontext 协程有什么优势?
2018-04-21 16:40:08 +08:00
回复了 pymumu 创建的主题 C [分享] :自己写的一个 UNIX 系统下的高性能 C/C++日志库
@zhiqiang
1. 动态库的话,直接调用日志接口,由主进程初始化日志模块。应该就没有问题了
2.目前采用的是环形队列,加锁是因为 vsnprintf 在写的时候,在调用 vsnprintf 的时候,实际上是加锁的,因为不知道结束的位置,如果要降低影响,可以搞一个日志队列,比如每个条日志固定最大 1K,缓冲几千条日志记录,应该就可以搞定,缺点就是浪费点内存,锁的话,就只锁队列添加、删除的时候了,这样就能满足业务要求了。
3.可以用宏封装,如下。
#define log_info(format, ...) tlog_ext(TLOG_INFO, BASE_FILE_NAME, __LINE__, __func__, 0, format, ##__VA_ARGS__)
2018-04-21 14:20:52 +08:00
回复了 pymumu 创建的主题 C [分享] :自己写的一个 UNIX 系统下的高性能 C/C++日志库
@fakevam
pthread_at_fork 这个只能进程本身去处理。组件的话,没法处理。多线程的进程,用 fork 后还调用原进程接口。这个本身就是危险的。对应的 malloc,也有问题,对吗。

spinlock 那个,这个组件里面,没有用汇编,用汇编的话,就依赖硬件了。用的只是 gcc 的原子变量接口。先比 linux 内核,确实少了 nop 指令。之前用 gcc 接口的时候,也考虑过,所以代码里面时调用了 sched_yied()接口的。当然,这种改法确实没有大规模验证过

调用 localtime_r 这个修改是因为性能问题,这里现在实际上是没有问题的,因为这个函数外面是有一把 mutex 锁的。
性能是有一些影响,但考虑实际日志 20 万条,足够了,当前也就没有深入优化。

后面会继续优化。

TLS 也是解决办法,但 TLS 方案不一定比这个方案好。
因为,TLS 每个线程都要有缓冲区,日志线程写日志时,要遍历所有线程的 TLS 缓冲区。实现不会比这个高效。

总之,你提的意见都比较好,应该是高手了。你的建议我会考虑如何优化的。
2018-04-21 14:02:48 +08:00
回复了 pymumu 创建的主题 C [分享] :自己写的一个 UNIX 系统下的高性能 C/C++日志库
2018-04-21 13:15:29 +08:00
回复了 pymumu 创建的主题 C [分享] :自己写的一个 UNIX 系统下的高性能 C/C++日志库
@hilow
你说的这个 4K 是 libc 的机制,也就是依赖这个 4K 的话,只要单次写入大于 4K,日志就会拆分。这样是会混乱的。
并且多个文件并发写同一个文件是有会打印混乱的。

看了下 Linux 内核代码,sys_write 的调用,写时,对 inode 是加了锁的(调用__generic_file_aio_write 的时候)。所以用 append 模式写文件,能保证原子,tlog 日志模块每次写都是保证日志完整的。
在加上内核的这个锁,所以,tlog 日志并发写是没有问题的。你用 printf 写的话,是会有日志混乱的情况的。

ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
unsigned long nr_segs, loff_t pos)
{
struct file *file = iocb->ki_filp;
struct inode *inode = file->f_mapping->host;
ssize_t ret;

BUG_ON(iocb->ki_pos != pos);

mutex_lock(&inode->i_mutex); 《==此处对 inode 加锁。
ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos);
mutex_unlock(&inode->i_mutex);

if (ret > 0 || ret == -EIOCBQUEUED) {
ssize_t err;

err = generic_write_sync(file, pos, ret);
if (err < 0 && ret > 0)
ret = err;
}
return ret;
}
EXPORT_SYMBOL(generic_file_aio_write);
2018-04-21 09:19:53 +08:00
回复了 pymumu 创建的主题 C [分享] :自己写的一个 UNIX 系统下的高性能 C/C++日志库
@hilow
fprintf 直接写文件的话,遇到\n,或满 4k 的话,都会写盘的,并且硬盘繁忙的话,就会阻塞了,另外还有日志归档能力,自己写日志组件也不是没有意义的
2018-04-21 08:44:26 +08:00
回复了 pymumu 创建的主题 C [分享] :自己写的一个 UNIX 系统下的高性能 C/C++日志库
@hilow
syslog 是个很好的日志组件,个人感觉适合记录量不大的日志,没见过大型后台服务直接写 syslog 的,或者有使用经验的话,也可以分享
appen 原子性,我在看看内核代码
2018-04-21 08:10:14 +08:00
回复了 pymumu 创建的主题 C [分享] :自己写的一个 UNIX 系统下的高性能 C/C++日志库
@fakevam
厉害,提到的问题都很好。
1. 对于 fork 场景,只要多线程的进程,fork 一般都有问题,因为 fork 的是当前线程,内存又一样,fork 后如果调用原带锁的接口,极大概率死锁,大部分函数,包括 malloc,都是 fork-unsafe 的。所以目前,日志模块也并不支持 fork 出两个一模一样的带日志功能的进程。后面看看有什么好的办法,或者有什么好的建议。
2.这里多进程指的是通过 execve 启动的进程,进程间用文件锁互斥归档,open 的时候带 O_APPEND 并行写入。
3.spinlock 是比较简单,实现不公平,可能会饿死某些线程。单其实,tlog 格式化函数是有 mutex 锁的,这个 spinlock 其实没有意义。只是从接口完整性来讲,用 spinlock 保护了一下。另外,macOS 没有 pthread_spin_lock 锁,要不然就直接用了,不会自己写。后面优化。
4.自己没看到问题,spinlock 锁的时候,只有赋值的时候,其他调用 API 时是解锁的,还请指点一下。
2018-04-20 22:29:36 +08:00
回复了 pymumu 创建的主题 C [分享] :自己写的一个 UNIX 系统下的高性能 C/C++日志库
@pkookp8
@neighbads
理论上,是存在日志互相串的。在 Linux 系统,fprintf 类是由缓冲的,一般这类函数在遇到\n 才刷盘的。
如果一次 fprintf 分了两次调用 write 写磁盘,那日志就会被拆分了。

可以加大日志量,就会高概率出现了。

另外,open 的时候,带 O_APPEND 标志,Linux 内核在 write 文件时,会保证原子性。
也是基于这个原理。我写的日志模块,可以支持多进程并发写同一个文件,并保证日志不会中间截断。
2018-04-20 22:24:15 +08:00
回复了 pymumu 创建的主题 C [分享] :自己写的一个 UNIX 系统下的高性能 C/C++日志库
@changnet
主线程处理业务就好,日志的管理由日志线程处理,日志毕竟优先级比较低,不能影响业务。
日志一般要写磁盘的,并且还要压缩归档,如果磁盘繁忙,主线程不能因为磁盘忙阻塞的。所以需要异步日志。
当异步模式日志缓冲区满时,就丢弃日志,保证业务。(当然是可以配置的,可以选择阻塞,不丢日志)

正式上述原因,自己写了异步日志,上述代码已经在生产环境使用了,可以放心复用。
2018-04-07 18:39:20 +08:00
回复了 kslr 创建的主题 Go 编程语言 Go 的性能真是高到爆炸,不过快速增长也带来了一些问题
我看成每秒 60 万了,每天 60 万,也太少了。
2018-04-02 22:10:41 +08:00
回复了 gdtv 创建的主题 分享发现 百度翻译:华为手机用起来很卡 -> HUAWEI phone is used very well
卡=> very well  (笑)
2018-04-02 22:09:28 +08:00
回复了 xiaochengxu 创建的主题 分享发现 额,国外难读“huawei”华为要改名为‘wahway’??
who are we
2018-04-02 22:06:48 +08:00
回复了 golangsite 创建的主题 Java 有什么小巧的 Key-Value 源码吗, Java 写的?
hashmap?
2018-02-06 09:38:56 +08:00
回复了 a752252255 创建的主题 Android 华为屏蔽 google play?
@pymumu 不是梯子的问题,是因为国产手机中有 /system/emui/permission/services.cn.google.xml 文件。
文件里的存在,会导致手机下载程序的时候去访问 google.cn 的服务器,google.cn 估计最近把什么东西移走了。
然后大家就 404 了

解决方法,就是 root 手机,把这个文件删掉。
1  2  3  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3607 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 27ms · UTC 11:10 · PVG 19:10 · LAX 03:10 · JFK 06:10
Developed with CodeLauncher
♥ Do have faith in what you're doing.